過去兩年,我的主要工作都在Hadoop這個(gè)技術(shù)棧中,而最近有幸接觸到了Ceph。我覺得這是一件很幸運(yùn)的事,讓我有機(jī)會(huì)體驗(yàn)另一種大型分布式存儲(chǔ)解決方案,可以對(duì)比出HDFS與Ceph這兩種幾乎完全不同的存儲(chǔ)系統(tǒng)分別有哪些優(yōu)缺點(diǎn)、適合哪些場(chǎng)景。
對(duì)于分布式存儲(chǔ),尤其是開源的分布式存儲(chǔ),站在一個(gè)SRE的角度,我認(rèn)為主要為商業(yè)公司解決了如下幾個(gè)問題:
可擴(kuò)展,滿足業(yè)務(wù)增長(zhǎng)導(dǎo)致的海量數(shù)據(jù)存儲(chǔ)需求;
比商用存儲(chǔ)便宜,大幅降低成本;
穩(wěn)定,可以駕馭,好運(yùn)維。
總之目標(biāo)就是:又好用,又便宜,還穩(wěn)定。但現(xiàn)實(shí)似乎并沒有這么美好……
本文將從這三個(gè)我認(rèn)為的根本價(jià)值出發(fā),分析我運(yùn)維Ceph的體會(huì),同時(shí)對(duì)比中心化的分布式存儲(chǔ)系統(tǒng),比如HDFS,橫向說一說。
一、可擴(kuò)展性
Ceph聲稱可以無限擴(kuò)展,因?yàn)樗贑RUSH算法,沒有中心節(jié)點(diǎn)。 而事實(shí)上,Ceph確實(shí)可以無限擴(kuò)展,但Ceph的無限擴(kuò)展的過程,并不完全美好。
首先梳理一下Ceph的寫入流程。Ceph的新對(duì)象寫入對(duì)象,需要經(jīng)過PG這一層預(yù)先定義好的定額Hash分片,然后PG,再經(jīng)過一次集群所有物理機(jī)器硬盤OSD構(gòu)成的Hash,落到物理磁盤。
因此,Ceph的所有對(duì)象,是先被pre-hash到了一個(gè)固定數(shù)量的桶(PG)當(dāng)中,然后根據(jù)集群的整體物理架構(gòu)crushmap,選擇落在具體的機(jī)器磁盤上。
這對(duì)擴(kuò)容有什么影響呢?
1.擴(kuò)容粒度
我給擴(kuò)容粒度的定義是:一次可以擴(kuò)容多少臺(tái)機(jī)器。
Ceph在實(shí)踐中,擴(kuò)容受“容錯(cuò)域”制約,一次只能擴(kuò)一個(gè)“容錯(cuò)域”。
容錯(cuò)域就是:副本隔離級(jí)別,即同一個(gè)replica的數(shù)據(jù),放在不同的磁盤/機(jī)器/Rack/機(jī)房。
容錯(cuò)域這個(gè)概念,在很多存儲(chǔ)方案里都有,包括HDFS。為什么Ceph會(huì)受影響呢?因?yàn)镃eph沒有中心化的元數(shù)據(jù)結(jié)點(diǎn),導(dǎo)致數(shù)據(jù)放置策略受之影響。
數(shù)據(jù)放置策略,即一份數(shù)據(jù)replica,放在哪臺(tái)機(jī)器,哪塊硬盤。
中心化的,比如HDFS,會(huì)記錄每一個(gè)文件,下面每一個(gè)數(shù)據(jù)塊的存放位置。這個(gè)位置是不會(huì)經(jīng)常變動(dòng)的,只有在1.文件新創(chuàng)建;2.balancer重平衡;3.有硬盤壞了,中心節(jié)點(diǎn)針對(duì)損壞硬件上的數(shù)據(jù)重新放置時(shí)才會(huì)改變。
而Ceph,因?yàn)槿ブ行幕?,?dǎo)致容納數(shù)據(jù)的PG的位置,會(huì)根據(jù)crushmap的變化而變化。 來了新的機(jī)器、硬盤,就要為一些受影響的PG計(jì)算新的位置。 基于一致性哈希的技術(shù),在擴(kuò)容時(shí)也要面臨同樣的問題。
因此,Ceph擴(kuò)容需要PG們調(diào)整。正因?yàn)檫@個(gè)調(diào)整,導(dǎo)致Ceph受“容錯(cuò)域”制約。
例如:有一個(gè)PG,是3副本,Ceph集群有一個(gè)配置是PG要向外提供正常服務(wù),至少有2個(gè)完整的副本。而當(dāng)這個(gè)數(shù)據(jù)pool的容錯(cuò)域是host時(shí),同時(shí)擴(kuò)容2臺(tái)機(jī)器,一些PG就有可能把3副本中的2個(gè)都映射到2臺(tái)新機(jī)器上去。而這2個(gè)副本都是新副本,都沒有完整的最新數(shù)據(jù)。剩下的一個(gè)副本,無法滿足老機(jī)器至少有完整的2副本的要求,也就不能提供正常讀寫服務(wù)了。
這就會(huì)導(dǎo)致這個(gè)PG里的所有對(duì)象,停止對(duì)外服務(wù)。
作為admin,當(dāng)然可以把配置降低,把數(shù)據(jù)pool的min_size下降為1。但這種配置,即使在正常情況下,因?yàn)榇疟P故障,都有可能丟失數(shù)據(jù),因此一般不會(huì)這樣設(shè)置。
那在擴(kuò)容時(shí),一次只擴(kuò)容一臺(tái)機(jī)器時(shí),是不是就安全了呢?
這樣就能保證所有PG都至少在老機(jī)器有2個(gè)完整的副本了??墒?,即使是擴(kuò)容一臺(tái)機(jī)器,也還要面臨擴(kuò)容時(shí)老機(jī)器中有硬盤壞掉,導(dǎo)致PG的完整副本又下降為1的極端情況發(fā)生。
雖然PG有可能不能服務(wù),但數(shù)據(jù)的持久性是沒有問題的。國(guó)內(nèi)AT的云,服務(wù)可靠性都沒有做得特別高,做到像持久性那樣3個(gè)9、4個(gè)9。雖然我不確定這兩朵大云里的對(duì)象存儲(chǔ)是不是使用的Ceph,但只要是基于類似CRUSH算法,或者一致性哈希等類似的去中心化技術(shù)實(shí)現(xiàn)的對(duì)象存儲(chǔ),應(yīng)該都會(huì)面對(duì)部分?jǐn)?shù)據(jù)暫時(shí)不可服務(wù)的情況。
我們拋開最極端的情況,即假設(shè)在擴(kuò)容時(shí),以一個(gè)“容錯(cuò)域”加入機(jī)器時(shí),暫時(shí)沒有磁盤損壞。那么有沒有辦法可以提升擴(kuò)容粒度呢?
辦法是,在開始規(guī)劃Ceph集群時(shí),設(shè)定好更大層次的“容錯(cuò)域”,比如Rack。 可以是真實(shí)的Rack,即使沒有也可以是邏輯的Rack。這樣擴(kuò)容時(shí),可以擴(kuò)一個(gè)邏輯“容錯(cuò)域”,就可以打破擴(kuò)一臺(tái)機(jī)器的限制,擴(kuò)一整個(gè)Rack,至少有好幾臺(tái)機(jī)器。
Tips:這里我沒有講為什么擴(kuò)容粒度小是個(gè)不好的事。其實(shí)在很多公司,數(shù)據(jù)的日均增長(zhǎng)量是很有可能大于一臺(tái)機(jī)器的存儲(chǔ)容量的。這就會(huì)造成擴(kuò)容速度趕不上寫入速度的尷尬局面。這對(duì)于開始沒有設(shè)計(jì)好,圖快速deploy而架設(shè)的集群,在后期是一個(gè)不小的傷害。
2.擴(kuò)容時(shí)crushmap的改變
Ceph是根據(jù)crushmap去放置PG的物理位置的,倘若在擴(kuò)容進(jìn)行了一半時(shí),又有硬盤壞掉了,那Ceph的crushmap就會(huì)改變,Ceph又會(huì)重新進(jìn)行PG的re-hash,很多PG的位置又會(huì)重新計(jì)算。如果運(yùn)氣比較差,很可能一臺(tái)機(jī)器的擴(kuò)容進(jìn)度被迫進(jìn)行了很久才回到穩(wěn)定的狀態(tài)。
這個(gè)crushmap改變導(dǎo)致的Ceph重平衡,不單單在擴(kuò)容時(shí),幾乎在任何時(shí)候,對(duì)一個(gè)大的存儲(chǔ)集群都有些頭疼。在建立一個(gè)新集群時(shí),硬盤都比較新,因此故障率并不高。但是在運(yùn)行了2-3年的大存儲(chǔ)集群,壞盤真的是一個(gè)稀松平常的事情,1000臺(tái)規(guī)模的集群一天壞個(gè)2-3塊盤很正常。crushmap經(jīng)常變動(dòng),對(duì)Ceph內(nèi)部不穩(wěn)定,影響真的很大。隨之而來,可能是整體IO的下降(磁盤IO被反復(fù)的rebalance占滿),甚至是某些數(shù)據(jù)暫時(shí)不可用。
所以總的來說,Ceph的擴(kuò)容是有那么一丁點(diǎn)不痛快的。Ceph確實(shí)提供了無限的擴(kuò)展能力,但擴(kuò)容過程并不平滑,也不完全可控。crushmap的設(shè)計(jì),達(dá)到了很好的去中心化效果,但也給集群大了之后的不穩(wěn)定埋下了一個(gè)坑。
而對(duì)比中心化元數(shù)據(jù)的HDFS,在擴(kuò)容時(shí)幾乎無限制,你可以撒歡地?cái)U(kuò)容。老數(shù)據(jù)的搬遷,重平衡都會(huì)由單獨(dú)的job來處理,處理也很高效。它采用了滿節(jié)點(diǎn)和空節(jié)點(diǎn)兩兩配對(duì)的方式,從老節(jié)點(diǎn)移動(dòng)足夠的數(shù)據(jù),填滿新機(jī)器即可。中心化元數(shù)據(jù)在擴(kuò)容&重平衡時(shí),反而變成了一個(gè)優(yōu)點(diǎn)。
3.擴(kuò)容到一定量級(jí)后,PG數(shù)量需調(diào)整
如上文的Ceph數(shù)據(jù)寫入流程圖所示,Ceph對(duì)象的最小放置單位是PG,PG又會(huì)被放在硬盤上,PG理論上肯定是越大越好。因?yàn)檫@樣數(shù)據(jù)的分片隨機(jī)性更好,更能掩蓋偽隨機(jī)造成的單塊盤容量偏差過大問題。但PG數(shù)量在現(xiàn)實(shí)中不是越大越好的,它要受限于硬件,如CPU、內(nèi)存、網(wǎng)絡(luò)。 因此我們?cè)谝?guī)劃PG數(shù)時(shí),不會(huì)盲目調(diào)大,一般社區(qū)也是建議200pg / osd。
假設(shè)我們現(xiàn)在有10臺(tái)機(jī)器,每臺(tái)一塊硬盤一共10塊盤,有1024個(gè)PG,PG都是單副本,那么每個(gè)盤會(huì)存100個(gè)PG。此時(shí)這個(gè)設(shè)置非常健康,但當(dāng)我們集群擴(kuò)容到1000臺(tái)機(jī)器,每臺(tái)硬盤就只放一個(gè)PG了,這會(huì)導(dǎo)致偽隨機(jī)造成的不平衡現(xiàn)象放大。因此,admin就要面臨調(diào)整PG數(shù)量,這就帶來了問題。
調(diào)PG,基本也就意味著整個(gè)集群會(huì)進(jìn)入一種嚴(yán)重不正常的狀態(tài)。幾乎50%的對(duì)象,涉及到調(diào)整后的PG都需要重新放置物理位置,這會(huì)引起服務(wù)質(zhì)量的嚴(yán)重下降。
雖然調(diào)整PG不是一個(gè)經(jīng)常性的事件,但在一個(gè)大型存儲(chǔ),隨著發(fā)展,不可避免會(huì)經(jīng)歷這個(gè)大考。
二、比商用存儲(chǔ)便宜
我們所說的和商業(yè)存儲(chǔ)比較,一般就是和EMC、IBM這類硬件軟件存儲(chǔ)解決方案廠家,或者云解決方案Aliyun、AWS之類的對(duì)比。
自己建設(shè)機(jī)房,當(dāng)然在硬件單價(jià)上更為便宜,但需要考慮綜合成本,包括:1.硬件成本;2.自養(yǎng)運(yùn)維人員成本;3.服務(wù)質(zhì)量由一般向好慢慢收斂。
人的成本這種玄學(xué)的問題,我就不談了,本文只談Ceph在硬件成本這塊有什么有趣的地方。講道理,自己建機(jī)房,硬件成本應(yīng)該是毫無疑問的便宜,那么Ceph在這里有什么特殊呢?
問題在于,集群可靠利用率。
集群可靠利用率,即整個(gè)集群在容量達(dá)到某個(gè)水平時(shí)不可對(duì)外服務(wù),或者說不能保持高可用的服務(wù)。
打個(gè)比方,我們的手機(jī)閃存/電腦硬盤,是不是到99%了還能正常工作? 當(dāng)然,因?yàn)槭潜镜卮鎯?chǔ)嘛。對(duì)于云解決方案,也天然就沒有這個(gè)問題了。
對(duì)于商用存儲(chǔ)解決方案,比如EMC的Isilon分布式文件系統(tǒng),存儲(chǔ)容量達(dá)到甚至98-99%,仍能對(duì)外提供服務(wù)。
對(duì)于HDFS,在95%以下,存儲(chǔ)也能很好地對(duì)外提供服務(wù)。跑在HDFS上的Hadoop Job,會(huì)因?yàn)闆]辦法寫入本地而掛掉。
而對(duì)于Ceph,在這一塊表現(xiàn)得并不好。根據(jù)經(jīng)驗(yàn),在集群整體使用率達(dá)到70%后,就有可能進(jìn)入不穩(wěn)定的狀態(tài)。
這是為什么呢?問題在于,去中心化帶來的tradeoff。
Ceph是去中心化的分布式解決方案,對(duì)象的元數(shù)據(jù)是分布在各臺(tái)物理機(jī)上的。因此所有對(duì)象,是被“偽隨機(jī)”地分配到各個(gè)磁盤上的。偽隨機(jī)不能保證所有磁盤的完全均勻分配,不能降低很多大對(duì)象同時(shí)落在一塊盤上的概率(我理解加入一層PG,又使PG多replica,是可以讓磁盤的方差變小的),因此總有一些磁盤的使用率會(huì)高出均值。
在集群整體使用率不高時(shí),都沒有問題。而在使用率達(dá)到70%后,就需要管理員介入了。因?yàn)榉讲畲蟮谋P,很有可能會(huì)觸及95%這條紅線。admin開始調(diào)低容量過高磁盤的reweight,但如果在這一批磁盤被調(diào)整reweight沒有結(jié)束時(shí),又有一些磁盤被寫滿了,那管理員就必須被迫在Ceph沒有達(dá)到穩(wěn)定狀態(tài)前,又一次reweight過高的磁盤。 ?這就導(dǎo)致了crushmap的再一次變更,從而導(dǎo)致Ceph離穩(wěn)定狀態(tài)越來越遠(yuǎn)。而此時(shí)擴(kuò)容又不及時(shí)的話,更是雪上加霜。
而且之前的crushmap的中間狀態(tài),也會(huì)導(dǎo)致一些PG遷移了一半,這些“不完整的”PG并不會(huì)被馬上刪除,這給本來就緊張的磁盤空間又加重了負(fù)擔(dān)。
有同學(xué)可能會(huì)好奇,一塊磁盤滿了,Ceph為什么就不可用了。Ceph還真的就是這樣設(shè)計(jì)的,因?yàn)镃eph沒法保證新的對(duì)象是否落在空盤而不落在滿盤,所以Ceph選擇在有盤滿了時(shí),就拒絕服務(wù)。
在我咨詢了一些同事和業(yè)界同行后,基本上大家的Ceph集群都是在達(dá)到50%使用率時(shí),就要開始準(zhǔn)備擴(kuò)容了。這其實(shí)是挺不省錢的,因?yàn)楸仨毧罩靡淮笈鷻C(jī)器的存儲(chǔ)資源。并且未來集群的規(guī)模越大,空置效應(yīng)就會(huì)放得越大,意味著浪費(fèi)的錢/電費(fèi)越多。
而很多傳統(tǒng)的中心化的分布式存儲(chǔ)系統(tǒng),由于寫入時(shí)可以由主控節(jié)點(diǎn)選擇相對(duì)空閑的機(jī)器進(jìn)行寫入,因此不會(huì)存在某些磁盤滿了,導(dǎo)致整個(gè)集群不可寫入的問題。也正是如此,才可以做到整體寫入到95%了,仍然保持可用性。
我沒有真正核算過這種效應(yīng)帶來的成本waste,但至少看上去是有點(diǎn)不夠完美的。
打個(gè)比方,當(dāng)我預(yù)估有50pb的存儲(chǔ)時(shí),需要300臺(tái)物理機(jī)了,我居然要提前采購(gòu)好另外200-300臺(tái)物理機(jī),還不能馬上用上,還要插上電。
因此Ceph也并不一定會(huì)很便宜,去中心化的分布式存儲(chǔ)也并沒有那么美好。
但中心化的危害,似乎又是沒有爭(zhēng)議的問題(單點(diǎn)問題、中心節(jié)點(diǎn)擴(kuò)展性問題等等 ),因此分布式里真的沒有銀彈,只有tradeoff。
還有一種辦法,就是Ceph的集群按整個(gè)pool來擴(kuò)容,一個(gè)pool滿了,就不擴(kuò)容了,開新的pool,新的對(duì)象只準(zhǔn)寫新的pool,老的pool的對(duì)象可以刪除,可以讀取。 這乍看之下是一個(gè)很棒的解決方案,但仔細(xì)想想,這和HDFS的federation,和MySQL的分庫(kù)分表,做前端的大Hash,似乎沒有區(qū)別。
這也就談不上是“無限擴(kuò)容”了,而且還需要寫一個(gè)前面的路由層。
三、穩(wěn)定,可駕馭,好運(yùn)維
這個(gè)穩(wěn)定好運(yùn)維,基本就看團(tuán)隊(duì)的硬實(shí)力了。對(duì)開源軟件是否熟悉,是否有經(jīng)驗(yàn),真的會(huì)有很大不同。
同時(shí),這還受開源社區(qū)文檔質(zhì)量的影響。Ceph的開源社區(qū)還是不錯(cuò)的,Red Hat收購(gòu)并主導(dǎo)了Ceph之后,重新整理了Red Hat版本的Ceph文檔,我認(rèn)為讀起來邏輯感更強(qiáng)。
在公司內(nèi)積累自己的運(yùn)維文檔也很關(guān)鍵。一個(gè)新手很可能會(huì)犯很多錯(cuò)誤,導(dǎo)致事故發(fā)生。但對(duì)于公司,踩了一次的坑,就盡量不要再踩第二次了。這對(duì)公司的技術(shù)積累管理、技術(shù)文檔管理、核心人才流失管理,都產(chǎn)生了一些挑戰(zhàn)。
我在Ceph運(yùn)維中,曾遇到一個(gè)棘手的問題。即Ceph集群達(dá)到了80%后,經(jīng)常有磁盤變滿,然后管理員就要介入,調(diào)低過高磁盤的reweight。而在這臺(tái)磁盤使用量沒降下來之前,又有更多的磁盤被寫滿了,管理員就又要介入,又調(diào)整reweight,Ceph至此就再也沒有進(jìn)入過穩(wěn)定狀態(tài)了,管理員還必須時(shí)時(shí)刻刻盯著集群。這導(dǎo)致了極大的運(yùn)維投入,所以像這種事情一定要避免,這對(duì)運(yùn)維人員的士氣是很大的傷害。
那么,是否應(yīng)該在早期進(jìn)行容量預(yù)警,啟動(dòng)采購(gòu)流程呢?
可是這樣做,又回到了資源浪費(fèi)的問題上。
此外,Ceph的對(duì)象是沒有l(wèi)ast_access_time這種元數(shù)據(jù)的,因此Ceph對(duì)象的冷/熱之分,需要二次開發(fā),做額外的工作。集群大了之后,如何清理垃圾數(shù)據(jù)、如何歸檔冷數(shù)據(jù),也帶來了不小的挑戰(zhàn)。
總結(jié)思考
1、Ceph確實(shí)有無限擴(kuò)容的能力,但需要良好的初始規(guī)劃,擴(kuò)容過程也并不完美。中心化造就了擴(kuò)容的上限是單臺(tái)master結(jié)點(diǎn)的物理極限,造就了無限擴(kuò)容的理論基礎(chǔ),但實(shí)際擴(kuò)容時(shí),服務(wù)質(zhì)量會(huì)受嚴(yán)重制約。
2、Ceph有些浪費(fèi)硬件,成本核算時(shí)要考慮更多。
3、Ceph本身的去中心化設(shè)計(jì)犧牲了不少元數(shù)據(jù),比如lastacesstime,這給未來數(shù)據(jù)治理帶來了壓力,也需要更強(qiáng)的團(tuán)隊(duì)來運(yùn)維和二次開發(fā)。積累運(yùn)維經(jīng)驗(yàn),積累運(yùn)維團(tuán)隊(duì),是駕馭好開源分布式存儲(chǔ)的核心。對(duì)手隨著時(shí)間越來越強(qiáng)大,應(yīng)對(duì)的運(yùn)維團(tuán)隊(duì)也需要越來越好,才能讓生產(chǎn)關(guān)系匹配生產(chǎn)力的要求。
4、技術(shù)本身沒有絕對(duì)的好壞,不同的技術(shù)是用來解決不同問題的。但在場(chǎng)景下,技術(shù)是有好壞的。因?yàn)樵趫?chǎng)景下,你有了立場(chǎng),就有了亟待解決的問題的優(yōu)先級(jí),也就一定能按優(yōu)先級(jí)選擇出最適合你的技術(shù)。
評(píng)論
查看更多