内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

從GITLAB誤刪除數(shù)據(jù)庫想到的

日前,Gitlab.com發(fā)生了一個大事,某同學誤刪了數(shù)據(jù)庫,這個事看似是個低級錯誤,不過,因為Gitlab把整個過程的細節(jié)都全部暴露出來了,所以,可以看到很多東西,而對于類似這樣的事情,我自己以前也干過,而在最近的兩公司中我也見過(Amazon中見過一次,阿里中見過至少四次),正好通過這個事來說說一下自己的一些感想和觀點吧。我先放個觀點:你覺得有備份系統(tǒng)就不會丟數(shù)據(jù)了嗎?

創(chuàng)新互聯(lián)建站于2013年成立,先為朝陽等服務建站,朝陽等地企業(yè),進行企業(yè)商務咨詢服務。為朝陽企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。

事件回顧

整個事件的回顧Gitlab.com在第一時間就放到了Google Doc上,事后,又發(fā)了一篇Blog來說明這個事,在這里,我簡單的回顧一下這個事件的過程。

首先,一個叫YP的同學在給gitlab的線上數(shù)據(jù)庫做一些負載均衡的工作,在做這個工作時的時候突發(fā)了一個情況,Gitlab被DDoS攻擊,數(shù)據(jù)庫的使用飆高,在block完攻擊者的IP后,發(fā)現(xiàn)有個staging的數(shù)據(jù)庫(db2.staging)已經(jīng)落后生產(chǎn)庫4GB的數(shù)據(jù),于是YP同學在Fix這個staging庫的同步問題的時候,發(fā)現(xiàn)db2.staging有各種問題都和主庫無法同步,在這個時候,YP同學已經(jīng)工作的很晚了,在嘗試過多個方法后,發(fā)現(xiàn)db2.staging都hang在那里,無法同步,于是他想把db2.staging的數(shù)據(jù)庫刪除了,這樣全新啟動一個新的復制,結(jié)果呢,刪除數(shù)據(jù)庫的命令錯誤的敲在了生產(chǎn)環(huán)境上(db1.cluster),結(jié)果導致整個生產(chǎn)數(shù)據(jù)庫被誤刪除。(陳皓注:這個失敗基本上就是 “工作時間過長” + “在多數(shù)終端窗口中切換中迷失掉了”)

在恢復的過程中,他們發(fā)現(xiàn)只有db1.staging的數(shù)據(jù)庫可以用于恢復,而其它的5種備份機制都不可用,第一個是數(shù)據(jù)庫的同步,沒有同步webhook,第二個是對硬盤的快照,沒有對數(shù)據(jù)庫做,第三個是用pg_dump的備份,發(fā)現(xiàn)版本不對(用9.2的版本去dump 9.6的數(shù)據(jù))導致沒有dump出數(shù)據(jù),第四個S3的備份,完全沒有備份上,第五個是相關(guān)的備份流程是問題百出的,只有幾個粗糙的人肉的腳本和糟糕的文檔,也就是說,不但是是人肉的,而且還是完全不可執(zhí)行的。(陳皓注:就算是這些備份機制都work,其實也有問題,因為這些備份大多數(shù)基本上都是24小時干一次,所以,要從這些備份恢復也一定是是要丟數(shù)據(jù)的了,只有第一個數(shù)據(jù)庫同步才會實時一些)

最終,gitlab從db1.staging上把6個小時前的數(shù)據(jù)copy回來,結(jié)果發(fā)現(xiàn)速度非常的慢,備份結(jié)點只有60Mbits/S,拷了很長時間(陳皓注:為什么不把db1.staging給直接變成生產(chǎn)機?因為那臺機器的性能很差)。數(shù)據(jù)現(xiàn)在的恢復了,不過,因為恢復的數(shù)據(jù)是6小時前的,所以,有如下的數(shù)據(jù)丟失掉了:

粗略估計,有4613 的項目, 74 forks, 和 350 imports 丟失了;但是,因為Git倉庫還在,所以,可以從Git倉庫反向推導數(shù)據(jù)庫中的數(shù)據(jù),但是,項目中的issues等就完全丟失了。 大約有±4979 提交記錄丟失了(陳皓注:估計也可以用git倉庫中反向恢復)。 可能有 707 用戶丟失了,這個數(shù)據(jù)來自Kibana的日志。 在1月31日17:20 后的Webhooks 丟失了。

因為Gitlab把整個事件的細節(jié)公開了出來,所以,也得到了很多外部的幫助,2nd Quadrant的CTO – Simon Riggs 在他的blog上也發(fā)布文章 Dataloss at Gitlab 給了一些非常不錯的建議:

