周末把雲數據庫RDS進行了配置升級,上面的一些站點數據表從MyISAM轉為了InnoDB,今天早上來發現IOPS異常升高,網站打開困難,查看實時實例會話,發現有很多這樣的語句堆積:
SELECT COUNT(pid) FROM url_alias
在Google中搜索了一下,這篇文章說明很多人也遇到過這種問題COUNT(*) is an expensive query in InnoDB.,Drupal 6默認的數據庫表引擎是MyISAM,上面那句統計數量的查詢語句瞬間可以執行完,但對InnoDB引擎來說需要全表掃描來獲得統計數據,當我們網站的頁面數量衆多的時候,就非常消耗數據庫服務器的資源。而Pressflow版本就針對性解決了這樣的問題:What makes Pressflow scale: #1 faster core queries,而Drupal 7的默認引擎是InnoDB,應該也不存在這樣的問題。
本來想把涉及到的url_alias表轉回MyISAM的,但阿裡雲RDS現在弱化對MyISAM的支持、已經禁止轉為MyISAM了,隻要設法修改Drupal程序來解決。就用開始那篇文章中說到的一個Patch補丁196862-expensive-count-query-range-all-127.patch,打上該補丁(辦法參看 Patch Apply),就可以發現RDS的負載立馬就下降了很多。
随着Drupal 8正式版推出的逐漸接近,Drupal 6的淘汰是必然趨勢,我們還有一些以前用Drupal 6開發的網站,都面臨各種問題(例如對InnoDB的支持、對PHP高版本的支持等),準備近期安排時間專門來進行到Drupal 7的升級工作。
最近将國内托管的服務器轉向阿裡雲,其中部分drupal 6版本的站點搬遷後,再次遇到innodb數據庫使rds負載iops異常升高的問題,進行上面的修改後可以緩解。将打補丁的辦法再次記錄一下:
cd /alidata/www/drupal6_path/ wget https://www.drupal.org/files/196862-expensive-count-query-range-all-127.patch patch -p1 < 196862-expensive-count-query-range-all-127.patch
打補丁的過程會顯示出來:
patching file includes/locale.inc Reversed (or previously applied) patch detected! Assume -R? [n] Apply anyway? [n] y Hunk #1 FAILED at 289. 1 out of 1 hunk FAILED -- saving rejects to file includes/locale.inc.rej patching file includes/path.inc Reversed (or previously applied) patch detected! Assume -R? [n] y patching file modules/book/book.install patching file modules/menu/menu.admin.inc patching file modules/node/node.admin.inc patching file modules/node/node.module Hunk #1 succeeded at 490 (offset 7 lines). Hunk #2 succeeded at 2182 (offset 7 lines). Hunk #3 succeeded at 2740 (offset 7 lines). patching file modules/path/path.admin.inc patching file modules/path/path.module Hunk #1 succeeded at 180 (offset 42 lines). patching file modules/ping/ping.module patching file modules/profile/profile.module patching file modules/profile/profile.pages.inc patching file modules/system/system.module Hunk #2 succeeded at 1079 (offset 30 lines). patching file modules/user/user.admin.inc Hunk #1 succeeded at 683 (offset 15 lines). patching file modules/user/user.module Hunk #1 succeeded at 1639 (offset 47 lines). Hunk #2 succeeded at 1651 (offset 47 lines).
注意不要重複運行,否則會提示已經打過補丁了:
Reversed (or previously applied) patch detected! Assume -R? [n] R Apply anyway? [n] n
2015年10月20日補充:一段時間以來發現有的阿裡雲RDS數據庫服務器IOPS很高,今天檢查,正好是從我們某次升級Drupal 6網站後開始的,再仔細看是升級後沒有重新進行打補丁的操作,從而讓程序恢複對innodb的統計操作造成服務器負載高,重新打補丁後正常。
以後再在Drupal 6版本升級還要記得打這個補丁。或者以後還是盡快都設法升級到Drupal 7。
评论