一个purge参数引发的惨案——从线上hbase数据被删事故说起
一個(gè)purge參數(shù)引發(fā)的慘案——從線上hbase數(shù)據(jù)被刪事故說起
在寫這篇blog前,我的心情久久不能平靜,雖然明白運(yùn)維工作如履薄冰,但沒有料到這么一個(gè)細(xì)小的疏漏會(huì)帶來如此嚴(yán)重的災(zāi)難。這是一起其他公司誤用puppet參數(shù)引發(fā)的事故,但是這個(gè)參數(shù)我也曾被“坑過”。
先說說這起事故,在周二下午,安靜了一天的某個(gè)技術(shù)交流群,突然有個(gè)驚慌失措的同學(xué)在群里說,他拿第三方的puppet hbase module來管理線上hbase集群,結(jié)果這個(gè)模塊在管理數(shù)據(jù)文件夾時(shí),使用了一個(gè)purge參數(shù)把幾乎所有的線上數(shù)據(jù)都刪完了。他已經(jīng)和領(lǐng)導(dǎo)匯報(bào)了情 況,那邊正在緊急討論處理方案。他在做好打包走人的準(zhǔn)備的同時(shí),仍抱有一絲希望來詢問我們有沒有辦法恢復(fù)數(shù)據(jù),大家紛紛為他獻(xiàn)計(jì)獻(xiàn)策... 我就想起兩年前,我第一次嘗試使用puppet-apache模塊管理apache服務(wù),apache::init類中默認(rèn)設(shè)置了purge_configs參數(shù)為True,導(dǎo)致我把a(bǔ)pache目錄下的所有vhost文件刪掉了,萬幸的是我是在開發(fā)環(huán)境發(fā)現(xiàn)了這個(gè)問題。 ? 那么,我們來看看這個(gè)“邪惡”的purge參數(shù)是什么樣子的:
?file是puppet的默認(rèn)resource type,用于管理文件或者文件夾。在管理文件夾時(shí),只有當(dāng)設(shè)置了recurse為true的情況下,purge參數(shù)才會(huì)生效。這段邏輯的意思是要清空 /var/lib/data_directory目錄下所有非puppet管理的文件,purge參數(shù)通常的目的是清理管理目錄以及防止被他人惡意添加本不該存在的文件。但也因?yàn)檫@段邏輯,就把hbase數(shù)據(jù)目錄下的文件全部清空了。?從這次事故中,我們可以看到很多問題:?1. 部署代碼的上線居然沒有通過開發(fā)和測(cè)試環(huán)境的驗(yàn)證2. 使用第三方模塊時(shí),竟然不閱讀源碼或者README文件,也沒有運(yùn)行測(cè)試3. 上線沒有審批流程,上線負(fù)責(zé)人的失職4. .....??首先,有一個(gè)觀念需要矯正,有些人認(rèn)為部署邏輯不屬于開發(fā)范疇,往往編寫后就直接上線,其實(shí)只要涉及到代碼的變更,無論是業(yè)務(wù)邏輯還是部署邏輯,都需要通過開發(fā)環(huán)境和測(cè)試環(huán)境的驗(yàn)證。那么如何做好部署邏輯的驗(yàn)證工作??對(duì)于編寫puppet來實(shí)現(xiàn)部署邏輯的工程師來說:少一個(gè)花括號(hào)或者分號(hào),就可能導(dǎo)致代碼無法運(yùn)行;遺漏某個(gè)class或者某個(gè)參數(shù)就會(huì)使節(jié)點(diǎn) 無法到達(dá)期望的狀態(tài);錯(cuò)誤的執(zhí)行順序,甚至可能會(huì)導(dǎo)致系統(tǒng)崩潰或者網(wǎng)絡(luò)不可達(dá)。為如何保證所編寫的manifests符合你的預(yù)期??
1. 語法檢查
?和其他的編程語言一樣,語法檢查是基本步驟,因此使用puppet解析器做語法檢查是最基礎(chǔ)也是必不可少的驗(yàn)證工作。你可以使用puppet parser validate命令來檢查某個(gè)manifest文件:?例如,我在logserver.pp中的$eth0_netmask變量后面漏掉了逗號(hào):
?對(duì)于erb template,你可以使用 erb -P -x -T '-' $1 | ruby -c命令來做檢查。我在route-eth.erb中漏掉了if判斷語句的結(jié)束標(biāo)記,此時(shí)執(zhí)行語法檢測(cè)會(huì)發(fā)生以下提示:
?
2. 代碼風(fēng)格檢查
? 每個(gè)語言都有一套規(guī)范的語法風(fēng)格指南,puppet也不例外:https://docs.puppetlabs.com/guides/style_guide.htm我們可以使用Github的Tim sharpe所開發(fā)的puppet-lint工具來分析你所寫的manifests文件。?例如檢查一個(gè)manifests文件:?
?如果你希望檢查整個(gè)puppet mainifest目錄,你需要添加:?require 'puppet-lint/tasks/puppet-lint'?到Rakefile里,然后運(yùn)行rake lint即可。?在某些情況下,你不得不關(guān)閉某些檢查,例如,想要關(guān)閉80 character check,你可以如下運(yùn)行:?
需要注意的是,puppet-lint僅作代碼風(fēng)格的檢查,不能替代語法檢查。
?
?3. 模塊測(cè)試
? 你可以使用rspec來確保所有的模塊符合預(yù)期。舉一個(gè)例子,你希望編寫一個(gè)測(cè)試來確保當(dāng)使用puppet-keystone模塊時(shí),keystone包被正確地安裝,系統(tǒng)中添加了keystone用戶和組,可以編寫一個(gè)keystone_spec.rb文件來做測(cè)試:
?隨后執(zhí)行rspec來驗(yàn)證這些測(cè)試能否通過。
如果希望集成到rake命令中去,我們可以在Rakefile里添加:
?隨后使用以下命令來完成相應(yīng)的spec執(zhí)行模塊測(cè)試:
?
因此,在使用從github或者puppetforge下載的module時(shí),閱讀README和測(cè)試用例是非常重要的,如果我當(dāng)時(shí)仔細(xì)閱讀了 apache::init的測(cè)試用例,也不會(huì)出現(xiàn)所謂被坑的問題,因?yàn)槿思颐髅髟赼pache_spec.rb里寫有對(duì)/etc/apache /sites-enabled目錄的測(cè)試:
?
4.開發(fā)環(huán)境和測(cè)試環(huán)境的驗(yàn)證
最終部署邏輯能否上線到生產(chǎn)環(huán)境,還需要在開發(fā)環(huán)境和測(cè)試環(huán)境進(jìn)行驗(yàn)證??梢允褂媚壳傲餍械膙agrant,Openstack等工具搭建一個(gè)測(cè)試 平臺(tái),調(diào)用API創(chuàng)建符合生產(chǎn)環(huán)境的集群,通過puppet做軟件安裝和配置,驗(yàn)證部署邏輯是否符合預(yù)期。開發(fā)環(huán)境和測(cè)試環(huán)境的不同點(diǎn)在于,測(cè)試環(huán)境的所 有變更與線上環(huán)境完全一致,不允許有任何的人工干預(yù)。
至此,一個(gè)通過驗(yàn)證的puppet部署邏輯可以release了,打上tag,可以準(zhǔn)備發(fā)布到線上了。當(dāng)然不能少了線上變更流程,寫下在此次線上變更的詳細(xì)操作以及回滾機(jī)制。
原文發(fā)布時(shí)間:2014-08-13
本文來自云棲合作伙伴“l(fā)inux中國”
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的一个purge参数引发的惨案——从线上hbase数据被删事故说起的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Ubuntu/Fedora/CentO
- 下一篇: 一些达成共识的JavaScript编码风