關(guān)于PostgreSQL 9.6的數(shù)據(jù)同步hang住的問題,可能有一些Bug,正在fix中。 PostgreSQL有4GB的同步滯后是正常的,這不是什么問題。 正常的停止從結(jié)點,會讓主結(jié)點自動釋放WALSender的鏈接數(shù),所以,不應該重新配置主結(jié)點的 max_wal_senders 參數(shù)。但是,停止從結(jié)點時,主結(jié)點的復數(shù)連接數(shù)不會很快的被釋放,而新啟動的從結(jié)點又會消耗更多的鏈接數(shù)。他認為,Gitlab配置的32個鏈接數(shù)太高了,通常來說,2到4個就足夠了。 另外,之前gitlab配置的max_connections=8000太高了,現(xiàn)在降到2000個是合理的。 pg_basebackup 會先在主結(jié)點上建一個checkpoint,然后再開始同步,這個過程大約需要4分鐘。 手動的刪除數(shù)據(jù)庫目錄是非常危險的操作,這個事應該交給程序來做。推薦使用剛release 的 repmgr 恢復備份也是非常重要的,所以,也應該用相應的程序來做。推薦使用 barman (其支持S3) 測試備份和恢復是一個很重要的過程。

看這個樣子,估計也有一定的原因是——Gitlab的同學對PostgreSQL不是很熟悉。

隨后,Gitlab在其網(wǎng)站上也開了一系列的issues,其issues列表在這里 Write post-mortem (這個列表可能還會在不斷更新中)

QQ圖片20170206133946

從上面的這個列表中,我們可以看到一些改進措施了。挺好的,不過我覺得還不是很夠。

相關(guān)的思考

因為類似這樣的事,我以前也干過(誤刪除過數(shù)據(jù)庫,在多個終端窗口中迷失掉了自己所操作的機器……),而且我在amazon里也見過一次,在阿里內(nèi)至少見過四次以上(在阿里人肉運維的誤操作的事故是我見過最多的),但是我無法在這里公開分享,私下可以分享。在這里,我只想從非技術(shù)和技術(shù)兩個方面分享一下我的經(jīng)驗和認識。

技術(shù)方面

人肉運維

一直以來,我都覺得直接到生產(chǎn)線上敲命令是一種非常不好的習慣。我認為,一個公司的運維能力的強弱和你上線上環(huán)境敲命令是有關(guān)的,你越是喜歡上線敲命令你的運維能力就越弱,越是通過自動化來處理問題,你的運維能力就越強。理由如下:

其一,如果說對代碼的改動都是一次發(fā)布的話,那么,對生產(chǎn)環(huán)境的任何改動(包括硬件、操作系統(tǒng)、網(wǎng)絡、軟件配置……),也都算是一次發(fā)布。那么這樣的發(fā)布就應該走發(fā)布系統(tǒng)和發(fā)布流程,要被很好的測試、上線和回滾計劃。關(guān)鍵是,走發(fā)布過程是可以被記錄、追蹤和回溯的,而在線上敲命令是完全無法追蹤的。沒人知道你敲了什么命令。 其二,真正良性的運維能力是——人管代碼,代碼管機器,而不是人管機器。你敲了什么命令沒人知道,但是你寫個工具做變更線上系統(tǒng),這個工具干了什么事,看看工具的源碼就知道了。

另外、有人說,以后不要用rm了,要用mv,還有人說,以后干這樣的事時,一個人干,另一個人在旁邊看,還有人說,要有一個checklist的強制流程做線上的變更,還有人說要增加一個權(quán)限系統(tǒng)。我覺得,這些雖然可以work,但是依然不好,再由如下:

