維護(hù)之夜,說點(diǎn)故事和經(jīng)驗(yàn)
人內(nèi)心的默契就是這樣,今天要寫的標(biāo)題和幾年前一模一樣,干脆在原來的基礎(chǔ)上做一些補(bǔ)充。
今晚是一個(gè)維護(hù)之夜,出于蓄勢(shì)待發(fā)狀態(tài),對(duì)于我來說,每到這個(gè)時(shí)候就會(huì)想起自己這些年熬的那些夜,還是蠻難忘的。
舉幾個(gè)自己印象深刻的維護(hù)之夜吧。
1)印象最深刻,壓力最大的維護(hù)是多套Oracle數(shù)據(jù)庫從10g升級(jí)到11g,在前期做了多輪測(cè)試,在實(shí)際操作還是碰到了不少ORA-00600的錯(cuò)誤,不過前期的問題都成功化解,而在最后啟動(dòng)服務(wù)的關(guān)頭,服務(wù)拋出了一個(gè)奇怪的錯(cuò)誤,記得當(dāng)時(shí)情況已經(jīng)很緊急了,如果修復(fù)不了,所有的服務(wù)都要回退,當(dāng)時(shí)是滿世界的打電話求救,喚醒了全球的多個(gè)技術(shù)專家,有的定位是bug,然后在建議之下打了補(bǔ)丁,但是還是沒有效果,還找了國(guó)內(nèi)的一個(gè)前輩幫忙分析問題,最后戲劇性的是,修復(fù)的操作竟然是重新清空一下回收站,具體細(xì)節(jié)忘記了,但是這個(gè)神一樣的操作讓我們和原廠都感嘆不已,因?yàn)樵诋?dāng)時(shí)原廠已經(jīng)緊急開了case。
接下來的第二波壓力是關(guān)于業(yè)務(wù)異常,有些業(yè)務(wù)存在連接異常,導(dǎo)致數(shù)據(jù)庫開啟了5000連接依然連接池溢出,在這種情況下發(fā)揮了我的開發(fā)技能,快速寫了釋放連接的腳本,同時(shí)開始了代碼分析,因?yàn)槲矣虚_發(fā)的代碼權(quán)限,所以我從代碼層面去做一些分析,沒想到竟然很快找到了導(dǎo)致連接異常的代碼片段,當(dāng)發(fā)給泰國(guó)的開發(fā)團(tuán)隊(duì)時(shí),他們還是很吃驚的。
2)有一次大型維護(hù)的時(shí)候,登錄了一套準(zhǔn)生產(chǎn)測(cè)試環(huán)境,做了下業(yè)務(wù)變更升級(jí),沒想到線上和測(cè)試環(huán)境的模板配置不一樣,結(jié)果就想當(dāng)然在線上環(huán)境點(diǎn)擊了YES開始自動(dòng)升級(jí),沒想到整個(gè)線上環(huán)境開始了一系列的不可控操作,于是乎整個(gè)業(yè)務(wù)系統(tǒng)全服回退,這個(gè)事情對(duì)我們?cè)斐闪撕苌羁痰慕逃?xùn),而我內(nèi)心也是很煎熬的,在幾個(gè)月的時(shí)間里都心神不寧。
3)在國(guó)內(nèi)的一次大型維護(hù),想想都是滿滿的使命感,差不多有13套環(huán)境是在1個(gè)多小時(shí)內(nèi)完成,有切換的數(shù)據(jù)庫,有做數(shù)據(jù)庫升級(jí)的數(shù)據(jù)庫,有做跨平臺(tái)遷移的數(shù)據(jù)庫,沒想到預(yù)估的3個(gè)半小時(shí)結(jié)果在1個(gè)小時(shí)以內(nèi)就全部完成了。
但是戲劇性的一幕發(fā)生了,開服的時(shí)候,發(fā)現(xiàn)用戶充值失敗,結(jié)果留給我們的時(shí)間就很短了。當(dāng)時(shí)記得氣氛很緊張,領(lǐng)導(dǎo)拍板,如果10分鐘內(nèi)解決不了,就全服回退。當(dāng)時(shí)看著同事在那里手工敲一些系統(tǒng)命令,帶著壓力還多次敲錯(cuò),我趕緊在另一半開始拿出自己準(zhǔn)備的腳本開始快速排查,所幸的是在最后的關(guān)頭,定位到了問題,是一個(gè)db link的問題,本質(zhì)上還是多套環(huán)境的關(guān)聯(lián)變更導(dǎo)致,修復(fù)之后大家長(zhǎng)舒了一口氣。
4)最無聊的一次維護(hù),就是在某國(guó)內(nèi)客戶現(xiàn)場(chǎng)值班,被抓壯丁安排去值班,主要就是過去充人數(shù),記得自己在椅子上擺了各種姿勢(shì)睡都不舒服,看著旁邊的外國(guó)小哥估計(jì)還沒有倒過來時(shí)差,他們?cè)谀抢锟础栋⒎策_(dá)》,后來才知道他們是特派過來的DBA,系統(tǒng)遷移之后,他們負(fù)責(zé)清理數(shù)據(jù)。
5)最帶感的一次維護(hù),是在一次大型遷移中,出現(xiàn)了性能瓶頸,導(dǎo)致服務(wù)回退,后來大家壓力都很大,因?yàn)槭且惶兹碌募夹g(shù)方案,也是在原來方案無法滿足要求的前提下的改進(jìn),當(dāng)然也受到了很多原廠的質(zhì)疑,在壓力中我們開始了地毯式排除測(cè)試,記得連續(xù)幾天都是測(cè)試到后半夜,而在最后定位到問題之后,自己心里的疙瘩算是解除了,而在第二次升級(jí)的時(shí)候,記得客戶的大boss也過來了,走進(jìn)作戰(zhàn)室看到一切都很順暢,在第二天還發(fā)了表揚(yáng)信。
6)這一次可能是很有特點(diǎn)的維護(hù),如何擺脫常規(guī)的數(shù)據(jù)庫維護(hù)影響,比如數(shù)據(jù)庫需要重啟,可能重啟的操作需要15秒~1分鐘,如何讓業(yè)務(wù)的影響降低到2秒內(nèi)即可恢復(fù)??雌饋砗芷胀ǖ男枨笕绾魏蜆I(yè)務(wù)密切配合來改進(jìn),對(duì)于運(yùn)維同學(xué)來說,這種維護(hù)的意義是很特別的。
7)2年前的那次維護(hù)算是在公司內(nèi)的一次練兵,算是MySQL方向的一次核心系統(tǒng)的切換,后端的運(yùn)維操作是因?yàn)閿?shù)據(jù)庫bug需要重啟實(shí)例,在方案設(shè)計(jì)上實(shí)現(xiàn)了整個(gè)集群的切換控制在5秒之內(nèi),過程都是有條不紊,可以用完滿來解讀。
除此之外,維護(hù)時(shí)間網(wǎng)絡(luò)故障,DDL(rename操作)無法變更,業(yè)務(wù)腳本執(zhí)行失敗,服務(wù)啟動(dòng)失敗,連接池異常等問題,數(shù)不勝數(shù),這些都是平靜表象下的風(fēng)波。
當(dāng)然在這之外也有幾點(diǎn)老司機(jī)的告誡和建議:
1)維護(hù)時(shí)打開盡可能少的工作窗口,越是關(guān)鍵的操作,打開的窗口數(shù)量越要謹(jǐn)慎,這么考慮的一些因素主要還是跳轉(zhuǎn)到錯(cuò)誤的窗口,我一般建議是打開4個(gè)以內(nèi)的窗口,而且最好是對(duì)稱的模式,方便標(biāo)記和辨別。
2)做好配置文件的備份,備份的工作在這里是重中之重,之前還碰到過一次服務(wù)異常導(dǎo)致中間件文件被刷的情況,所以有了備份才是救命稻草,另外有些備份需要注意不能太過于頻繁,盡量不要提前很多,最好是備份操作和后續(xù)的流程都是一個(gè)人能夠銜接起來,要不文件命名和備份細(xì)節(jié)會(huì)存在差異,這種差異很要命。
3)保持體力,在維護(hù)前的夜晚是很平靜的,最好提前做好休息和能量補(bǔ)充,這個(gè)時(shí)候以能夠休息保持體力為前提,盡量不要干坐在座位等到凌晨。
4)盡可能做到雙人檢查,凌晨的操作,如果很多同學(xué)實(shí)踐過,會(huì)發(fā)現(xiàn)腦子不夠使,有時(shí)候看到自己列的計(jì)劃都感覺有些懵,所以計(jì)劃內(nèi)容要細(xì),要明確,有些描述信息的描述就要增加的清晰準(zhǔn)確,比如中間件的負(fù)載均衡,有一個(gè)操作步驟是把proxy3的服務(wù)做下變更,在這里最好把相應(yīng)的服務(wù)IP端口之類的都給清晰,到了凌晨的時(shí)候再去找,去確認(rèn)是很危險(xiǎn)的,當(dāng)然最怕的還是自己感覺,憑猜千萬不可取。兩個(gè)人能夠做下檢查,至少在關(guān)鍵操作的時(shí)候有個(gè)照應(yīng)。
5) 對(duì)于不確定的操作,不要直接按回車,如果命令行窗口卡住或者是不確定的時(shí)候,不要先按回車,因?yàn)槟悴恢郎弦粋€(gè)命令是不是具有破壞力,或者是屏幕處于鎖屏狀態(tài),良好的職業(yè)習(xí)慣應(yīng)該是先按空格而不是回車。
6)通常維護(hù)操作是比較平穩(wěn)的,但是一旦發(fā)生問題,那就是緊急且重要的,這種情況下一定要沉住氣,同時(shí)也要做好最壞的打算和預(yù)案。
7)大維護(hù)變更前不接受額外的變更需求,這個(gè)舉一個(gè)例子,在一次大維護(hù)前2小時(shí),開發(fā)團(tuán)隊(duì)提交了一個(gè)緊急修復(fù),當(dāng)時(shí)沒有在生產(chǎn)完整的測(cè)試就匆匆列入了維護(hù)清單,結(jié)果整個(gè)維護(hù)中最讓人頭痛的就是那個(gè)新增變更,新增的存儲(chǔ)過程執(zhí)行了2個(gè)小時(shí),而在這2個(gè)小時(shí)內(nèi)我們想了無數(shù)的補(bǔ)救方案,而事后的分析和優(yōu)化方案可以把這個(gè)邏輯優(yōu)化到1分鐘以內(nèi)。所以按照維護(hù)流程,我們有足夠多的理由可以拒絕這種加塞需求。
8)儀式感是我認(rèn)為自己在大維護(hù)中最最重要的一個(gè)環(huán)節(jié)了,有多重要呢,我覺得準(zhǔn)備工作做到萬事俱備只欠東風(fēng)的狀態(tài),那么剩下的只能靠運(yùn)氣了。而這個(gè)運(yùn)氣就需要自己的一種儀式感或者默認(rèn)的習(xí)慣規(guī)則。我在大維護(hù)的時(shí)候會(huì)去買一瓶飲料,哪怕不喝也會(huì)備著,這是在早些年維護(hù)中自己的一點(diǎn)潛意識(shí)暗示或者說是必備的一種儀式。
當(dāng)然大多數(shù)的維護(hù)都是默默無聞的,一切正常就是最好的回答。我喜歡平靜夜晚后的清晨,陽光照進(jìn)來,感覺一切都敞亮了。
本文轉(zhuǎn)載自微信公眾號(hào)「楊建榮的學(xué)習(xí)筆記」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系楊建榮的學(xué)習(xí)筆記公眾號(hào)。