公司運營項目遷移,這個項目最重要的就是充值和讓玩家能玩游戲,還有后臺統(tǒng)計,就是類似支付寶這樣的第三方平臺的支付工具,由于涉及的到錢,所以上個月就做好遷移的準(zhǔn)備,將代碼和數(shù)據(jù)庫都已轉(zhuǎn)移完畢,并提交運營那邊測試,最后跟運營討論說凌晨0點充值的人最少,開始切域名,考慮到切換DNS后無法立即生效,所以做了301跳轉(zhuǎn),整個遷移流程是:

1.暫停原服務(wù)器數(shù)據(jù)庫,導(dǎo)出相關(guān)數(shù)據(jù)庫

2.將導(dǎo)出的數(shù)據(jù)庫同步到杭州xx服務(wù)器上面并導(dǎo)入到數(shù)據(jù)庫中

3.切換域名指向到xx服務(wù)器

4.原服務(wù)器上面做301跳轉(zhuǎn)到xx服務(wù)器(保證不寫入新數(shù)據(jù)到原運營服務(wù)器上面)

5.運營協(xié)助測試新服務(wù)器數(shù)據(jù)是否正常

按照上面的流程操作,結(jié)果出現(xiàn)了很多意想不到的問題,因為這次遷移的LNMP環(huán)境不同,特別的是數(shù)據(jù)庫,以前用的是Ver 14.14 Distrib 5.1.60,新服務(wù)器用的是Ver 14.14 Distrib 5.6.16,還有一個mysql的主輔同步,做了過濾,只同步了某些表,當(dāng)時凌晨遷移,將最新的數(shù)據(jù)再次導(dǎo)入新服務(wù)器mysql,由于版本的問題,發(fā)現(xiàn)有個mysql存儲過程無法導(dǎo)入,還有默認(rèn)值問題,如下圖:默認(rèn)值要改為”NULL”,不能是”無”,原mysql中還有些定時任務(wù)無法導(dǎo)出,只能重新創(chuàng)建了。

wKioL1RgIQCypKaRAADnLKibCSI525.jpg

好了,解決了上面的問題,重新做了mysql主輔同步和過濾,當(dāng)時測試也是正常的,結(jié)果第二天早上8點半用戶流量過來了,網(wǎng)站都打不開了,首先查看了php日志,出現(xiàn)下面這個問題:

wKiom1RgIX7QK9iWAAMJY17ZGUs576.jpg

然后不斷的修改下面的參數(shù),感覺調(diào)到2048后已經(jīng)是臨界值了,因為這臺機器只有8G內(nèi)存,max_children = 2048后發(fā)現(xiàn)內(nèi)存基本滿了,在調(diào)高可能內(nèi)存就爆了,當(dāng)時調(diào)整php后發(fā)現(xiàn)可以短時間的正常訪問,功能也正常,但是過了10分鐘左右,又出現(xiàn)訪問很慢的問題,繼續(xù)看php日志,還是上圖的提示,感覺這個不是php的問題,因為這個網(wǎng)站原服務(wù)器沒有開啟這么多php進程,但是運行正常,整個站的出口流量也不大。

wKiom1RgId3QbEvxAAETcEKJZrc924.jpg

綜上分析,發(fā)現(xiàn)應(yīng)該是php連接mysql出現(xiàn)了堵塞,導(dǎo)致php進程一直在排隊,當(dāng)新的請求過來后,由于其他的php進程都在排隊,只能在開啟新的php進程,php進程永遠提示繁忙,不夠用,要調(diào)整max_children值,于是就看mysql是不是有問題?

進mysql,show processlist查看mysql的全部的線程,發(fā)現(xiàn)pay庫里面有張uc_members表大量lock,

wKioL1RgJg-gvdZlAAPbC55JhBc254.jpg

大量的鎖表,詢問開發(fā)這張表是用戶表,也就是用戶每次登錄都要查詢這張表,這下終于找到原因了,就是php執(zhí)行用戶登錄的時候,要讀取mysql中這張uc_members表,每個用戶登錄都要鎖表然后查詢用戶登錄信息,導(dǎo)致這張表一直處于被鎖死的狀態(tài),隨著用戶請求越來越多,php進程也增多,一直等待mysql返回用戶登錄信息,但是mysql一直處于鎖表狀態(tài),結(jié)果就導(dǎo)致了這種現(xiàn)象,php進程卡死,用戶無法登錄,網(wǎng)站最后也打不開。

查看這張表用的是MyISAM的引擎:

wKiom1RgJ67Al7UvAACMsXKr1wc834.jpg

MyISAM引擎是表級鎖,更換為InnoDB引擎為行級鎖,再次show processlist發(fā)現(xiàn)鎖表大量減少,頁面可以正常打開,用戶也可以登錄了,問題解決。

InnoDB與Myisam的六大區(qū)別:

wKiom1RgKzyhnkeWAAKESjE-BRk751.jpg

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

總結(jié):

已經(jīng)建議開發(fā)部門,以后開發(fā)程序不要再mysql里面寫定時任務(wù),因為mysql里面寫定時任務(wù),執(zhí)行成功與否很難看到,遷移mysql的時候也會很麻煩,可以寫crontab讓php去執(zhí)行定時任務(wù)即可,還有存儲過程,如果一定需要在mysql里面寫存儲過程,盡量要規(guī)范,防止以后遷移由于mysql版本問題導(dǎo)致很多奇怪的現(xiàn)象。

出現(xiàn)這次故障主要是事先沒有做壓力測試,只是做了網(wǎng)站基本功能的測試,下次遷移網(wǎng)站之前一定要做好壓力測試,用戶登錄測試及回滾方案,一個完整的遷移流程應(yīng)該是:

1.暫停原服務(wù)器數(shù)據(jù)庫,導(dǎo)出相關(guān)數(shù)據(jù)庫

2.將導(dǎo)出的數(shù)據(jù)庫同步到杭州xx服務(wù)器上面并導(dǎo)入到數(shù)據(jù)庫中

3.對xx服務(wù)器進行壓力測試及用戶登錄測試

4.回滾方案,出現(xiàn)問題及時回滾到原服務(wù)器,保證用戶正常訪問

5.切換域名指向到xx服務(wù)器

6.原服務(wù)器上面做301跳轉(zhuǎn)到xx服務(wù)器(保證不寫入新數(shù)據(jù)到原運營服務(wù)器上面)

7.運營協(xié)助測試新服務(wù)器數(shù)據(jù)是否正常

  哈爾濱品用軟件有限公司致力于為哈爾濱的中小企業(yè)制作大氣、美觀的優(yōu)秀網(wǎng)站,并且能夠搭建符合百度排名規(guī)范的網(wǎng)站基底,使您的網(wǎng)站無需額外費用,即可穩(wěn)步提升排名至首頁。歡迎體驗最佳的哈爾濱網(wǎng)站建設(shè)。