其一、如果要解決一個事情需要加更多的人來做的事,那這事就做成勞動密集型了。今天我們的科技就是在努力消除人力成本,而不是在增加人力成本。而做為一個技術(shù)人員,解決問題的最好方式是努力使用技術(shù)手段,而不是使用更多的人肉手段。人類區(qū)別于動物的差別就是會發(fā)明和使用現(xiàn)代化的工具,而不是使用更多的人力。另外,這不僅僅因為是,人都是會有這樣或那樣的問題(疲憊、情緒化、急燥、沖動……),而機器是單一無腦不知疲憊的,更是因為,機器干活的效率和速度是比人肉高出N多倍的。 其二、增加一個權(quán)限系統(tǒng)或是別的一個watch dog的系統(tǒng)完全是在開倒車,權(quán)限系統(tǒng)中的權(quán)限誰來維護和審批?不僅僅是因為多出來的系統(tǒng)需要多出來的維護,關(guān)鍵是這個事就沒有把問題解決在root上。除了為社會解決就業(yè)問題,別無好處,故障依然會發(fā)生,有權(quán)限的人一樣會誤操作。對于Gitlab這個問題,正如2nd Quadrant的CTO建議的那樣,你需要的是一個自動化的備份和恢復的工具,而不是一個權(quán)限系統(tǒng)。 其三、像使用mv而不rm,搞一個checklist和一個更重的流程,更糟糕。這里的邏輯很簡單,因為,1)這些規(guī)則需要人去學習和記憶,本質(zhì)上來說,你本來就不相信人,所以你搞出了一些規(guī)則和流程,而這些規(guī)則和流程的執(zhí)行,又依賴于人,換湯不換藥,2)另外,寫在紙面上的東西都是不可執(zhí)行的,可以執(zhí)行的就是只有程序,所以,為什么不把checklist和流程寫成代碼呢?(你可能會說程序也會犯錯,是的,程序的錯誤是consistent,而人的錯誤是inconsistent)

最關(guān)鍵的是,數(shù)據(jù)丟失有各種各樣的情況,不單單只是人員的誤操作,比如,掉電、磁盤損壞、中病毒等等,在這些情況下,你設計的那些想流程、規(guī)則、人肉檢查、權(quán)限系統(tǒng)、checklist等等統(tǒng)統(tǒng)都不管用了,這個時候,你覺得應該怎么做呢?是的,你會發(fā)現(xiàn),你不得不用更好的技術(shù)去設計出一個高可用的系統(tǒng)!別無它法。

關(guān)于備份

一個系統(tǒng)是需要做數(shù)據(jù)備份的,但是,你會發(fā)現(xiàn),Gitlab這個事中,就算所有的備份都可用,也不可避免地會有數(shù)據(jù)的丟失,或是也會有很多問題。理由如下:

1)備份通常來說都是周期性的,所以,如果你的數(shù)據(jù)丟失了,從你最近的備份恢復數(shù)據(jù)里,從備份時間到故障時間的數(shù)據(jù)都丟失了。 2)備份的數(shù)據(jù)會有版本不兼容的問題。比如,在你上次備份數(shù)據(jù)到故障期間,你對數(shù)據(jù)的scheme做了一次改動,或是你對數(shù)據(jù)做了一些調(diào)整,那么,你備份的數(shù)據(jù)就會和你線上的程序出現(xiàn)不兼容的情況。 3)有一些公司或是銀行有災備的數(shù)據(jù)中心,但是災備的數(shù)據(jù)中心沒有一天live過。等真正災難來臨需要live的時候,你就會發(fā)現(xiàn),各種問題讓你live不起來。你可以讀一讀幾年前的這篇報道好好感受一下《以史為鑒 寧夏銀行7月系統(tǒng)癱瘓最新解析》

所以,在災難來臨的時候,你會發(fā)現(xiàn)你所設計精良的“備份系統(tǒng)”或是“災備系統(tǒng)”就算是平時可以工作,但也會導致數(shù)據(jù)丟失,而且可能長期不用的備份系統(tǒng)很難恢復(比如應用、工具、數(shù)據(jù)的版本不兼容等問題)。

我之前寫過一篇《分布式系統(tǒng)的事務處理》,你還記得下面這張圖嗎?看看 Data Loss 那一行的,在Backups, Master/Slave 和 Master/Master的架構(gòu)下,都是會丟的。

所以說,如果你要讓你的備份系統(tǒng)隨時都可以用,那么你就要讓它隨時都Live著,而隨時都Live著的多結(jié)點系統(tǒng),基本上就是一個分布式的高可用的系統(tǒng)。因為,數(shù)據(jù)丟失的原因有很多種,比如掉電、磁盤損壞、中病毒等等,而那些流程、規(guī)則、人肉檢查、權(quán)限系統(tǒng)、checklist等等都只是讓人不要誤操作,都不管用,這個時候,你不得不用更好的技術(shù)去設計出一個高可用的系統(tǒng)!別無它法。(重要的事,得再說一篇)

另外,你可以參看我的另一篇《關(guān)于高可用系統(tǒng)》,這篇文章中以MySQL為例,數(shù)據(jù)庫的replication也只能達到 兩個9。

