一次網站遷移故障及分析

51CTO發表於2014-11-13

公司運營專案遷移,這個專案最重要的就是充值和讓玩家能玩遊戲,還有後臺統計,就是類似支付寶這樣的第三方平臺的支付工具,由於涉及的到錢,所以上個月就做好遷移的準備,將程式碼和資料庫都已轉移完畢,並提交運營那邊測試,最後跟運營討論說凌晨0點充值的人最少,開始切域名,考慮到切換DNS後無法立即生效,所以做了301跳轉,整個遷移流程是:

1.暫停原伺服器資料庫,匯出相關資料庫

2.將匯出的資料庫同步到杭州xx伺服器上面並匯入到資料庫中

3.切換域名指向到xx伺服器

4.原伺服器上面做301跳轉到xx伺服器(保證不寫入新資料到原運營伺服器上面)

5.運營協助測試新伺服器資料是否正常

按照上面的流程操作,結果出現了很多意想不到的問題,因為這次遷移的LNMP環境不同,特別的是資料庫,以前用的是Ver 14.14 Distrib 5.1.60,新伺服器用的是Ver 14.14 Distrib 5.6.16,還有一個mysql的主輔同步,做了過濾,只同步了某些表,當時凌晨遷移,將最新的資料再次匯入新伺服器mysql,由於版本的問題,發現有個mysql儲存過程無法匯入,還有預設值問題,如下圖:預設值要改為”NULL”,不能是”無”,原mysql中還有些定時任務無法匯出,只能重新建立了。

wKioL1RgIQCypKaRAADnLKibCSI525.jpg

好了,解決了上面的問題,重新做了mysql主輔同步和過濾,當時測試也是正常的,結果第二天早上8點半使用者流量過來了,網站都打不開了,首先檢視了php日誌,出現下面這個問題:

wKiom1RgIX7QK9iWAAMJY17ZGUs576.jpg然後不斷的修改下面的引數,感覺調到2048後已經是臨界值了,因為這臺機器只有8G記憶體,max_children = 2048後發現記憶體基本滿了,在調高可能記憶體就爆了,當時調整php後發現可以短時間的正常訪問,功能也正常,但是過了10分鐘左右,又出現訪問很慢的問題,繼續看php日誌,還是上圖的提示,感覺這個不是php的問題,因為這個網站原伺服器沒有開啟這麼多php程式,但是執行正常,整個站的出口流量也不大。

wKiom1RgId3QbEvxAAETcEKJZrc924.jpg

綜上分析,發現應該是php連線mysql出現了堵塞,導致php程式一直在排隊,當新的請求過來後,由於其他的php程式都在排隊,只能在開啟新的php程式,php程式永遠提示繁忙,不夠用,要調整max_children值,於是就看mysql是不是有問題?

進mysql,show processlist檢視mysql的全部的執行緒,發現pay庫裡面有張uc_members表大量lock,

wKioL1RgJg-gvdZlAAPbC55JhBc254.jpg

大量的鎖表,詢問開發這張表是使用者表,也就是使用者每次登入都要查詢這張表,這下終於找到原因了,就是php執行使用者登入的時候,要讀取mysql中這張uc_members表,每個使用者登入都要鎖表然後查詢使用者登入資訊,導致這張表一直處於被鎖死的狀態,隨著使用者請求越來越多,php程式也增多,一直等待mysql返回使用者登入資訊,但是mysql一直處於鎖表狀態,結果就導致了這種現象,php程式卡死,使用者無法登入,網站最後也打不開。

檢視這張表用的是MyISAM的引擎:

wKiom1RgJ67Al7UvAACMsXKr1wc834.jpg

MyISAM引擎是表級鎖,更換為InnoDB引擎為行級鎖,再次show processlist發現鎖表大量減少,頁面可以正常開啟,使用者也可以登入了,問題解決。

InnoDB與Myisam的六大區別:

wKiom1RgKzyhnkeWAAKESjE-BRk751.jpg

參考:http://www.ha97.com/4197.html

總結:

已經建議開發部門,以後開發程式不要再mysql裡面寫定時任務,因為mysql裡面寫定時任務,執行成功與否很難看到,遷移mysql的時候也會很麻煩,可以寫crontab讓php去執行定時任務即可,還有儲存過程,如果一定需要在mysql裡面寫儲存過程,儘量要規範,防止以後遷移由於mysql版本問題導致很多奇怪的現象。

出現這次故障主要是事先沒有做壓力測試,只是做了網站基本功能的測試,下次遷移網站之前一定要做好壓力測試,使用者登入測試及回滾方案,一個完整的遷移流程應該是:

1.暫停原伺服器資料庫,匯出相關資料庫

2.將匯出的資料庫同步到杭州xx伺服器上面並匯入到資料庫中

3.對xx伺服器進行壓力測試及使用者登入測試

4.回滾方案,出現問題及時回滾到原伺服器,保證使用者正常訪問

5.切換域名指向到xx伺服器

6.原伺服器上面做301跳轉到xx伺服器(保證不寫入新資料到原運營伺服器上面)

7.運營協助測試新伺服器資料是否正常

相關文章