中國(guó)IT史上兩大嚴(yán)重事故對(duì)我們的警醒及預(yù)防措施
一,歷史回顧:20150528攜程運(yùn)維大事故
2015年5月28日上午11點(diǎn)開始,攜程旅行網(wǎng)官方網(wǎng)站突然顯示404錯(cuò)誤頁(yè),App也無法使用,業(yè)務(wù)徹底中斷。
據(jù)稱是因?yàn)闉踉凭W(wǎng)公布了攜程的一個(gè)漏洞“攜程旅游網(wǎng)服務(wù)器配置不當(dāng)可導(dǎo)致官方郵件劫持”,攜程修復(fù)后當(dāng)天準(zhǔn)備上線發(fā)布,但運(yùn)維自動(dòng)化系統(tǒng)有問題或者運(yùn)維操作有問題,導(dǎo)致“發(fā)布不上去了,剛發(fā)就(根目錄包括代碼)被(物理)刪”,雖然數(shù)據(jù)庫(kù)還在,但應(yīng)用都被刪了,業(yè)務(wù)遲遲無法恢復(fù)。
當(dāng)日下午,攜程一度將流量切給了藝龍,但藝龍承受不了而雪崩宕機(jī)。
當(dāng)晚19時(shí)許,離宕機(jī)過去8個(gè)小時(shí)后,攜程旅行網(wǎng)手機(jī)APP首先恢復(fù),但是提交訂單仍然不穩(wěn)定。
當(dāng)晚22:45,攜程服務(wù)全面恢復(fù),至此,停服整整12個(gè)小時(shí)。
二,攜程事故之后我們做了什么,***落實(shí)了什么
當(dāng)時(shí)我提出在Business Continuity Plan(BCP,業(yè)務(wù)持續(xù)計(jì)劃)之外盡快落實(shí)Disaster Recovery Plan(DRP,災(zāi)難恢復(fù)計(jì)劃)。
DCP的目標(biāo)是:
-
當(dāng)IDC機(jī)房物理無法連接時(shí),可快速異地重建生產(chǎn)系統(tǒng)。
它分為兩個(gè)層級(jí):
-
代碼和配置的災(zāi)難可恢復(fù)性;
-
數(shù)據(jù)的災(zāi)難可恢復(fù)性。
時(shí)至今日其實(shí)通過以下做法間接達(dá)到了DCP的目標(biāo):
-
代碼和配置的災(zāi)難可恢復(fù)性:
-
Docker鏡像:Web容器的配置都在Docker容器鏡像里;
-
私有分布式鏡像倉(cāng)庫(kù),能夠做到在混合云多機(jī)房各處都有自動(dòng)同步的鏡像庫(kù);
-
異地雙活機(jī)制等于說異地備份了Nginx/DNS等服務(wù)配置信息;
-
CloudEngine(我們的研發(fā)協(xié)作平臺(tái))里保存了各種工程在不同環(huán)境里的應(yīng)用屬性(也是配置信息);
-
-
數(shù)據(jù)的災(zāi)難可恢復(fù)性:
-
異地備份:在iDB(我們的數(shù)據(jù)庫(kù)自動(dòng)化運(yùn)維平臺(tái))的幫助下有數(shù)據(jù)庫(kù)自動(dòng)備份以及備份的可恢復(fù)性自動(dòng)檢查,并且做了異地備份;
-
異地雙活機(jī)制等于說異地同步了全量數(shù)據(jù)庫(kù)。
-
三,20190120拼多多無門檻優(yōu)惠券大事故
2019年1月20日凌晨1點(diǎn)到10點(diǎn),整整9個(gè)小時(shí),羊毛黨徒們狂歡,從拼多多領(lǐng)?。ǘ皇菗屬?gòu))100元無門檻優(yōu)惠券,據(jù)信拼多多損失高達(dá)數(shù)千萬元。
據(jù)傳,這個(gè)無門檻優(yōu)惠券實(shí)際上對(duì)應(yīng)于已過期的運(yùn)營(yíng)活動(dòng),但由于操作失誤,導(dǎo)致凌晨又重新上線。
p.s.:
劵的來歷:〃在拼多多官方的公告中指出此券為拼多多此前與江蘇衛(wèi)視《非誠(chéng)勿擾》開展合作時(shí),因節(jié)目錄制需要特殊生成的優(yōu)惠券類型,僅供現(xiàn)場(chǎng)嘉賓使用。除此之外,此種類型優(yōu)惠券,從未在任何時(shí)候、以任何方式出現(xiàn)在平臺(tái)正常的線上促銷活動(dòng)當(dāng)中,甚至從未有任何線上入口。〃
四,拼多多事故對(duì)我們的啟示,以及我們要做什么
運(yùn)營(yíng)規(guī)則,技術(shù)防護(hù),風(fēng)控預(yù)警,法律條款,電商行走江湖的四大護(hù)身法寶,缺一不可。
出了事兒不可怕,怕的是都沒有人知道出事兒了。要不是當(dāng)天上午有并發(fā)異常,拼多多技術(shù)團(tuán)隊(duì)也不會(huì)順藤摸瓜發(fā)現(xiàn)被領(lǐng)走那么多券。
風(fēng)控體系的建立,至關(guān)重要:
-
我們已經(jīng)上了業(yè)務(wù)保障平臺(tái)和全鏈路追蹤,能夠?qū)崟r(shí)監(jiān)控第三方支付通道的活動(dòng),及時(shí)預(yù)警。但這還遠(yuǎn)遠(yuǎn)不夠。
-
應(yīng)建立自動(dòng)化的交易監(jiān)控機(jī)制和風(fēng)險(xiǎn)監(jiān)控模型,實(shí)時(shí)監(jiān)控,及時(shí)預(yù)警;
-
應(yīng)通過分析欺詐行為特征創(chuàng)建反欺詐規(guī)則,對(duì)交易數(shù)據(jù)實(shí)時(shí)分析;
-
應(yīng)制定異常交易監(jiān)測(cè)和處理的流程和制度;
-
應(yīng)依據(jù)已識(shí)別并確認(rèn)的風(fēng)險(xiǎn)數(shù)據(jù),建立黑名單數(shù)據(jù)庫(kù);
-
……
每個(gè)電商都有規(guī)則漏洞,都有程序漏洞,無非是在多大范圍內(nèi)被黑產(chǎn)和賺客們薅羊毛。
風(fēng)控體系包括對(duì)傳統(tǒng)業(yè)務(wù)指標(biāo)的監(jiān)測(cè)和報(bào)警,至少能讓我們發(fā)現(xiàn)系統(tǒng)潛在的漏洞,及時(shí)修補(bǔ),而不是***一個(gè)知道系統(tǒng)出事兒的人。
我們要把別人的歷史當(dāng)作自己的未來,這樣才能知道過去人家錯(cuò)在哪里,我們現(xiàn)在應(yīng)該怎么做。
再贈(zèng)送舊文一篇,也是攜程事故之后寫的。
攜程旅行網(wǎng)的技術(shù)團(tuán)隊(duì)今天注定是一個(gè)不眠之夜,我的猜測(cè)是自動(dòng)化運(yùn)維系統(tǒng)過于強(qiáng)大以至于誤操作后覆水難收,加之歷史悠久規(guī)模龐大各種新老系統(tǒng)交錯(cuò),全面從新部署與平常迭代上線肯定不一樣,難度系數(shù)更高。
這也就是為什么過去我反復(fù)強(qiáng)調(diào)審計(jì)歷年來對(duì)我們做的企業(yè)內(nèi)部安全審計(jì)非常重要,他們提出的意見,我們必須認(rèn)真審視認(rèn)真去落實(shí)。
為了警醒各位技術(shù)人員,下面列出本次攜程誤操作事件引發(fā)的各種手滑吐槽。
-
Rebuild:
-
當(dāng)年酷殼在亞馬遜的時(shí)候,AWS的一個(gè)新人在工作***天做熟悉開發(fā)環(huán)境自助培訓(xùn)時(shí),他本來想連測(cè)試環(huán)境,結(jié)果連不上,老員工給了他一個(gè)配置,他沒分清哪個(gè)是測(cè)試的,哪個(gè)是生產(chǎn)的,不小心聯(lián)上了生產(chǎn)線數(shù)據(jù)庫(kù),把整個(gè)數(shù)據(jù)庫(kù)給 Rebuild 了,導(dǎo)致全美 Netflix 停止服務(wù)數(shù)小時(shí);
-
-
Recreate:
-
某人用 hibernate 反向生成數(shù)據(jù)庫(kù)的一張表,并且連的是測(cè)試庫(kù),結(jié)果一個(gè)配置沒加,把所有的表都格式化掉并重新創(chuàng)建了一次。
-
-
UPDATE沒有WHERE條件:
-
十一年前,某人手寫 SQL UPDATE 線上數(shù)據(jù)庫(kù),由于引號(hào)把 WHERE 子句截?cái)?,用戶原?chuàng)內(nèi)容幾乎全都被清空,不幸的是運(yùn)維也出錯(cuò)了,備份程序停了半個(gè)月,于是全公司同事手工到搜索引擎快照中找回用戶的文章。
-
以前更新錯(cuò)誤數(shù)據(jù),結(jié)果手滑 where 條件還沒寫完呢,想動(dòng)一下鼠標(biāo),結(jié)果點(diǎn)到執(zhí)行。一下子把所有的采購(gòu)單數(shù)據(jù)的某個(gè)金額給改了,后來 dba 立刻恢復(fù)我操作以前的數(shù)據(jù),就這三五分鐘的時(shí)間,客服那邊就接到了超多投訴電話。
-
-
配錯(cuò)了:
-
有次做帶寬調(diào)度算法,方向?qū)戝e(cuò)了,瞬間給一個(gè) CDN 提供商搞了 100G 上下的帶寬,持續(xù) 16 小時(shí)。給公司造成了近 20 萬的帶寬費(fèi)用。某人至今最貴的bug。
-
-
自己挖坑:
-
某人曾把整個(gè)服務(wù)器全部抹掉了。事情是這樣的,有一個(gè)硬盤是鏡像備份,掛載的時(shí)候用 sda1 這樣的名字,沒有用 uuid。后來加了個(gè)硬盤,結(jié)果原來的數(shù)據(jù)盤成了 sda1,等于說從一個(gè)空盤做鏡像。
-
在高盛剛?cè)肼毜臅r(shí)候一不小心把生產(chǎn)環(huán)境 compliance 數(shù)據(jù)庫(kù)鎖了,紐約 gsam 的 equity trading 停頓了15分鐘,完了經(jīng)理跟我說,沒事兒,我闖過更大的禍。
-
-
膽子太大
-
好幾年前剛開始學(xué)著做 windows 服務(wù)器管理,把幾個(gè) windows 服務(wù)禁用,結(jié)果造成有服務(wù)互相依賴啟動(dòng)不了,停機(jī)幾十個(gè)小時(shí)。
-
-
已然不知道該怎么說了:
-
某年研發(fā)部所有電腦硬盤被偷,95%+的產(chǎn)品都丟了源代碼,為了維護(hù)一個(gè)已經(jīng)上線的產(chǎn)品不得已,掛 HttpHandler 來處理。
-
某客戶為了重新部署系統(tǒng),將數(shù)據(jù)導(dǎo)出備份到移動(dòng)硬盤,然后將 Raid 重新格式化,重新安裝系統(tǒng),當(dāng)進(jìn)行 Oracle 數(shù)據(jù)庫(kù)重建,導(dǎo)入數(shù)據(jù)時(shí)發(fā)現(xiàn),移動(dòng)硬盤上的數(shù)據(jù)無法正確讀取,文件缺失一半。
-
曾經(jīng)在 catch 里寫過 system.exit。
-
drop 過生產(chǎn)環(huán)境數(shù)據(jù)庫(kù)表的路過。
-
剛?cè)胄袝r(shí)曾在代碼里加過 system rm,然后測(cè)試環(huán)境里的大部分程序都失蹤了,天真的以為是黑客干的。
-
曾經(jīng)把圖片的地址都寫成了“undefined”,上線后以為被 ddos 了。
-