AWS 的 S3 的的高可用是4個加11個9的持久性(所謂11個9的持久性durability,AWS是這樣定義的,如果你存了1萬個對象,那么丟一個的時間是1000萬年),這意味著,不僅僅只是硬盤壞,機器掉電,整個機房掛了,其保證可以承受有兩個設施的數(shù)據(jù)丟失,數(shù)據(jù)還是可用的。試想,如果你把數(shù)據(jù)的可用性通過技術(shù)做到了這個份上,那么,你還怕被人誤刪一個結(jié)點上的數(shù)據(jù)嗎?

非技術(shù)方面

故障反思

一般說來,故障都需要反思,在Amazon,S2以上的故障都需要寫COE(Correction of Errors),其中一節(jié)就是需要Ask 5 Whys,我發(fā)現(xiàn)在Gitlab的故障回顧的blog中第一段中也有說要在今天寫個Ask 5 Whys。關(guān)于Ask 5 Whys,其實并不是亞馬遜的玩法,這還是算一個業(yè)內(nèi)常用的玩法,也就是說不斷的為自己為為什么,直到找到問題的概本原因,這會逼著所有的當事人去學習和深究很多東西。在Wikipedia上有相關(guān)的詞條 5 Whys,其中羅列了14條規(guī)則:

你需要找到正確的團隊來完成這個故障反思。 使用紙或白板而不是電腦。 寫下整個問題的過程,確保每個人都能看懂。 區(qū)別原因和癥狀。 特別注意因果關(guān)系。 說明Root Cause以及相關(guān)的證據(jù)。 5個為什么的答案需要是精確的。 尋找問題根源的頻,而不是直接跳到結(jié)論。 要基礎客觀的事實、數(shù)據(jù)和知識。 評估過程而不是人。 千萬不要把“人為失誤”或是“工作不注意”當成問題的根源。 培養(yǎng)信任和真誠的氣氛和文化。 不斷的問“為什么”直到問題的根源被找到。這樣可以保證同一個坑不會掉進去兩次。 當你給出“為什么”的答案時,你應該從用戶的角度來回答。

工程師文化

上述的這些觀點,其實,我在我的以住的博客中都講過很多遍了,你可以參看《什么是工程師文化?》以及《開發(fā)團隊的效率》。其實,說白了就是這么一個事——如果你是一個技術(shù)公司,你就會更多的相信技術(shù)而不是管理。相信技術(shù)會用技術(shù)來解決問題,相信管理,那就只會有制度、流程和價值觀來解決問題。

這個道理很簡單,數(shù)據(jù)丟失有各種各樣的情況,不單單只是人員的誤操作,比如,掉電、磁盤損壞、中病毒等等,在這些情況下,你設計的那些流程、規(guī)則、人肉檢查、權(quán)限系統(tǒng)、checklist等等統(tǒng)統(tǒng)都不管用,這個時候,你覺得應該怎么做呢?是的,你會發(fā)現(xiàn),你不得不用更好的技術(shù)去設計出一個高可用的系統(tǒng)!別無它法。(重要的事得說三遍)

事件公開

很多公司基本上都是這樣的套路,首先是極力掩蓋,如果掩蓋不了了就開始撒謊,撒不了謊了,就“文過飾非”、“避重就輕”、“轉(zhuǎn)移視線”。然而,面對危機的最佳方法就是——“多一些真誠,少一些套路”,所謂的“多一些真誠”的最佳實踐就是——“透明公開所有的信息”,Gitlab此次的這個事給大家樹立了非常好的榜樣。AWS也會把自己所有的故障和細節(jié)都批露出來。

事情本來就做錯了,而公開所有的細節(jié),會讓大眾少很多猜測的空間,有利于抵制流言和黑公關(guān),同時,還會贏得大眾的理解和支持??纯碐itlab這次還去YouTube上直播整個修復過程,是件很了不起的事,大家可以到他們的blog上看看,對于這樣的透明和公開,一片好評。

本文名稱:從GITLAB誤刪除數(shù)據(jù)庫想到的
網(wǎng)頁URL:http://m.rwnh.cn/article32/soiosc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、企業(yè)建站品牌網(wǎng)站建設、軟件開發(fā)網(wǎng)站設計公司、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設
专栏| 托克托县| 呈贡县| 饶阳县| 历史| 陕西省| 神池县| 石河子市| 安陆市| 芦山县| 西和县| 莱阳市| 衡东县| 玉山县| 兴安盟| 五河县| 万安县| 涞水县| 聊城市| 毕节市| 乌鲁木齐市| 武川县| 耒阳市| 德保县| 白朗县| 南通市| 宜春市| 彰武县| 赤城县| 洛隆县| 体育| 永登县| 康定县| 花莲县| 梧州市| 准格尔旗| 河东区| 利辛县| 彰武县| 凭祥市| 浦东新区|