黃遵祥,朱磊基,熊勇
(中國(guó)科學(xué)院上海微系統(tǒng)與信息技術(shù)研究所 中國(guó)科學(xué)院無(wú)線(xiàn)傳感網(wǎng)與通信重點(diǎn)實(shí)驗(yàn)室, 上海 201800; 中國(guó)科學(xué)院大學(xué), 北京 100049)
如今,越來(lái)越多的商業(yè)公司使用分布式存儲(chǔ)系統(tǒng)解決PB級(jí)數(shù)據(jù)存儲(chǔ)問(wèn)題[1]。而分布式存儲(chǔ)系統(tǒng)Ceph作為軟件定義存儲(chǔ)的代表,被設(shè)計(jì)為可在眾多主流商用硬件上運(yùn)行,因此具有部署成本低、擴(kuò)展性高等優(yōu)點(diǎn)[2-3],從而得到廣泛應(yīng)用。
與目前其他一些熱門(mén)的分布式存儲(chǔ)系統(tǒng)相比,當(dāng)需要對(duì)小文件進(jìn)行頻繁修改時(shí),Ceph比Hadoop表現(xiàn)更為出色[4];相比較GlusterFS(gluster file system),Ceph在系統(tǒng)擴(kuò)容、縮容時(shí)對(duì)整個(gè)集群的數(shù)據(jù)服務(wù)影響更小[5];與Sheepdog支持單一的存儲(chǔ)接口相比,Ceph同時(shí)提供主流的3種存儲(chǔ)接口等[6-7]。雖然與其他熱門(mén)的分布式存儲(chǔ)系統(tǒng)相比Ceph具有上述的很多優(yōu)勢(shì),但其本身依然存在不足,以Intel為代表的商用硬件供應(yīng)商對(duì)Ceph讀寫(xiě)性能的測(cè)試結(jié)果表明[8]:?jiǎn)尉€(xiàn)程下Ceph寫(xiě)入速度只有原生磁盤(pán)的3.6%,在多線(xiàn)程條件下也只能達(dá)到原生磁盤(pán)的10%。究其寫(xiě)性能不理想的主要原因是Ceph的多副本強(qiáng)一致性寫(xiě)入機(jī)制[3],即主副本要在本地寫(xiě)入完成后,還要等待其余從副本寫(xiě)入完成,當(dāng)所有副本都寫(xiě)入完成,才會(huì)向客戶(hù)端返回最終的寫(xiě)入完成。這種多副本強(qiáng)一致性寫(xiě)入機(jī)制雖然保證了數(shù)據(jù)的安全性和可靠性,但也嚴(yán)重影響了集群的寫(xiě)性能,同時(shí)由于各副本寫(xiě)入速度的不盡相同,并且如遇到如網(wǎng)絡(luò)擁塞、從副本所在的OSD出現(xiàn)故障等問(wèn)題,會(huì)導(dǎo)致整個(gè)集群的寫(xiě)延遲出現(xiàn)劇烈波動(dòng),從而影響集群的穩(wěn)定性和魯棒性。
針對(duì)Ceph寫(xiě)性能不理想的問(wèn)題,文獻(xiàn)[8]優(yōu)化了Ceph后端存儲(chǔ)引擎FileStore,實(shí)現(xiàn)的nojournal-block模型用于提高系統(tǒng)的IO性能。從Jewel版本開(kāi)始,Ceph引入BlueStore取代傳統(tǒng)存儲(chǔ)引擎FileStore,用于緩解寫(xiě)放大問(wèn)題,并針對(duì)SSD進(jìn)行優(yōu)化,目前社區(qū)已經(jīng)推薦在生產(chǎn)環(huán)境中使用BlueStore。
文獻(xiàn)[9]提出一種根據(jù)不同的讀寫(xiě)操作比例,決定最終副本同步與異步更新比例的方法。首先統(tǒng)計(jì)在一定時(shí)間內(nèi)讀寫(xiě)操作的數(shù)量,通過(guò)不同數(shù)量的對(duì)比,決定當(dāng)前同步執(zhí)行寫(xiě)操作的副本數(shù)量,從而實(shí)現(xiàn)寫(xiě)操作占IO操作數(shù)比例越多,寫(xiě)延遲越小的特性。
文獻(xiàn)[10]提出當(dāng)主副本OSD完成數(shù)據(jù)的日志盤(pán)和數(shù)據(jù)盤(pán)寫(xiě)入后,向客戶(hù)端返回寫(xiě)完成的改進(jìn)方法,即主副本在完成本地事務(wù)的寫(xiě)入數(shù)據(jù)盤(pán)操作后,才向客戶(hù)端返回寫(xiě)完成。在該方法中如遇到數(shù)據(jù)盤(pán)寫(xiě)入失敗也可以從日志盤(pán)進(jìn)行恢復(fù)并重新寫(xiě)入,所以日志盤(pán)成功寫(xiě)入即可保證數(shù)據(jù)最終一定會(huì)寫(xiě)入數(shù)據(jù)盤(pán)。
文獻(xiàn)[11]提出一種基于分布式哈希環(huán)的多副本弱一致性模型。該方法在一定程度上降低了寫(xiě)延遲,但在復(fù)雜的應(yīng)用場(chǎng)景下該方法提高Ceph寫(xiě)入速度的效果并不明顯,同時(shí)Ceph以對(duì)存儲(chǔ)數(shù)據(jù)的高可用著稱(chēng),但該多副本弱一致性模型可能會(huì)影響數(shù)據(jù)安全性和高可靠性。
文獻(xiàn)[12]研究了網(wǎng)絡(luò)配置對(duì)Ceph讀寫(xiě)性能的影響,底層使用SSD的存儲(chǔ)集群則推薦使用至少能提供10Gbps的網(wǎng)絡(luò)配置,才能發(fā)揮最佳系統(tǒng)性能;文獻(xiàn)[13]分析了Ceph的CRUSH(controlled replication under scalable hashing)算法中各項(xiàng)參數(shù)對(duì)集群讀寫(xiě)性能的影響;文獻(xiàn)[14]通過(guò)引入多流水線(xiàn)算法,每條流水線(xiàn)中包含一個(gè)生產(chǎn)者進(jìn)程和一個(gè)消費(fèi)者進(jìn)程,利用多核CPU實(shí)現(xiàn)大文件IO性能的提升;文獻(xiàn)[15]通過(guò)設(shè)計(jì)SFPS (small file process system)框架,包括消除重復(fù)數(shù)據(jù)中的副本、合并相似小文件和引入數(shù)據(jù)緩存,提高CephFS的IO性能。
上述研究雖然在一定程度上提高了Ceph集群的寫(xiě)性能,但同時(shí)也引入了很多新的問(wèn)題,比如讀寫(xiě)機(jī)制還有優(yōu)化空間、寫(xiě)機(jī)制改進(jìn)后破壞了Ceph對(duì)數(shù)據(jù)安全性和高可靠性保證、在實(shí)際部署中優(yōu)化效果不明顯等問(wèn)題。因此本文對(duì)基于雙控節(jié)點(diǎn)的Ceph進(jìn)行研究,通過(guò)改進(jìn)多副本強(qiáng)一致性寫(xiě)入機(jī)制,提高集群寫(xiě)入性能。同時(shí)為保證數(shù)據(jù)依然具有安全性和高可靠性,集群使用雙控制器雙存儲(chǔ)陣列節(jié)點(diǎn),確保集群內(nèi)部不需要通過(guò)數(shù)據(jù)遷移來(lái)實(shí)現(xiàn)多副本的存儲(chǔ)需求,降低節(jié)點(diǎn)間數(shù)據(jù)傳輸流量和副本磁盤(pán)讀寫(xiě)流量,實(shí)現(xiàn)數(shù)據(jù)服務(wù)的不間斷和集群狀態(tài)的快速恢復(fù)。
本文在Ceph基本架構(gòu)基礎(chǔ)上提出改進(jìn)算法,可將Ceph中的節(jié)點(diǎn)按照不同功能分成3類(lèi):
1)Monitor節(jié)點(diǎn)(MON),負(fù)責(zé)收集、整理和分發(fā)集群的各類(lèi)映射表。從Luminous版本開(kāi)始,Ceph增加了全新的Manager節(jié)點(diǎn)(MGR),負(fù)責(zé)實(shí)時(shí)追蹤集群狀態(tài)和集群各類(lèi)參數(shù)的統(tǒng)計(jì)[1]。
2)Object Storage Device節(jié)點(diǎn)(OSD),負(fù)責(zé)數(shù)據(jù)的最終存儲(chǔ),同時(shí)還提供數(shù)據(jù)復(fù)制、恢復(fù)和再平衡等功能[16]。
3)MetaData Sever節(jié)點(diǎn)(MDS),主要用于在CephFS(Ceph file storage)中對(duì)元數(shù)據(jù)進(jìn)行管理[3]。
以上只是從功能角度對(duì)節(jié)點(diǎn)進(jìn)行分類(lèi),可在同一臺(tái)物理服務(wù)器上運(yùn)行多個(gè)服務(wù)進(jìn)程實(shí)現(xiàn)上述的多種功能,從而對(duì)外提供不同的服務(wù)。
同時(shí)Ceph通過(guò)引入池(Pool)的概念,Pool中存放若干歸置組(placement group,PG)。Ceph通過(guò)執(zhí)行2次映射實(shí)現(xiàn)數(shù)據(jù)尋址:第1次靜態(tài)映射,輸入是任意類(lèi)型的數(shù)據(jù),按照默認(rèn)4 M大小進(jìn)行切割、編號(hào),通過(guò)偽隨機(jī)哈希函數(shù)生成對(duì)應(yīng)的PGID[2];第2次實(shí)現(xiàn)PG與OSD的相互映射,除了PGID,輸入還需要集群拓?fù)浜拖鄳?yīng)的CRUSH規(guī)則作為哈希函數(shù)的輸入[4],最終得到一組OSD列表,即該數(shù)據(jù)對(duì)象的所有副本存儲(chǔ)位置。
Ceph可采用多副本或糾刪碼方式維護(hù)數(shù)據(jù)的安全性[17],本文以多副本存儲(chǔ)方式為例,當(dāng)客戶(hù)端發(fā)起一個(gè)寫(xiě)請(qǐng)求時(shí),Ceph的數(shù)據(jù)寫(xiě)入流程如圖1所示。由于采用的是多副本強(qiáng)一致性寫(xiě)入機(jī)制[3],客戶(hù)端首先通過(guò)上述數(shù)據(jù)尋址過(guò)程,得到該數(shù)據(jù)對(duì)象最終存儲(chǔ)的OSD列表,然后與列表中第一個(gè)OSD,即主副本OSD,發(fā)起寫(xiě)請(qǐng)求;主副本OSD收到后分別向其余從副本OSD發(fā)起相應(yīng)事務(wù),并開(kāi)始本地寫(xiě),當(dāng)主副本OSD收到其余從副本OSD的寫(xiě)入日志盤(pán)完成,并且本地也完成后,向客戶(hù)端返回寫(xiě)入日志盤(pán)完成;當(dāng)主副本OSD收到其余從副本OSD的寫(xiě)入數(shù)據(jù)盤(pán)完成應(yīng)答,并且本地也完成后,最終向客戶(hù)端返回寫(xiě)入數(shù)據(jù)盤(pán)完成應(yīng)答。
圖1 Ceph數(shù)據(jù)寫(xiě)入流程
(1)
各副本寫(xiě)延遲如公式1所示,式中:TOSD1、TOSD2和TOSD3分別代表主副本OSD1、從副本OSD2和從副本OSD3的寫(xiě)延遲,三者在時(shí)間軸上是并列關(guān)系;trp代表Request preprocessing,請(qǐng)求預(yù)處理階段;ttd代表Transaction dispatch,各從副本事務(wù)分發(fā)階段;twj代表Write journal,寫(xiě)入日志盤(pán)階段;twd代表Write disk,寫(xiě)入數(shù)據(jù)盤(pán)階段;tcs代表Completion status collection,各副本事務(wù)完成情況收集及各類(lèi)回調(diào)操作階段。
因此可以發(fā)現(xiàn),只有當(dāng)所有副本都寫(xiě)入完成才向客戶(hù)端返回,同時(shí)由于各副本寫(xiě)入速度的不盡相同,并且如遇到網(wǎng)絡(luò)擁塞、從副本所在的OSD出現(xiàn)故障等問(wèn)題,無(wú)法確保從副本OSD及時(shí)完成相應(yīng)事務(wù)。因此,本文主要研究在保證數(shù)據(jù)安全性和高可靠性的基礎(chǔ)上,對(duì)上述的Ceph數(shù)據(jù)寫(xiě)入機(jī)制進(jìn)行優(yōu)化。
為保證寫(xiě)入機(jī)制優(yōu)化后,Ceph數(shù)據(jù)存儲(chǔ)依然具有安全性和高可靠性,同時(shí)為避免存儲(chǔ)節(jié)點(diǎn)控制器出現(xiàn)故障時(shí),集群需要通過(guò)數(shù)據(jù)遷移實(shí)現(xiàn)多副本存儲(chǔ)需求,集群使用雙控制器雙存儲(chǔ)陣列節(jié)點(diǎn),雙控作為2個(gè)不同的OSD為集群提供數(shù)據(jù)存儲(chǔ)服務(wù)。采用雙控節(jié)點(diǎn)的分布式集群架構(gòu)如圖2所示。
圖2 雙控節(jié)點(diǎn)分布式集群架構(gòu)
節(jié)點(diǎn)正常工作時(shí),雙控分別控制著各自的存儲(chǔ)陣列,并作為2個(gè)不同的OSD為集群提供數(shù)據(jù)存儲(chǔ)服務(wù),當(dāng)雙控中一個(gè)控制器出現(xiàn)故障時(shí),該節(jié)點(diǎn)另一個(gè)伙伴控制器創(chuàng)建新的OSD進(jìn)程并快速接管故障控制器的存儲(chǔ)陣列,此時(shí)2個(gè)OSD進(jìn)程運(yùn)行在同一控制器上。為實(shí)現(xiàn)上述操作,首先需要區(qū)分出現(xiàn)的故障類(lèi)型,節(jié)點(diǎn)故障分為臨時(shí)性故障和永久性故障[12]:前者包括主機(jī)重啟等,后者包括控制器損壞、磁盤(pán)損壞等。由于OSD之間通過(guò)周期性的心跳檢測(cè),監(jiān)控彼此的狀態(tài),當(dāng)超過(guò)一定時(shí)間閾值沒(méi)有收到雙控中另一個(gè)伙伴OSD的心跳消息,則向Monitor上報(bào)該OSD的失聯(lián)信息,同時(shí),該控制器開(kāi)始嘗試接管故障控制器的存儲(chǔ)陣列。在集群配置時(shí),需要設(shè)置mon_osd_down_out_ subtree_limit配置項(xiàng),用來(lái)限制當(dāng)集群在出現(xiàn)故障時(shí),集群進(jìn)行自動(dòng)數(shù)據(jù)遷移的粒度。因?yàn)槿绻l(fā)生的是永久性故障中的控制器故障,底層磁盤(pán)上的數(shù)據(jù)都是完好的,可以通過(guò)雙控中另一個(gè)伙伴控制器啟動(dòng)新的OSD進(jìn)程,接管故障控制器的存儲(chǔ)陣列實(shí)現(xiàn)集群數(shù)據(jù)的快速恢復(fù),從而避免通過(guò)數(shù)據(jù)遷移實(shí)現(xiàn)多副本存儲(chǔ)。
因此雙控節(jié)點(diǎn)接管故障控制器存儲(chǔ)陣列的操作主要步驟如下:
步驟1:確定同節(jié)點(diǎn)另一個(gè)控制器故障,通過(guò)OSD間周期性的心跳檢測(cè),監(jiān)控彼此的狀態(tài),當(dāng)超過(guò)一定時(shí)間閾值沒(méi)有收到雙控中另一個(gè)伙伴OSD的心跳消息就執(zhí)行步驟2;
步驟2:開(kāi)始嘗試接管故障控制器的存儲(chǔ)陣列,首先讀取存儲(chǔ)陣列中的引導(dǎo)數(shù)據(jù)(bootstrap)用于身份驗(yàn)證,具體引導(dǎo)數(shù)據(jù)如表1所示。接著創(chuàng)建tmpfs文件系統(tǒng),并掛載到當(dāng)前控制器OS中的OSD directory中,通過(guò)使用ceph_bluestore_ tool獲取啟動(dòng)故障OSD需要的元數(shù)據(jù)信息(這些元數(shù)據(jù)存儲(chǔ)在label中),并寫(xiě)入工作目錄中,接下來(lái)創(chuàng)建設(shè)備文件軟鏈接并變更設(shè)備的所有者和所有組,最后通過(guò)systemctl注冊(cè)系統(tǒng)服務(wù),故障控制器存儲(chǔ)陣列對(duì)應(yīng)的OSD進(jìn)程即可創(chuàng)建成功,并在同節(jié)點(diǎn)的伙伴控制器上開(kāi)始執(zhí)行;
表1 通過(guò)讀取的OSD引導(dǎo)數(shù)據(jù)
步驟3:對(duì)重新啟動(dòng)的OSD上存儲(chǔ)的所有PG進(jìn)行數(shù)據(jù)一致性檢查,從而確保各副本數(shù)據(jù)的完全相同。
在雙控節(jié)點(diǎn)存儲(chǔ)架構(gòu)基礎(chǔ)上,將Ceph寫(xiě)入機(jī)制優(yōu)化為主副本OSD在本地寫(xiě)入日志盤(pán)后,就向客戶(hù)端返回寫(xiě)完成。之后主副本OSD本地寫(xiě)入數(shù)據(jù)盤(pán)的完成情況、其余從副本OSD寫(xiě)入日志盤(pán)完成應(yīng)答(applied)和從副本OSD寫(xiě)入數(shù)據(jù)盤(pán)完成應(yīng)答(committed)則由主副本OSD在后臺(tái)繼續(xù)收集并完成后續(xù)各類(lèi)回調(diào)操作。優(yōu)化后的寫(xiě)入機(jī)制如圖3所示。
圖3 優(yōu)化后的寫(xiě)入機(jī)制
T=trp+ttd+twj.
(2)
優(yōu)化后寫(xiě)延遲如公式2所示,式中:T代表從主副本OSD收到客戶(hù)端發(fā)送的寫(xiě)請(qǐng)求到向客戶(hù)端返回最終寫(xiě)完成的時(shí)延;其余符號(hào)含義如公式1所示。
優(yōu)化后寫(xiě)入機(jī)制具體步驟如下:
步驟1:客戶(hù)端首先對(duì)需要操作的數(shù)據(jù)計(jì)算出32位哈希值作為對(duì)象標(biāo)識(shí),并作為輸入通過(guò)ceph_stable_mod計(jì)算出Pool中承載該對(duì)象的PG,然后通過(guò)CRUSH算法,得到該操作對(duì)象存放的主副本OSD,最終通過(guò)send_message向該OSD發(fā)送寫(xiě)請(qǐng)求;
步驟2:主副本OSD收到客戶(hù)端發(fā)送的寫(xiě)請(qǐng)求后,首先將message封裝成一個(gè)op,根據(jù)其中的PGID信息插入到對(duì)應(yīng)的op_shardedwq隊(duì)列,最終由osd_op_tp線(xiàn)程池中的線(xiàn)程開(kāi)始步驟3的處理;
步驟3:該op首先通過(guò)do_request和do_op完成一系列檢查,前者完成PG層的檢查,后者完成包括初始化其中各種標(biāo)志位、op合法性校驗(yàn)和最重要的獲取操作對(duì)象上下文(ObjectContext),并創(chuàng)建OpContext用于承接客戶(hù)端對(duì)op的所有操作,并對(duì)該op后續(xù)執(zhí)行情況進(jìn)行追蹤;
步驟4:通過(guò)execute_ctx執(zhí)行步驟3中生成的OpContext。步驟4~步驟6都是在execute_ctx中執(zhí)行,首先需要進(jìn)行PG Transaction準(zhǔn)備,PG Transaction中封裝了一系列對(duì)原始對(duì)象的處理步驟,并和日志共同保證數(shù)據(jù)存儲(chǔ)的一致性。PG Transaction準(zhǔn)備階段包括:將op中的每個(gè)處理步驟轉(zhuǎn)化為PG Transaction中的操作,接著判斷是否需要對(duì)原始對(duì)象進(jìn)行快照,最后生成日志并更新操作對(duì)象的OI(Object Info)和SS(Snap Set)屬性;
步驟5:接著將PG Transaction轉(zhuǎn)化為各個(gè)副本的本地事務(wù)(ObjectStore Transaction),從而保證各副本的本地一致性,接著由issue_repop執(zhí)行副本間Transaction分發(fā),同時(shí)將其加入waiting_for_applied和waiting_for_commit兩個(gè)隊(duì)列中;
步驟6:當(dāng)主副本OSD調(diào)用本地存儲(chǔ)引擎后端寫(xiě)入日志盤(pán)后,主副本OSD回調(diào)執(zhí)行先前在OpContext中注冊(cè)的on_applied和on_committed回調(diào)函數(shù),即向客戶(hù)端返回寫(xiě)完成;
步驟7:各從副本OSD收到主副本OSD發(fā)送的寫(xiě)請(qǐng)求對(duì)應(yīng)的本地事務(wù)(ObjectStore transaction)后,調(diào)用本地存儲(chǔ)引擎后端分別執(zhí)行寫(xiě)入日志盤(pán)和數(shù)據(jù)盤(pán),對(duì)應(yīng)操作完成后向主副本OSD返回相應(yīng)完成應(yīng)答;
步驟8:主副本OSD收到從副本OSD返回的寫(xiě)入日志盤(pán)完成應(yīng)答(applied)或?qū)懭霐?shù)據(jù)盤(pán)完成應(yīng)答(committed)后,通過(guò)eval_repop,在waiting_for_applied或waiting_for_commit隊(duì)列上刪除對(duì)應(yīng)事務(wù),并不斷檢查waiting_for_applied和waiting_for_commit是否為空,重點(diǎn)檢查waiting_for_commit隊(duì)列,如果發(fā)生waiting_for_ commit為空,而waiting_for_applied不為空的情況,那么就直接清空waiting_for_applied中未完成的OSD,并執(zhí)行其余回調(diào)函數(shù),最終清理和釋放OpContext。
通過(guò)上述優(yōu)化后的寫(xiě)入機(jī)制,數(shù)據(jù)成功寫(xiě)入主副本OSD的日志盤(pán)(journal)后,就向客戶(hù)端返回寫(xiě)完成,消除了公式1中TOSD1的twd+tcs、TOSD2和TOSD3的寫(xiě)入延遲,從而降低非必要寫(xiě)操作對(duì)集群寫(xiě)性能的影響。
優(yōu)化后的Ceph數(shù)據(jù)可用性主要體現(xiàn)在以下3個(gè)方面:節(jié)點(diǎn)控制器故障時(shí)數(shù)據(jù)可用性保證、存儲(chǔ)陣列或磁盤(pán)故障時(shí)數(shù)據(jù)可用性保證、節(jié)點(diǎn)電源或網(wǎng)卡故障時(shí)數(shù)據(jù)可用性保證。下面分別進(jìn)行闡述:
1)節(jié)點(diǎn)控制器故障時(shí)數(shù)據(jù)可用性保證:對(duì)于OSD在執(zhí)行數(shù)據(jù)寫(xiě)入過(guò)程中,若控制器發(fā)生故障,可通過(guò)節(jié)點(diǎn)雙控雙存儲(chǔ)陣列模式,有效確保數(shù)據(jù)的安全性和高可靠性。具體情況分析及相應(yīng)處理機(jī)制如下:
①如果當(dāng)主副本OSD寫(xiě)入日志盤(pán)前,發(fā)生主副本OSD控制器故障,則會(huì)由同節(jié)點(diǎn)雙控中另一個(gè)伙伴控制器重新拉起該OSD進(jìn)程,并接管故障控制器存儲(chǔ)陣列后通知Monitor,客戶(hù)端通過(guò)Monitor獲取最新的OSDMap后,會(huì)重新發(fā)起本次寫(xiě)請(qǐng)求,并重復(fù)上述優(yōu)化后寫(xiě)入機(jī)制的所有步驟。
②如果當(dāng)從副本OSD寫(xiě)入日志盤(pán)前,發(fā)生從副本OSD控制器故障,則會(huì)由同節(jié)點(diǎn)雙控中另一個(gè)伙伴控制器重新拉起該OSD進(jìn)程,并接管故障控制器存儲(chǔ)陣列后通知Monitor,主副本OSD通過(guò)Monitor獲取最新的OSDMap后,重新發(fā)送對(duì)應(yīng)副本的本地事務(wù)(ObjectStore Transaction),從副本OSD收到后,重新調(diào)用后端存儲(chǔ)引擎執(zhí)行寫(xiě)入操作。
③如果當(dāng)主副本OSD寫(xiě)入日志盤(pán)后,并且在寫(xiě)入數(shù)據(jù)盤(pán)完成前,主副本OSD控制器發(fā)生故障,則會(huì)由同節(jié)點(diǎn)雙控中另一個(gè)伙伴控制器重新拉起該OSD進(jìn)程,并接管故障控制器存儲(chǔ)陣列后,將日志盤(pán)中數(shù)據(jù)重新寫(xiě)入數(shù)據(jù)盤(pán),由于重新接管后造成其余從副本OSD上寫(xiě)操作完成狀態(tài)丟失,因此還需要對(duì)操作對(duì)象進(jìn)行一致性檢查。當(dāng)發(fā)現(xiàn)從副本OSD中相應(yīng)數(shù)據(jù)與主副本OSD不一致時(shí),則將主副本OSD中的數(shù)據(jù)作為權(quán)威副本,恢復(fù)從副本OSD中未成功寫(xiě)入的數(shù)據(jù),從而保證各副本數(shù)據(jù)最終一致性。
④如果當(dāng)從副本OSD寫(xiě)入日志盤(pán)后,并且在寫(xiě)入數(shù)據(jù)盤(pán)完成前,從副本OSD控制器發(fā)生故障,則會(huì)由同節(jié)點(diǎn)雙控中另一個(gè)伙伴控制器重新拉起該OSD進(jìn)程,并接管故障控制器存儲(chǔ)陣列后,將其日志盤(pán)中數(shù)據(jù)重新寫(xiě)入數(shù)據(jù)盤(pán),最后還需要向主副本OSD發(fā)送該事務(wù)的寫(xiě)入數(shù)據(jù)盤(pán)完成應(yīng)答(committed)。
通過(guò)上述4種情景分析,雙控節(jié)點(diǎn)在其中一個(gè)控制器故障的情況下,進(jìn)行控制器切換確保了集群內(nèi)部不需要通過(guò)數(shù)據(jù)遷移實(shí)現(xiàn)多副本的存儲(chǔ)需求,降低了節(jié)點(diǎn)間數(shù)據(jù)傳輸流量和副本磁盤(pán)讀寫(xiě)流量,從而確保數(shù)據(jù)服務(wù)的不間斷和集群狀態(tài)的快速恢復(fù)。
2)存儲(chǔ)陣列或磁盤(pán)故障時(shí)數(shù)據(jù)可用性保證:對(duì)存儲(chǔ)陣列故障進(jìn)行分類(lèi),具體情景分析及相應(yīng)處理機(jī)制如下:
①如果只是存儲(chǔ)陣列或磁盤(pán)由于某種原因?qū)е碌谋敬螌?xiě)入失敗,存儲(chǔ)陣列或磁盤(pán)本身并未損壞的情況下,如果是數(shù)據(jù)盤(pán)寫(xiě)入失敗,則由日志盤(pán)(journal)中的對(duì)應(yīng)數(shù)據(jù)進(jìn)行恢復(fù);如果是日志盤(pán)寫(xiě)入失敗,則由日志log恢復(fù)針對(duì)該數(shù)據(jù)對(duì)象的操作步驟,從而實(shí)現(xiàn)對(duì)日志盤(pán)的重新寫(xiě)入。
②如果是由于存儲(chǔ)陣列或磁盤(pán)損壞,導(dǎo)致的數(shù)據(jù)寫(xiě)入失敗,那么此時(shí)該節(jié)點(diǎn)將通過(guò)心跳信號(hào)通知Monitor節(jié)點(diǎn)對(duì)應(yīng)存儲(chǔ)陣列或磁盤(pán)失聯(lián),Monitor節(jié)點(diǎn)間將通過(guò)Paxos算法實(shí)現(xiàn)對(duì)該OSD節(jié)點(diǎn)狀態(tài)一致性確認(rèn)。若最終判定該OSD節(jié)點(diǎn)失聯(lián)時(shí),Monitor會(huì)重新選擇OSD用于放置故障存儲(chǔ)陣列或磁盤(pán)數(shù)據(jù),數(shù)據(jù)恢復(fù)過(guò)程如下:若主副本OSD的數(shù)據(jù)盤(pán)損壞,則從日志盤(pán)進(jìn)行數(shù)據(jù)恢復(fù);若主副本OSD的日志盤(pán)損壞,則先檢測(cè)數(shù)據(jù)盤(pán)有沒(méi)有寫(xiě)入成功,若數(shù)據(jù)盤(pán)沒(méi)有寫(xiě)入成功,則先從日志log恢復(fù)針對(duì)該數(shù)據(jù)對(duì)象的操作步驟,從而實(shí)現(xiàn)對(duì)數(shù)據(jù)盤(pán)的重新寫(xiě)入;若從副本OSD上的存儲(chǔ)陣列或磁盤(pán)出現(xiàn)損壞,則處理為:當(dāng)Monitor重新分配了新的OSD用于恢復(fù)故障存儲(chǔ)陣列或磁盤(pán)數(shù)據(jù)后,首先更新集群Map,當(dāng)主副本OSD收到最新的集群Map后,將重新發(fā)起未完成的從副本寫(xiě)入操作,直到新的從副本OSD返回寫(xiě)入完成應(yīng)答。
3)節(jié)點(diǎn)電源或網(wǎng)卡故障時(shí)數(shù)據(jù)可用性保證:該故障在實(shí)際項(xiàng)目部署中一方面對(duì)服務(wù)器雙電源連接不同容災(zāi)域的供電端口,和對(duì)服務(wù)器雙網(wǎng)卡連接不同網(wǎng)絡(luò)進(jìn)行規(guī)避;另一方面當(dāng)某一節(jié)點(diǎn)出現(xiàn)電源或網(wǎng)卡故障時(shí),即該節(jié)點(diǎn)與外界失聯(lián),與故障節(jié)點(diǎn)建立了心跳連接的節(jié)點(diǎn)會(huì)通過(guò)未周期性收到心跳包而最先感知,之后該節(jié)點(diǎn)會(huì)將失聯(lián)節(jié)點(diǎn)通知Monitor。若最終Monitor判定該節(jié)點(diǎn)失聯(lián)則會(huì)將其下線(xiàn),之后重新分配新的OSD,并更新集群map,在執(zhí)行數(shù)據(jù)恢復(fù)過(guò)程中會(huì)出現(xiàn)以下兩種情況:
①若正在執(zhí)行寫(xiě)入操作數(shù)據(jù)對(duì)象的從副本OSD出現(xiàn)節(jié)點(diǎn)電源或網(wǎng)卡故障:當(dāng)主副本OSD收到更新后的集群map后,將會(huì)由主副本OSD發(fā)起針對(duì)新的從副本OSD數(shù)據(jù)Backfill機(jī)制,直到從副本OSD上數(shù)據(jù)符合系統(tǒng)要求的副本數(shù);
②若正在執(zhí)行寫(xiě)入操作數(shù)據(jù)對(duì)象的主副本OSD出現(xiàn)節(jié)點(diǎn)電源或網(wǎng)卡故障:當(dāng)從副本OSD收到更新后的集群map后,由于從副本OSD無(wú)法確定出現(xiàn)故障的主副本OSD上是否有未完成的三副本數(shù)據(jù)對(duì)象的寫(xiě)操作,因此從副本OSD首先與另一個(gè)從副本OSD就該P(yáng)G上的數(shù)據(jù)達(dá)成一致,即確定該P(yáng)G上數(shù)據(jù)對(duì)象的權(quán)威副本,然后根據(jù)權(quán)威副本恢復(fù)新的主副本OSD上的數(shù)據(jù),直到主副本OSD上的數(shù)據(jù)符合系統(tǒng)要求的副本數(shù)。
該部分通過(guò)VMware創(chuàng)建虛擬機(jī),搭建Ceph集群的方式,對(duì)基于雙控節(jié)點(diǎn)的Ceph寫(xiě)性能優(yōu)化方法進(jìn)行實(shí)驗(yàn),測(cè)試分為驗(yàn)證優(yōu)化后方法的數(shù)據(jù)高可用和評(píng)估優(yōu)化后方法的寫(xiě)性能提升效果。
實(shí)驗(yàn)使用8臺(tái)虛擬機(jī)(node0~node7)搭建Ceph分布式存儲(chǔ)集群,每臺(tái)虛擬機(jī)都運(yùn)行OSD進(jìn)程作為OSD節(jié)點(diǎn)使用,同時(shí)前3臺(tái)虛擬機(jī)還分別運(yùn)行Monitor和Manager進(jìn)程,作為MON節(jié)點(diǎn)和MGR節(jié)點(diǎn)使用[18],還需任選一臺(tái)虛擬機(jī)作為客戶(hù)端節(jié)點(diǎn)。將集群數(shù)據(jù)副本數(shù)設(shè)定為3,所有虛擬機(jī)的系統(tǒng)環(huán)境均為CentOS-7系統(tǒng)。測(cè)試環(huán)境的集群拓?fù)淙鐖D4所示,測(cè)試軟件為Fio,其中IO引擎為libaio。
圖4 實(shí)驗(yàn)集群拓?fù)鋱D
在虛擬機(jī)搭建的Ceph集群中,通過(guò)修改CEUSH map的方式(包括修改Cluster map和Placement rule),將node0與node1、node2與node3、node4與node5、node6與node7分別綁定為伙伴控制器,從而模擬實(shí)際中的雙控制器雙存儲(chǔ)陣列節(jié)點(diǎn)。數(shù)據(jù)可用性測(cè)試主要驗(yàn)證控制器、硬盤(pán)、電源和網(wǎng)卡出現(xiàn)故障時(shí),整個(gè)集群的數(shù)據(jù)讀寫(xiě)是否正常,即客戶(hù)端此時(shí)進(jìn)行任何數(shù)據(jù)讀寫(xiě)是否不受故障影響,測(cè)試結(jié)果如表2所示。
表2 數(shù)據(jù)可用性測(cè)試
優(yōu)化后方法的寫(xiě)性能測(cè)試主要從寫(xiě)延遲、吞吐量和IOPS等3個(gè)方面,對(duì)本文提出的基于雙控節(jié)點(diǎn)的Ceph寫(xiě)性能優(yōu)化方法和Ceph原生多副本強(qiáng)一致性寫(xiě)入機(jī)制進(jìn)行測(cè)試比較,并在數(shù)據(jù)大小分別為4 K、8 K、16 K、64 K、128 K、1 M、2 M和4 M情況下對(duì)測(cè)試結(jié)果進(jìn)行統(tǒng)計(jì)和分析。
如圖5(a)、5(b)所示的是寫(xiě)延遲測(cè)試結(jié)果圖,本組Fio測(cè)試的direct參數(shù)設(shè)置為1,iodepth參數(shù)設(shè)置為1。可以看出,通過(guò)本文提出的基于雙控節(jié)點(diǎn)的Ceph寫(xiě)性能優(yōu)化方法,在不同數(shù)據(jù)大小的情況下,無(wú)論順序?qū)戇€是隨機(jī)寫(xiě),寫(xiě)延遲與Ceph原生機(jī)制相比普遍降低了一半左右,并且隨著寫(xiě)入數(shù)據(jù)塊的增大,對(duì)1 M以上大數(shù)據(jù)塊寫(xiě)延遲降低越明顯,因?yàn)樵贑eph原生的多副本強(qiáng)一致性寫(xiě)入機(jī)制中,主副本OSD需要通過(guò)網(wǎng)絡(luò)為每個(gè)從副本傳輸事務(wù),當(dāng)操作對(duì)象越大時(shí),網(wǎng)絡(luò)傳輸造成的延遲也越大,因此本文提出優(yōu)化方法運(yùn)行在經(jīng)常進(jìn)行大文件讀寫(xiě)的存儲(chǔ)系統(tǒng)中,集群的寫(xiě)延遲表現(xiàn)會(huì)更加出色。
圖5 不同數(shù)據(jù)大小情況下寫(xiě)延遲的比較
如圖6(a)、6(b)所示的是吞吐量測(cè)試結(jié)果圖,本組Fio測(cè)試的direct參數(shù)設(shè)置為1,iodepth參數(shù)設(shè)置為64??梢钥闯?,通過(guò)本文提出的基于雙控節(jié)點(diǎn)的Ceph寫(xiě)性能優(yōu)化方法,在操作16 K以下的小數(shù)據(jù)塊時(shí),順序?qū)懞碗S機(jī)寫(xiě)都有1.5倍性能提升,在數(shù)據(jù)塊大小為64 K和128 K時(shí),隨機(jī)寫(xiě)的吞吐量性能提升了2倍以上,但在順序?qū)憰r(shí),對(duì)1 M以上的大數(shù)據(jù)塊操作效果沒(méi)有小數(shù)據(jù)塊明顯,主要因?yàn)闊o(wú)論是本文提出的優(yōu)化方案還是Ceph原生寫(xiě)入機(jī)制,最終結(jié)果各副本數(shù)據(jù)都需要寫(xiě)入數(shù)據(jù)盤(pán)中,在本文提出的優(yōu)化方案中,如果某一副本本次寫(xiě)操作還未最終寫(xiě)入數(shù)據(jù)盤(pán),下一個(gè)針對(duì)同一對(duì)象的寫(xiě)請(qǐng)求就已經(jīng)到達(dá),那么此時(shí)只有將最新的寫(xiě)請(qǐng)求插入等待隊(duì)列中,等待上一次針對(duì)同一對(duì)象的寫(xiě)請(qǐng)求最終寫(xiě)入數(shù)據(jù)盤(pán)后,才能從隊(duì)列中取出繼續(xù)執(zhí)行,而這種情況的發(fā)生概率在頻繁順序?qū)懭胼^大數(shù)據(jù)塊時(shí)會(huì)增大,因此本文優(yōu)化方案吞吐量的表現(xiàn)與系統(tǒng)對(duì)數(shù)據(jù)的操作特性有較大關(guān)系,如果系統(tǒng)需要頻繁順序操作大數(shù)據(jù)塊,使用本文提出的優(yōu)化方法,在吞吐量上的提升沒(méi)有頻繁操作小數(shù)據(jù)塊效果明顯。
圖6 不同數(shù)據(jù)大小情況下吞吐量的比較
如圖7(a)、7(b)所示的是IOPS測(cè)試結(jié)果圖,本組Fio測(cè)試的direct參數(shù)設(shè)置為1,iodepth參數(shù)設(shè)置為128??梢钥闯?,通過(guò)本文提出的基于雙控節(jié)點(diǎn)的Ceph寫(xiě)性能優(yōu)化方法,在操作16 K以下小數(shù)據(jù)塊時(shí),順序?qū)懶阅芴嵘?.5倍左右,操作128 K以上的大數(shù)據(jù)塊性能提升2倍左右。在隨機(jī)寫(xiě)中IOPS性能提升效果更加明顯,其中操作64 K以上的大數(shù)據(jù)塊性能提升3倍左右,因?yàn)樵诒疚奶岢龅膬?yōu)化方案中,對(duì)于IO操作的完成不需要等待所有副本都完成才向客戶(hù)端返回,當(dāng)主副本OSD寫(xiě)入本地日志盤(pán)后,即可向客戶(hù)端返回寫(xiě)完成,之后主副本OSD本地寫(xiě)入數(shù)據(jù)盤(pán)完成情況、其余從副本OSD寫(xiě)入日志盤(pán)完成應(yīng)答(applied)和從副本OSD寫(xiě)入數(shù)據(jù)盤(pán)完成應(yīng)答(committed)則由主副本OSD在后臺(tái)繼續(xù)收集并完成后續(xù)各類(lèi)回調(diào)操作,從而消除了公式(1)中TOSD1的twd+tcs、TOSD2和TOSD3寫(xiě)入延遲,避免非必要寫(xiě)對(duì)集群IOPS的影響,從而提高單位時(shí)間內(nèi)寫(xiě)操作的完成次數(shù)。
圖7 不同數(shù)據(jù)大小情況下IOPS的比較
本文針對(duì)分布式系統(tǒng)Ceph的多副本強(qiáng)一致性寫(xiě)入機(jī)制造成的寫(xiě)性能不理想問(wèn)題,提出一種基于雙控節(jié)點(diǎn)的Ceph寫(xiě)性能優(yōu)化方法,提高寫(xiě)性能的同時(shí),保證數(shù)據(jù)的安全性和高可靠性。通過(guò)對(duì)實(shí)驗(yàn)測(cè)試結(jié)果的進(jìn)一步分析,保證了數(shù)據(jù)的高可用,并驗(yàn)證本文提出的優(yōu)化方法對(duì)寫(xiě)性能提升的效果。雖然該優(yōu)化方法對(duì)集群中的節(jié)點(diǎn)提出了一定的要求,要求具備雙控雙存儲(chǔ)陣列能力,但卻帶來(lái)了對(duì)數(shù)據(jù)安全性和高可靠性的嚴(yán)格保證,對(duì)Ceph的商業(yè)化應(yīng)用,特別是在國(guó)產(chǎn)平臺(tái)上搭建Ceph具有一定的參考意義。
中國(guó)科學(xué)院大學(xué)學(xué)報(bào)2022年6期