聊一聊如何運(yùn)維分布式存儲(chǔ)
序言
最近花了很多時(shí)間在分布式存儲(chǔ)上面,不想在這個(gè)上面再花費(fèi)很多時(shí)間了,所以用這篇文章做一個(gè)最后的總結(jié)。
在面對(duì)分布式存儲(chǔ)的時(shí)候,分為兩種角度,一種是客戶側(cè),一種是運(yùn)維側(cè),客戶是上帝,所以不談上帝的操作,專注于運(yùn)維側(cè)的系統(tǒng)構(gòu)建。
其實(shí)所有的系統(tǒng)構(gòu)建,都應(yīng)該分成兩個(gè)緯度,一個(gè)是客戶緯度,專注于客戶體驗(yàn),進(jìn)行各種定制化輸出;一個(gè)是運(yùn)維緯度,專注于底層的運(yùn)維,各種監(jiān)控?cái)?shù)據(jù),各種操作,都使用白屏的操作,而不是天天命令行操作,使用平臺(tái)層面,可以防止誤操作,系統(tǒng)扛了大部分的責(zé)任,也可以讓運(yùn)維不用每天記憶那些傻逼命令,傻逼參數(shù),減輕低等級(jí)的操作,讓大腦有更多的空間來想想其他的事情。。。例如,看看藍(lán)天白日黃昏。。。。
分布式存儲(chǔ)運(yùn)維系統(tǒng)構(gòu)建
分布式的架構(gòu)一般如下所示:
在分布式系統(tǒng)中,主要有幾個(gè)對(duì)象。
運(yùn)維測(cè)對(duì)象:一個(gè)是master,控制節(jié)點(diǎn)對(duì)象,主要用來提供元數(shù)據(jù)的保存,統(tǒng)計(jì)相關(guān)的信息,對(duì)外提供統(tǒng)一的API;一個(gè)是chunkserver,工作節(jié)點(diǎn)對(duì)象,主要是用來存儲(chǔ)數(shù)據(jù)。
master涉及到動(dòng)作有:查詢master節(jié)點(diǎn),進(jìn)行master節(jié)點(diǎn)切換,備份元數(shù)據(jù),生成checkpoint文件用于恢復(fù),生成操作日志用于同步,修改master啟動(dòng)參數(shù),重啟master進(jìn)程。
chunkserver涉及到動(dòng)作有:查詢chunkserver列表,顯示總的空間大小,剩余的空間大小,磁盤的狀態(tài),進(jìn)程狀態(tài),修改chunkserver進(jìn)程參數(shù),重啟chunkserver進(jìn)程,擴(kuò)容,縮容。
客戶側(cè)對(duì)象:一個(gè)是目錄,一個(gè)是文件,在此主要涉及到的動(dòng)作有,查看目錄,查看文件,查看分片數(shù)量,設(shè)置分片數(shù)量,檢查分片數(shù)量,處理分片異常,設(shè)置用戶的邏輯空間占用多少,物理空間占用多少,目錄文件遷移,設(shè)置回收策略,設(shè)置文件的replica數(shù)量。
以下為對(duì)動(dòng)作的解釋,為什么需要這些動(dòng)作:
1、 主節(jié)點(diǎn)為三個(gè),主要是因?yàn)槭褂昧藀axos算法來進(jìn)行選主操作,為什么要有一個(gè)主?提供服務(wù)的高可用,而使用三個(gè)節(jié)點(diǎn),則是為了防止分區(qū)的情況出現(xiàn)。
2、 為什么要生成checkpoint文件,當(dāng)master存儲(chǔ)了大量的元數(shù)據(jù)的時(shí)候,這些數(shù)據(jù)都放在磁盤上,如果服務(wù)器宕機(jī),那么在啟動(dòng)進(jìn)程的時(shí)候,會(huì)將所有的數(shù)據(jù)都要加載進(jìn)內(nèi)存,時(shí)間上來說,是不可以接受的,從而定時(shí)生成checkpoint文件,便于宕機(jī)恢復(fù),或者是進(jìn)程掛了進(jìn)行恢復(fù)。
3、 為什么要有操作日志,操作日志主要是在三個(gè)master節(jié)點(diǎn)上,都使用的是相同的一份數(shù)據(jù),在master與其他的slave進(jìn)行同步的時(shí)候,使用操作日志進(jìn)行同步。
4、 為什么要有立刻生成chenckpoint文件和操作日志的動(dòng)作,一般生成checkpoint都是定時(shí)生成的,當(dāng)我要進(jìn)行升級(jí),或者修改參數(shù)的時(shí)候,需要保證數(shù)據(jù)的一致性,從而即可生成,在啟動(dòng)的時(shí)候,減少啟動(dòng)的時(shí)間。
5、 為什么要顯示chunkserver的磁盤空間,chunkserver主要是用來存儲(chǔ)的,那么必然要顯示磁盤的剩余空間和總的空間,這個(gè)也是分布式存儲(chǔ)的主要作用。
6、 修改chunkserver進(jìn)程的參數(shù)是為了在重啟chunkserver進(jìn)程的時(shí)候,無須去服務(wù)器上手動(dòng)進(jìn)行修改相關(guān)的參數(shù)。
7、 擴(kuò)容縮容一鍵化操作,大大減少運(yùn)維操作的復(fù)雜性。
8、 為什么要處理分片異常,在有些異常的情況下,分片有的時(shí)候少了,有的時(shí)候沒有,有的時(shí)候沒有達(dá)到期望值,從而需要對(duì)分片異常的情況進(jìn)行處理,這個(gè)主要是為了保障數(shù)據(jù)安全。。。而在這個(gè)進(jìn)行操作的時(shí)候,可以使用replica的自動(dòng)刪除和添加機(jī)制,也就是修改一下文件的分片數(shù)量,從而也就會(huì)刪除老版本的分片,并且將分片數(shù)量達(dá)到自己期望的狀態(tài)。
9、 在分布式文件系統(tǒng)中,刪除數(shù)據(jù)是有策略的,一般會(huì)設(shè)置一個(gè)回收站,當(dāng)刪除數(shù)據(jù)的時(shí)候,會(huì)將數(shù)據(jù)加入到回收站中,保留一天或者兩天時(shí)間,如果還沒有進(jìn)行恢復(fù),那么說明數(shù)據(jù)可以刪除,會(huì)有一個(gè)定時(shí)任務(wù)來定時(shí)清理這些數(shù)據(jù),從而需要一個(gè)回收刪除的策略。
10、 設(shè)置文件的replica數(shù)量,這個(gè)是最基本的功能了,分布式存儲(chǔ)的可靠性和可用性的唯一保障就是分片數(shù)量,一般為三份。
如果說,你看了上面的那么多內(nèi)容,還不能做出一個(gè)運(yùn)維測(cè)的分布式運(yùn)維系統(tǒng),那我也就無話可說了,對(duì)象有了,動(dòng)作有了,剩下的就是代碼了。。。
等風(fēng)來。。。。
閑扯。。。
分布式存儲(chǔ)就像風(fēng)一樣,你不知道花落誰家,你也可能找不到它到底存儲(chǔ)在哪個(gè)節(jié)點(diǎn)的哪個(gè)chunk上,。。。其實(shí)是可以找到的,哈哈
分布式系統(tǒng)用來保證數(shù)據(jù)的可靠性,分片是唯一手段,保存來保存去,其實(shí)還是保存在磁盤上,無論你怎么跑,你要么存儲(chǔ)在ssd磁盤上,要么存儲(chǔ)在sata磁盤上。
分布式存儲(chǔ)的可用性,無論怎么可用,最后都是使用linux系統(tǒng)中,無論怎么存儲(chǔ),都是使用的操作系統(tǒng)提供的文件系統(tǒng),所以不管你是不是分布式存儲(chǔ),分布式文件,分布式表格,分布式鍵值,都存在于ext3?ext4文件系統(tǒng)中。。。。那么問題來了,在存儲(chǔ)的時(shí)候,都是先寫入內(nèi)存,然后返回客戶端寫成功,如果。。。這個(gè)時(shí)候服務(wù)器宕機(jī)了,是不是就丟失數(shù)據(jù)了呢???
丟數(shù)據(jù),有什么關(guān)系,但是,可以不丟么,可以的。。。只要禁用swap,禁用操作系統(tǒng)層面的緩存就可以了,損失了部分性能,換取了更強(qiáng)的可靠性。
在使用分布式存儲(chǔ)的時(shí)候,使用ssd,使用sata,可以優(yōu)化么?那是必須可以的,在操作系統(tǒng)層面,總是存儲(chǔ)各種元數(shù)據(jù),例如atime,diratime,但是在分布式系統(tǒng)中,可以不存儲(chǔ)已提高性能,在進(jìn)行掛載的時(shí)候,加入這些參數(shù)就好了。。
這就是所謂的優(yōu)化???是的,就那么幾個(gè)參數(shù),也算是優(yōu)化。。。你不能修改源碼進(jìn)行適配,所以。。。加幾個(gè)參數(shù)就算是優(yōu)化了,這個(gè)。。。算是一種搞笑的行為,不過。。很多人以為這種優(yōu)化酷斃了。。。。淡然一笑。。。不語。。。
有的時(shí)候,感覺有的操作很酷,因?yàn)樵跇?gòu)建一個(gè)運(yùn)維平臺(tái)的時(shí)候,不僅僅有各種測(cè)試數(shù)據(jù),各種TPS,各種QPS,各種http latency,還有。。。我做這個(gè)動(dòng)作需要幾步。。。例如我擴(kuò)容,點(diǎn)擊3次,輸入3次,就完成了一次擴(kuò)容。。。可控的風(fēng)險(xiǎn),可控的升級(jí)。。。。這種還是極好的。。。
沒有冪等性,如何做到唯一性???在使用分布式系統(tǒng)的時(shí)候,可能會(huì)經(jīng)常碰到超時(shí),那么這種超時(shí),怎么辦???業(yè)務(wù)方面一般認(rèn)為存儲(chǔ)系統(tǒng)是可靠的,返回成功就是成功,而返回失敗則是失敗,而沒有考慮到如果服務(wù)端處理成功,客戶端超時(shí)沒接受到響應(yīng),咋整。。。。業(yè)務(wù)序列號(hào)的唯一性,查詢此筆業(yè)務(wù)的序列號(hào),然后查詢記錄,從而可以得到成功或者失敗,只能根據(jù)歷史情況查詢。。。
突然記起來了,在分布式存儲(chǔ)中,還有一個(gè)動(dòng)作就是數(shù)據(jù)打散,也就是rebalance,這種操作感覺好高端,例如。。。在擴(kuò)容的時(shí)候,新上線的機(jī)器需要遷移數(shù)據(jù),例如,在使用DHT算法的時(shí)候,需要將相鄰的數(shù)據(jù)遷移到新上限的機(jī)器上,那么進(jìn)行rebalance,如果此時(shí)數(shù)據(jù)量過大,可能會(huì)影響整體分布式存儲(chǔ)的IO能力,從而在進(jìn)行rebalance的時(shí)候,需要手動(dòng)進(jìn)行操作,進(jìn)行限流,也就是限制遷移的速度,可能是20M/S,也可能是100M.S,主要看你的帶寬來進(jìn)行評(píng)估了。。。不要讓屁股決定腦袋。。。
突然記起來上次一個(gè)故障,客戶端寫存儲(chǔ),寫不進(jìn)去,業(yè)務(wù)報(bào)錯(cuò),查詢,發(fā)現(xiàn)客戶端響應(yīng)碼,5XXX,內(nèi)部錯(cuò)誤,查詢?nèi)罩荆l(fā)現(xiàn)是,,,分區(qū)未找到。。。初步判斷為可能服務(wù)器宕機(jī),不可能。。。進(jìn)程重啟。。。不可能,都沒收到報(bào)警。。。那么就認(rèn)定為是服務(wù)器內(nèi)部進(jìn)行了rebalance的操作。。。但是最后再一看,發(fā)現(xiàn)所有的rebalance都必須手動(dòng),自動(dòng)進(jìn)行rebalance的操作都已經(jīng)關(guān)閉,然后查詢對(duì)應(yīng)的時(shí)間點(diǎn),發(fā)現(xiàn)。。。對(duì)應(yīng)的chunkserver上面的進(jìn)程進(jìn)行了重啟。。。。然后再查為什么重啟,發(fā)現(xiàn)是進(jìn)程使用的內(nèi)存過大,而cgroup對(duì)這個(gè)進(jìn)程使用的內(nèi)存做了限制,從而把這個(gè)進(jìn)程殺了,然后監(jiān)控進(jìn)程一看,這個(gè)傻逼掛了,然后又把它給啟動(dòng)了,。。。裝作什么事都沒有發(fā)生。。。而就在一分鐘之內(nèi),啪啪啪,報(bào)錯(cuò)報(bào)錯(cuò)。。。。那么問題來了,啟動(dòng)一個(gè)chunkserver進(jìn)程需要一分鐘么。。。那么問題又來了,前端的nginx或者lvs發(fā)現(xiàn)了進(jìn)程掛了15S,拉起來進(jìn)程,假設(shè)是15S,那么檢查間隔15S,大于45S,再加上各種延時(shí),考慮一下服務(wù)器的負(fù)載,差不多一分鐘。。。。那么這種問題。。。主管判斷?日志檢查?這種才是好玩的問題排查。。。。
JUST FUCK...............好了,這篇文章只花一個(gè)小時(shí),浪費(fèi)太多時(shí)間不好