沈佳杰,盧修文,2,3,向 望,趙澤宇,王 新,2,3
(1.復(fù)旦大學(xué)校園信息化辦公室,上海 200433;2.復(fù)旦大學(xué)計(jì)算機(jī)科學(xué)技術(shù)學(xué)院,上海 200433;3.復(fù)旦大學(xué)上海市智能信息處理重點(diǎn)實(shí)驗(yàn)室,上海 200433)
分布式存儲系統(tǒng)[1]廣泛使用讀寫一致性算法來保證數(shù)據(jù)可用性。通過使用特定的協(xié)議,分布式存儲系統(tǒng)保證了用戶讀寫數(shù)據(jù)的一致性。經(jīng)典拜占庭問題[2]存在數(shù)據(jù)篡改[3]的情況,而讀寫一致性問題假定所有節(jié)點(diǎn)都會遵守通信協(xié)議傳輸用戶數(shù)據(jù)[4]。與此同時(shí),通過部署讀寫一致性算法,分布式存儲系統(tǒng)能避免在部分節(jié)點(diǎn)失效情況下出現(xiàn)服務(wù)中斷的問題,從而有效提升存儲數(shù)據(jù)的可用性[5]。
然而,讀寫一致性算法通常會帶來較大的網(wǎng)絡(luò)通信和存儲開銷[4],并降低分布式存儲系統(tǒng)中用戶數(shù)據(jù)訪問的能力。開發(fā)人員研發(fā)分布式存儲系統(tǒng)的過程中需部署滿足存儲應(yīng)用場景需求的讀寫一致性算法,并調(diào)整該算法執(zhí)行機(jī)制。但是,根據(jù)應(yīng)用場景選擇適用的讀寫一致性算法依然具有很大的挑戰(zhàn)性。
首先,各種讀寫一致性算法通常采用不同實(shí)現(xiàn)機(jī)制,需要綜合分析在目標(biāo)應(yīng)用場景中部署特定算法的合理性。其次,由于讀寫一致性算法的數(shù)據(jù)寫入操作性能受到數(shù)據(jù)量和網(wǎng)絡(luò)狀態(tài)等多種因素的影響,需適應(yīng)目標(biāo)應(yīng)用場景的讀寫請求特性和網(wǎng)絡(luò)條件。最后,部署讀寫一致性算法的過程中需要充分了解不同應(yīng)用場景的特點(diǎn),并相應(yīng)地調(diào)整算法的執(zhí)行機(jī)制。
為了幫助開發(fā)人員選擇適合特定應(yīng)用場景的讀寫一致性算法,本文總結(jié)了主流讀寫一致性算法實(shí)現(xiàn)方案,綜述了分布式存儲系統(tǒng)中讀寫一致性算法的實(shí)現(xiàn)機(jī)制,分析了這些實(shí)現(xiàn)機(jī)制對數(shù)據(jù)讀寫操作性能的影響,總結(jié)了在各種存儲應(yīng)用場景中部署讀寫一致性算法需注意的要點(diǎn),主要包括以下內(nèi)容:
(1)介紹了讀寫一致性算法常見的實(shí)現(xiàn)機(jī)制。本文總結(jié)了讀寫一致性算法主要的實(shí)現(xiàn)方案,并歸納了這些實(shí)現(xiàn)方案的優(yōu)缺點(diǎn),總結(jié)了這些算法適用的應(yīng)用場景。在此基礎(chǔ)上,本文分析了分布式存儲系統(tǒng)中部署讀寫一致性算法的關(guān)鍵問題,總結(jié)了分布式存儲系統(tǒng)中讀寫一致性算法對這些問題的解決方法。
(2)綜述了讀寫一致性算法性能優(yōu)化工作。由于副本和糾刪碼作為主要的數(shù)據(jù)可靠性保障機(jī)制被廣泛部署到分布式存儲系統(tǒng),本文綜述了針對這2種存儲機(jī)制構(gòu)建的讀寫一致性算法,比較了這些算法的存儲開銷、容錯(cuò)性能和存儲機(jī)制等特性。
(3)總結(jié)了在不同數(shù)據(jù)存儲應(yīng)用場景中部署讀寫一致性算法需注意的要點(diǎn)。在綜述算法實(shí)現(xiàn)方案的基礎(chǔ)上,本文分析了單數(shù)據(jù)中心分布式存儲系統(tǒng)和跨數(shù)據(jù)中心云際存儲系統(tǒng)2種經(jīng)典應(yīng)用場景中制約執(zhí)行效率的因素,展望了未來分布式存儲系統(tǒng)中讀寫一致性算法性能優(yōu)化工作的研究方向,給出了可能的解決方案。
本節(jié)將介紹讀寫一致性問題、部署讀寫一致性算法的目標(biāo)和面臨的挑戰(zhàn)。
分布式存儲系統(tǒng)廣泛存在節(jié)點(diǎn)失效和網(wǎng)絡(luò)故障,讀寫一致性算法需要保證在部分節(jié)點(diǎn)和網(wǎng)絡(luò)功能失效的情況下數(shù)據(jù)的可用性。不同于拜占庭問題[2]存在數(shù)據(jù)篡改[3]的情況,讀寫一致性問題假設(shè)分布式存儲系統(tǒng)滿足以下條件:
(1)所有的存儲節(jié)點(diǎn)都有可能出現(xiàn)節(jié)點(diǎn)失效和通信故障,無法保證及時(shí)回復(fù)通信消息。
(2)所有在線存儲節(jié)點(diǎn)的通信信息都遵守讀寫一致性協(xié)議的規(guī)定。
圖1展示了一個(gè)包含4個(gè)存儲節(jié)點(diǎn)和3個(gè)用戶的讀寫一致性問題示例[4]。
Figure 1 Consensus problem between multiple storage nodes
由于網(wǎng)絡(luò)可能無法保證所有節(jié)點(diǎn)的連通性,在圖1中,當(dāng)存儲節(jié)點(diǎn)斷開連接后,用戶1和用戶2分別向2個(gè)存儲節(jié)點(diǎn)返回了更新值x=A和x=B。當(dāng)用戶3需要讀取變量x的值時(shí),該用戶將無法確定其當(dāng)前值。
為了避免讀寫數(shù)據(jù)不一致的情況,需要部署讀寫一致性算法來保證數(shù)據(jù)的可用性。具體來說,讀寫一致性算法需要滿足以下特性:
(1)可靠性:在存儲節(jié)點(diǎn)未出現(xiàn)拜占庭錯(cuò)誤的情況下,分布式存儲系統(tǒng)不能回復(fù)錯(cuò)誤信息。
(2)魯棒性:在大部分存儲節(jié)點(diǎn)正常在線并能相互通信的情況下,通過讀寫一致性算法,能保證用戶正常讀寫數(shù)據(jù)。
在此基礎(chǔ)上,開發(fā)人員需要根據(jù)存儲應(yīng)用場景的需求部署相應(yīng)的讀寫一致性算法來保證數(shù)據(jù)讀寫操作的性能。
雖然讀寫一致性算法能夠保證數(shù)據(jù)讀寫操作的正確性,研究人員依然需要根據(jù)應(yīng)用場景選擇合適的讀寫一致性策略。具體來說,部署讀寫一致性算法時(shí)將面臨以下挑戰(zhàn):
(1)為了保證用戶從節(jié)點(diǎn)中讀寫數(shù)據(jù)的正確性,讀寫一致性算法通常要求分布式存儲系統(tǒng)執(zhí)行多次數(shù)據(jù)傳輸操作,以確定存儲節(jié)點(diǎn)的狀態(tài)[3]。這些傳輸操作往往會帶來較大的數(shù)據(jù)讀寫時(shí)延,影響其上在線應(yīng)用對用戶的服務(wù)質(zhì)量。
(2)讀寫一致性算法通常需要復(fù)雜通信協(xié)議。例如,Raft算法[6]需要選舉主節(jié)點(diǎn)來協(xié)調(diào)存儲節(jié)點(diǎn)共同完成數(shù)據(jù)讀寫操作。在跨數(shù)據(jù)中心場景中,在分布式存儲系統(tǒng)選舉出的主節(jié)點(diǎn)網(wǎng)絡(luò)狀態(tài)較差的情況下,主節(jié)點(diǎn)的通信時(shí)延會嚴(yán)重影響讀寫用戶數(shù)據(jù)的性能[7]。
(3)讀寫一致性算法需要保證存儲數(shù)據(jù)的可靠性。在出現(xiàn)部分存儲節(jié)點(diǎn)失效的情況下,讀寫一致性算法需要保證分布式存儲系統(tǒng)能完成數(shù)據(jù)讀寫操作[5]。因此,讀寫一致性算法需要設(shè)計(jì)一定的冗余機(jī)制,保證分布式存儲系統(tǒng)可以穩(wěn)定地向用戶端設(shè)備提供存儲服務(wù)。
本節(jié)簡述3種類型讀寫一致性算法實(shí)現(xiàn)機(jī)制。
基于中心控制的讀寫一致性算法[1]部署額外的控制節(jié)點(diǎn)來保證讀寫數(shù)據(jù)的正確性。由于實(shí)現(xiàn)較為簡單,該類算法被廣泛部署于分布式存儲系統(tǒng)。例如,HDFS(Hadoop Distributed File System)[1]使用名字節(jié)點(diǎn)(Name Node)和數(shù)據(jù)節(jié)點(diǎn)(Data Node)組成主從結(jié)構(gòu)。
為了保證讀寫一致性,控制節(jié)點(diǎn)定義主副本(Primacy Replica)和備用副本(Backup Replica)。分布式存儲系統(tǒng)可以根據(jù)主副本所存儲內(nèi)容來確定當(dāng)前值。即使主副本失效,控制節(jié)點(diǎn)依然能根據(jù)多個(gè)備用副本數(shù)據(jù)確定當(dāng)前值,定義新的主副本,保證數(shù)據(jù)可用性。圖2展示了HDFS存儲系統(tǒng)中3副本數(shù)據(jù)寫入過程[1]。
Figure 2 Write process for three replicas in HDFS
在數(shù)據(jù)寫入過程中,用戶優(yōu)先寫入元數(shù)據(jù)到控制節(jié)點(diǎn),再更新數(shù)據(jù)節(jié)點(diǎn)中副本內(nèi)容。分布式存儲系統(tǒng)讀取主副本來確定當(dāng)前存儲數(shù)據(jù)的值。當(dāng)數(shù)據(jù)失效時(shí),通過讀取備用副本信息和版本信息能夠恢復(fù)出失效的主副本數(shù)據(jù)。
基于中心控制的讀寫一致性算法被廣泛應(yīng)用于早期分布式存儲系統(tǒng),以保證數(shù)據(jù)讀寫一致性,如HDFS[1]和GFS(Google File System)[8]。由于數(shù)據(jù)讀寫過程需要訪問控制節(jié)點(diǎn)存儲的元數(shù)據(jù),控制節(jié)點(diǎn)失效往往會嚴(yán)重影響存儲服務(wù)的可用性。
雖然基于中心控制的讀寫一致性算法能夠保證讀寫數(shù)據(jù)的正確性,但是主副本的存儲節(jié)點(diǎn)往往會成為性能瓶頸,為了保證數(shù)據(jù)寫入的性能,讀寫一致性算法需要引入相應(yīng)的機(jī)制。
此外,基于中心控制的讀寫一致性算法主要通過控制節(jié)點(diǎn)協(xié)調(diào)其他參與節(jié)點(diǎn)來完成數(shù)據(jù)讀寫操作[1],包括兩階段提交協(xié)議2PC(Two-Phase Commit)[9]和三階段提交協(xié)議3PC(Three-Phase Commit)[10]?;谥行目刂频淖x寫一致性算法依然需要在控制節(jié)點(diǎn)失效時(shí)保證分布式存儲系統(tǒng)能夠正確地執(zhí)行數(shù)據(jù)讀寫操作。
為了在控制節(jié)點(diǎn)失效的情況下保證分布式存儲系統(tǒng)依然可以有效地完成數(shù)據(jù)讀寫操作,基于消息傳遞的讀寫一致性算法[5]采用存儲節(jié)點(diǎn)投票的方式來將用戶數(shù)據(jù)寫入存儲節(jié)點(diǎn)。
基于消息傳遞的讀寫一致性算法包括3種類型的節(jié)點(diǎn):提案節(jié)點(diǎn)(Proposer)、仲裁節(jié)點(diǎn)(Acceptor)和學(xué)習(xí)節(jié)點(diǎn)(Learner)。通過滿足以下3個(gè)條件,Paxos算法[5]能保證所有遵守通信協(xié)議的提案(Proposal)執(zhí)行結(jié)果的正確性。
(1)所有提案有唯一的編號。
(2)任意2個(gè)提案P1和P2至少有1個(gè)相同的仲裁者。
(3)對于任意提案P,如果提案P的投票節(jié)點(diǎn)在之前的提案中同意更新變量值,那么提案P設(shè)定的變量值,需要和最近被投過贊成票的提案變量值保持一致。
根據(jù)上述3個(gè)條件,Paxos算法可以構(gòu)建一個(gè)讀寫一致性的提案集合。這里使用單個(gè)變量實(shí)現(xiàn)一個(gè)案例來說明Paxos算法的投票過程。
假設(shè)存儲系統(tǒng)中存在5個(gè)仲裁節(jié)點(diǎn)A、B、C、D和E接收到來自存儲系統(tǒng)中提案節(jié)點(diǎn)的5條提案,提案編號為1,6,13,25和31。
圖3展示了由5個(gè)仲裁節(jié)點(diǎn)參與的Paxos投票過程[5]。其中,用黑體字標(biāo)注的節(jié)點(diǎn)為回復(fù)數(shù)據(jù)值成功執(zhí)行的存儲節(jié)點(diǎn)。這5個(gè)節(jié)點(diǎn)需要在2個(gè)值中選擇1個(gè)值,并將其保存到所有節(jié)點(diǎn)。
Figure 3 Message delivery-based consensus algorithms
提案1:第1個(gè)提案雖然有4個(gè)節(jié)點(diǎn)參與了提案的投票過程,但僅有節(jié)點(diǎn)E確認(rèn)了提案信息。因此,提案1未成功通過仲裁階段,無法更新存儲節(jié)點(diǎn)的變量值。
提案6:由于投票的節(jié)點(diǎn)在之前沒有投過贊成票,提案6可以選擇不同的變量值。但是,只有節(jié)點(diǎn)A確認(rèn)了提案信息,少于半數(shù)以上(即3票),提案6依然沒有通過。
提案13:由于節(jié)點(diǎn)B、C和D之前提案沒有更新過變量值,提案13可以將變量值更新為任意值。本輪節(jié)點(diǎn)B和節(jié)點(diǎn)D確認(rèn)了該提案,但贊成的票數(shù)依然少于半數(shù),提案13未通過。
提案25:由于提案節(jié)點(diǎn)收到3個(gè)節(jié)點(diǎn)A、C和D的確認(rèn)信息,提案25是唯一更新變量值成功的提案。其中,節(jié)點(diǎn)A和節(jié)點(diǎn)E分別在提案6和提案1上更新了數(shù)值且提案6的編號更接近提案25的。提案25更新的變量值應(yīng)當(dāng)與提案6所更新的變量值相同。
提案31:為了保證所有節(jié)點(diǎn)存儲的變量值都相同,存儲節(jié)點(diǎn)需要與其他節(jié)點(diǎn)同步變量值。提案31將已經(jīng)更新的變量值同步到另外2個(gè)節(jié)點(diǎn)。
在上述例子中,通過滿足3個(gè)讀寫一致性條件,分布式存儲系統(tǒng)可以實(shí)現(xiàn)全局提案集合的讀寫一致性。在實(shí)際存儲系統(tǒng)中,提案節(jié)點(diǎn)需要根據(jù)生成的提案編號,保證所有的存儲節(jié)點(diǎn)可以高效地完成相應(yīng)的數(shù)據(jù)更新操作。
為了簡化數(shù)據(jù)寫入過程,Paxos算法采用以下步驟來完成數(shù)據(jù)寫入過程:
(1)準(zhǔn)備階段:提案節(jié)點(diǎn)生成全局唯一的提案編號,向所有的仲裁節(jié)點(diǎn)發(fā)送該編號。仲裁節(jié)點(diǎn)根據(jù)收到的編號信息,判斷是否接受這條提案,相應(yīng)的處理結(jié)果回復(fù)給提案節(jié)點(diǎn)。
(2)仲裁階段:提案節(jié)點(diǎn)向仲裁節(jié)點(diǎn)發(fā)送提案變量值,仲裁節(jié)點(diǎn)接收變量值后返回確認(rèn)信息。當(dāng)收到大部分仲裁節(jié)點(diǎn)對變量值更新的確認(rèn)消息后,提案節(jié)點(diǎn)標(biāo)記該提案已通過。
(3)學(xué)習(xí)階段:提案節(jié)點(diǎn)將更新的變量值發(fā)送到?jīng)]有參與到仲裁過程的其他的學(xué)習(xí)節(jié)點(diǎn),從而完成所有存儲節(jié)點(diǎn)變量值的更新操作。
通過上述步驟,Paxos算法保證了分布式存儲系統(tǒng)讀寫數(shù)據(jù)的正確性。由于讀寫過程中任一節(jié)點(diǎn)都能夠作為提案節(jié)點(diǎn)發(fā)起寫入操作,Paxos算法能夠有效地避免單個(gè)節(jié)點(diǎn)成為性能瓶頸,從而提升數(shù)據(jù)讀寫操作的性能。
圖4展示了Paxos算法執(zhí)行過程示意圖[12]。
Figure 4 Transmission process with Paxos
為了保證全局提案編號的唯一性和有序性,當(dāng)仲裁節(jié)點(diǎn)收到編號為ir的準(zhǔn)備請求后,仲裁節(jié)點(diǎn)將針對接收到的提案作出以下2個(gè)承諾:
(1)仲裁節(jié)點(diǎn)不再接收提案編號ip小于或等于當(dāng)前提案編號的提案請求。
(2)仲裁節(jié)點(diǎn)不再接收提案編號i′r小于當(dāng)前提案編號ir的準(zhǔn)備請求。
雖然基于消息傳遞的讀寫一致性算法可以從理論上保證數(shù)據(jù)讀寫操作的正確性,但是基于消息傳遞的讀寫一致性算法需要較為復(fù)雜的通信規(guī)則,往往會增加實(shí)現(xiàn)算法的難度,難以保證存儲數(shù)據(jù)的可靠性。因此,如何降低Paxos算法實(shí)現(xiàn)的復(fù)雜度,成為了保證數(shù)據(jù)讀寫操作可靠性的關(guān)鍵問題。
基于選舉的讀寫一致性算法[6]通過在在線節(jié)點(diǎn)中確定主節(jié)點(diǎn)的方式來實(shí)現(xiàn)在保證讀寫數(shù)據(jù)正確性的前提下降低算法復(fù)雜性。這里使用Raft算法[6]作為示例來介紹基于選舉的讀寫一致性算法的執(zhí)行過程。通過從在線從節(jié)點(diǎn)中選舉出主節(jié)點(diǎn),Raft算法能夠保證主從節(jié)點(diǎn)之間的讀寫數(shù)據(jù)一致性。
圖5展示了Raft算法主從節(jié)點(diǎn)的示意圖[6]。
Figure 5 Leader and followers node in Raft
Raft算法包括以下3種類型的節(jié)點(diǎn):從節(jié)點(diǎn)、候選節(jié)點(diǎn)和主節(jié)點(diǎn)。
通過在存儲節(jié)點(diǎn)中維護(hù)本地狀態(tài)機(jī),Raft算法使用選舉機(jī)制來實(shí)現(xiàn)每個(gè)存儲節(jié)點(diǎn)在從節(jié)點(diǎn)、候選節(jié)點(diǎn)和主節(jié)點(diǎn)3種類型節(jié)點(diǎn)之間的狀態(tài)轉(zhuǎn)換操作。分布式存儲系統(tǒng)需要周期性地執(zhí)行選舉操作來確定主節(jié)點(diǎn),以協(xié)調(diào)數(shù)據(jù)讀寫操作,從而保證提供持續(xù)的數(shù)據(jù)存儲服務(wù)。
圖6展示了Raft算法選舉過程的狀態(tài)機(jī)[6]。
Figure 6 State machine of Raft algorithm selection process
由圖6可知,Raft算法中的存儲節(jié)點(diǎn)通過以下狀態(tài)轉(zhuǎn)移規(guī)則切換其狀態(tài)類型。
(1)從節(jié)點(diǎn):在分布式存儲系統(tǒng)上線時(shí),所有在線節(jié)點(diǎn)以從節(jié)點(diǎn)狀態(tài)等待進(jìn)入選舉過程。當(dāng)新的選舉周期開始時(shí),從節(jié)點(diǎn)將成為候選節(jié)點(diǎn)參與讀寫一致性算法主節(jié)點(diǎn)投票選舉過程。
(2)候選節(jié)點(diǎn):候選節(jié)點(diǎn)收到大多數(shù)節(jié)點(diǎn)的支持票后將成為主節(jié)點(diǎn)。當(dāng)發(fā)現(xiàn)分布式存儲系統(tǒng)中已經(jīng)存在主節(jié)點(diǎn)或選舉周期過期時(shí),候選節(jié)點(diǎn)將回退成為從節(jié)點(diǎn)等待下一個(gè)選舉周期,再次參與主節(jié)點(diǎn)選舉過程。
(3)主節(jié)點(diǎn):在收到大多數(shù)節(jié)點(diǎn)的支持票時(shí),候選節(jié)點(diǎn)會將自己的狀態(tài)設(shè)置為主節(jié)點(diǎn)。為了保證分布式存儲系統(tǒng)主節(jié)點(diǎn)的唯一性,當(dāng)主節(jié)點(diǎn)在通信過程中發(fā)現(xiàn)存在更高優(yōu)先級的主節(jié)點(diǎn)后,會將自己的狀態(tài)設(shè)為從節(jié)點(diǎn)。
每隔一定周期后,分布式存儲系統(tǒng)會重新選舉主節(jié)點(diǎn),負(fù)責(zé)協(xié)調(diào)存儲節(jié)點(diǎn)處理用戶端發(fā)出的數(shù)據(jù)讀寫請求。
圖7展示了Raft算法周期示意圖[6]。
Figure 7 Terms of selection process in Raft algorithm
雖然Raft算法可以通過選舉過程確定主節(jié)點(diǎn)來解決讀寫一致性問題,分布式存儲系統(tǒng)依然需要通過讀寫主節(jié)點(diǎn)存儲的內(nèi)容來確定保存在分布式存儲系統(tǒng)中的各個(gè)變量的當(dāng)前值。
Raft算法使用復(fù)制狀態(tài)機(jī)來保證所有的主從節(jié)點(diǎn)數(shù)據(jù)的一致性。圖8展示了Raft算法日志數(shù)據(jù)提交過程[6],包括3個(gè)存儲節(jié)點(diǎn)和2個(gè)變量,變量x和變量y。每一個(gè)日志項(xiàng)包括2部分內(nèi)容,提交時(shí)的周期值和變量的改變值。這里將3個(gè)節(jié)點(diǎn)分別記為主節(jié)點(diǎn)、從節(jié)點(diǎn)1和從節(jié)點(diǎn)2。
Figure 8 Submission process of Raft algorithm log data
在圖8中,使用深淺不同的顏色表示在各個(gè)周期中用戶端設(shè)備提交的數(shù)據(jù)寫入請求。為了提升Raft算法的執(zhí)行效率,不同于經(jīng)典的兩階段提交算法,狀態(tài)機(jī)復(fù)制過程中不要求所有在線節(jié)點(diǎn)存儲的日志數(shù)據(jù)都為當(dāng)前最新版本,僅需保證多數(shù)節(jié)點(diǎn)確認(rèn)數(shù)據(jù)寫入,即認(rèn)為存儲系統(tǒng)已提交了變量值。在用戶訪問主節(jié)點(diǎn)存在較大時(shí)延的情況下,主節(jié)點(diǎn)會成為整個(gè)分布式存儲系統(tǒng)數(shù)據(jù)讀寫操作的性能瓶頸。
在部署分布式存儲系統(tǒng)的過程中,開發(fā)人員需要根據(jù)應(yīng)用場景選擇適合的讀寫一致性算法和性能優(yōu)化方案,調(diào)整讀寫一致性算法的存儲和通信機(jī)制來保證數(shù)據(jù)讀寫操作的性能。表1比較了3種類型讀寫一致性算法的實(shí)現(xiàn)難度、算法機(jī)制和容錯(cuò)性方面的特點(diǎn)。
Table 1 Comparison of the mechanism of different consensus algorithms
本節(jié)主要綜述使用副本和糾刪碼2種常見的數(shù)據(jù)存儲方案的情況下,讀寫一致性算法的實(shí)現(xiàn)機(jī)制和性能優(yōu)化方案。
為了適應(yīng)不同應(yīng)用場景的存儲需求,分布式存儲系統(tǒng)往往采用副本和糾刪碼2種數(shù)據(jù)存儲機(jī)制來保證存儲數(shù)據(jù)的可靠性。
(1)副本存儲方案:通過將用戶數(shù)據(jù)的多個(gè)副本存儲到多個(gè)存儲節(jié)點(diǎn)來保證數(shù)據(jù)可靠性。
(2)糾刪碼存儲方案:將用戶數(shù)據(jù)切片生成數(shù)據(jù)分片,編碼數(shù)據(jù)分片生成多個(gè)檢驗(yàn)分片,并將這些分片存儲到多個(gè)存儲節(jié)點(diǎn),從而保證分布式存儲系統(tǒng)的數(shù)據(jù)可靠性。
為了保證存儲在多個(gè)節(jié)點(diǎn)副本數(shù)據(jù)的一致性,研究人員提出了基于消息傳遞的讀寫一致性算法。如Lamport[5]提出了Paxos算法,以保證存儲節(jié)點(diǎn)數(shù)據(jù)的讀寫一致性。文獻(xiàn)[12]介紹了Paxos算法的運(yùn)行機(jī)制。Chandra等[13]討論了證明Paxos算法代碼正確的方法。Lamport[14]提出了異步Paxos算法,通過并行化讀寫數(shù)據(jù)來減小讀寫操作時(shí)延。類似工作還有Fast-Paxos[15]、Vertical Paxos[16]、Cheap-Paxos[17]、DPaxos[18]、Flexible Paxos[19]和EPaxos[20]。然而,這些算法需要使用較為復(fù)雜的讀寫一致性協(xié)議,通常會產(chǎn)生額外的數(shù)據(jù)傳輸開銷,降低分布式存儲系統(tǒng)數(shù)據(jù)讀寫操作的性能。
為了提升分布式存儲系統(tǒng)讀寫一致性算法的執(zhí)行效率,研究人員提出了多種讀寫一致性算法性能優(yōu)化方案。如Junqueira等[22]提出的ZAB(Zookeeper Atomic Broadcasts)協(xié)議通過廣播機(jī)制來保證讀寫性能。讀寫一致性系統(tǒng)組件ZooKeeper[23]使用ZAB協(xié)議來提升讀寫操作的性能[24]。Brenner等[25]提出了SecureKeeper框架,引入因特爾SGX (Software Guard eXtensions)指令集提升ZAB協(xié)議的安全性。Frommgen等[26]提出在ZooKeeper運(yùn)行過程中切換讀寫一致性算法來保證服務(wù)質(zhì)量。史博軒等[27]使用ZooKeeper構(gòu)建統(tǒng)一信任錨模型。Gray等[28]提出了租約機(jī)制Leases方案來提升緩存服務(wù)的性能。Moraru等[29]使用Go語言實(shí)現(xiàn)了分布式租約機(jī)制[30]。Decandia等[31]提出了Dynamo存儲系統(tǒng),部署了NWR算法[32]來調(diào)整讀寫一致性算法執(zhí)行過程中副本數(shù)量n、寫入副本數(shù)量w和讀取副本數(shù)量r等參數(shù)來適應(yīng)不同的分布式存儲系統(tǒng)應(yīng)用場景。王華進(jìn)等[32]分析了NWR算法在不同參數(shù)情況下隊(duì)列解析開銷和數(shù)據(jù)寫入時(shí)延。Huang等[33]使用排隊(duì)論分析可能導(dǎo)致Cassandra數(shù)據(jù)庫短時(shí)間數(shù)據(jù)不一致的原因。朱濤等[34]總結(jié)了讀寫一致性算法和數(shù)據(jù)可用性的關(guān)系。Wang等[35]通過測試HBase[36]和Cassandra[37]2種常用數(shù)據(jù)庫系統(tǒng)來分析副本數(shù)據(jù)對數(shù)據(jù)讀寫操作性能的影響。類似工作還有Scatter[38]、ZooNet[39]、COPS(Clusters of Order-Preserving Servers)[40]、WPaxos[41]、Spanner-RSS(Spanner Regular Sequential Serializability)[42]、PaxosLease[43]和Volume leases[44]等。
為了提升存儲系統(tǒng)軟件的可靠性,研究人員使用多種方法來降低基于消息傳遞的讀寫一致性算法的實(shí)現(xiàn)復(fù)雜度。如Lamport等[45]使用了可重設(shè)置狀態(tài)機(jī)來實(shí)現(xiàn)讀寫一致性算法,并證明了其算法的正確性。Ongaro等[6]提出了Raft算法來實(shí)現(xiàn)主節(jié)點(diǎn)選舉和主從節(jié)點(diǎn)數(shù)據(jù)同步過程。Lampson[4]分別總結(jié)了Paxos在經(jīng)典讀寫一致性問題、磁盤讀寫一致性問題和拜占庭讀寫一致性問題場景的案例。這些讀寫一致性機(jī)制也被部署到了ZooKeeper[23]和Chubby[46]等分布式讀寫一致性管理系統(tǒng)中。
在此基礎(chǔ)上,研究人員針對各種分布式存儲系統(tǒng)應(yīng)用場景提出了相應(yīng)的讀寫一致性算法性能優(yōu)化方案。如Li等[47]提出了NOPaxos(Network Ordered Paxos),使用網(wǎng)絡(luò)層廣播協(xié)議來減少讀寫一致性算法執(zhí)行過程的數(shù)據(jù)傳輸開銷。Mahmoud等[48]提出了Replicated Commit來提升跨數(shù)據(jù)中心通信性能。Nawab等[49]推導(dǎo)出了跨數(shù)據(jù)中心數(shù)據(jù)提交過程消耗時(shí)間下限。Guo等[50]設(shè)計(jì)了面向SQL語義的讀寫一致性方案來提升并行化事務(wù)處理性能。類似工作還有Dynamo[31]、Cassandra[37]、MegaStore[51]、Spanner[52]、FSS (File Storage Service)[53]、Volley[54]、Harp[55]、Mencius[56]、etcd[57]和MDCC(Multi-Data Center Consistency)[58]等。雖然能保證讀寫數(shù)據(jù)的一致性,基于副本的讀寫一致性算法在執(zhí)行過程中需要傳輸大量的用戶數(shù)據(jù),會帶來較大的數(shù)據(jù)傳輸開銷。為了保障數(shù)據(jù)讀寫操作的執(zhí)行效率,糾刪碼作為一種能減少傳輸開銷的機(jī)制被用于減少讀寫過程中的傳輸開銷。
糾刪碼作為一種常見的數(shù)據(jù)可靠性保障機(jī)制被廣泛部署到了分布式存儲系統(tǒng)中來保存用戶數(shù)據(jù)。如Reed等[59]提出了RS(Reed-Solomon)編碼來保證數(shù)據(jù)可靠性。Dimakis等[60]提出了再生碼來減少數(shù)據(jù)修復(fù)操作的網(wǎng)絡(luò)傳輸開銷。Shum等[61]提出了合作再生編碼來減少多節(jié)點(diǎn)失效時(shí)數(shù)據(jù)修復(fù)操作的網(wǎng)絡(luò)傳輸開銷。Huang等[62]提出了LRC (Local Reconstruction Codes)來減少單存儲節(jié)點(diǎn)數(shù)據(jù)失效情況下數(shù)據(jù)修復(fù)操作的網(wǎng)絡(luò)開銷。Shen等[63]使用網(wǎng)絡(luò)編碼來加速云際存儲系統(tǒng)數(shù)據(jù)寫入操作的性能。類似的工作還有Core[64]、CaCo(Cauchy Coding)[65]、PUSH[66]、AONT-RS(All-Or-Nothing Transform with Reed-Solomon coding)[67]、CAONT-RS(Convergent AONT-RS)[68]、CDStore[69]、UniDrive[70]和RDOR(Row-Diagonal Optimal Recovery)[71]等。
為了保證數(shù)據(jù)讀寫操作的執(zhí)行效率,研究人員提出了基于糾刪碼的讀寫一致性算法來減少數(shù)據(jù)讀寫過程中傳輸?shù)臄?shù)據(jù)量。如Mu等[72]提出了RS-Paxos算法,引入了糾刪碼機(jī)制來減少Paxos算法執(zhí)行過程中數(shù)據(jù)傳輸量。Wang等[73]提出了CRaft算法來將Raft算法部署到糾刪碼存儲系統(tǒng)中。由于基于選舉的讀寫一致性算法需要通過主節(jié)點(diǎn)讀寫數(shù)據(jù),會降低網(wǎng)絡(luò)傳輸性能,Uluyol等[7]提出了Pando方案來高效部署Paxos算法,優(yōu)化糾刪碼存儲系統(tǒng)跨數(shù)據(jù)中心的數(shù)據(jù)讀寫時(shí)延,且已被應(yīng)用到了聯(lián)邦學(xué)習(xí)[74]等場景中。通過傳輸編碼后的用戶數(shù)據(jù),基于糾刪碼的讀寫一致性算法能夠有效減少執(zhí)行數(shù)據(jù)讀寫操作過程中網(wǎng)絡(luò)帶寬資源的消耗量。然而,糾刪碼也帶來了數(shù)據(jù)修復(fù)操作帶寬消耗量大和數(shù)據(jù)讀寫操作消耗時(shí)間長等一系列問題[75]。
為了保證數(shù)據(jù)可靠性,提升用戶讀寫數(shù)據(jù)的效率,研究人員提出了多種性能優(yōu)化方案提升在各個(gè)應(yīng)用場景中糾刪碼存儲系統(tǒng)執(zhí)行數(shù)據(jù)修復(fù)操作和數(shù)據(jù)讀寫操作的性能。Chen等[76]提出了Giza來保證跨數(shù)據(jù)中心的糾刪碼對象存儲系統(tǒng)的數(shù)據(jù)讀寫一致性。Chen等[77]提出了副本和糾刪碼混合存儲方案來提升內(nèi)存對象存儲系統(tǒng)的數(shù)據(jù)讀寫操作性能。Sathiamoorthy等[75]將再生碼部署到HDFS存儲系統(tǒng)中,以減少數(shù)據(jù)修復(fù)操作的網(wǎng)絡(luò)傳輸開銷。Shen等[78]提出了跨機(jī)架的路由方案來加速多個(gè)存儲節(jié)點(diǎn)的數(shù)據(jù)寫入過程。Shi等[79]設(shè)計(jì)了UMR-EC(Unified and Multi-Rail Erasure Coding)編碼架構(gòu)優(yōu)化數(shù)據(jù)讀寫操作的執(zhí)行過程。Renesse等[80]綜述了Paxos算法相關(guān)讀寫一致性算法。
為了滿足應(yīng)用場景的存儲需求,開發(fā)人員需要了解讀寫一致性算法的系統(tǒng)開銷和相應(yīng)的實(shí)現(xiàn)機(jī)制。本節(jié)將分析各種讀寫一致性算法的存儲空間和容錯(cuò)性能。本節(jié)將容錯(cuò)節(jié)點(diǎn)數(shù)量定義為在執(zhí)行數(shù)據(jù)讀寫操作過程中容忍失效節(jié)點(diǎn)的數(shù)量,該參數(shù)越大說明讀寫一致性算法可以在越多節(jié)點(diǎn)失效的情況下執(zhí)行讀寫操作。
表2比較了主要讀寫一致性算法的存儲開銷、容錯(cuò)節(jié)點(diǎn)數(shù)量及其實(shí)現(xiàn)機(jī)制。表2中,存儲開銷代表存儲數(shù)據(jù)所消耗磁盤空間大小,n為存儲節(jié)點(diǎn)的數(shù)量,r為設(shè)定讀取節(jié)點(diǎn)的數(shù)量,k為數(shù)據(jù)節(jié)點(diǎn)的數(shù)量。假設(shè)用戶將數(shù)據(jù)量為M字節(jié)的文件保存到n個(gè)存儲節(jié)點(diǎn)中。分布式存儲系統(tǒng)能夠使用副本和糾刪碼機(jī)制通過以下步驟完成數(shù)據(jù)讀寫操作:
在副本存儲情況下,每一個(gè)節(jié)點(diǎn)的數(shù)據(jù)量為M字節(jié)。由于存在n個(gè)節(jié)點(diǎn),分布式存儲系統(tǒng)共存儲了n*M字節(jié)數(shù)據(jù)。由于所有節(jié)點(diǎn)都保存和傳輸重復(fù)數(shù)據(jù),副本機(jī)制通常會消耗大量存儲空間和網(wǎng)絡(luò)帶寬,影響數(shù)據(jù)讀寫操作的性能。在糾刪碼存儲情況下,用戶端設(shè)備將文件分成k個(gè)數(shù)據(jù)分片,將數(shù)據(jù)分片編碼生成m個(gè)校驗(yàn)分片,并存儲到n=k+m個(gè)存儲節(jié)點(diǎn)中。其中,每一個(gè)存儲節(jié)點(diǎn)將保存M/k字節(jié)數(shù)據(jù),所以n個(gè)存儲節(jié)點(diǎn)共保存(n*M)/k字節(jié)數(shù)據(jù)。
Table 2 Comparison of performance of different consensus algorithms
由于糾刪碼機(jī)制將數(shù)據(jù)編碼保存到多個(gè)存儲節(jié)點(diǎn),相較于副本機(jī)制,分布存儲系統(tǒng)能夠在消耗更小的存儲空間的前提下保存相同的數(shù)據(jù)內(nèi)容。然而,基于糾刪碼的讀寫一致性算法需要更多在線節(jié)點(diǎn)和更大計(jì)算開銷才能正確地完成數(shù)據(jù)讀寫操作,降低了存儲數(shù)據(jù)的可用性。
本節(jié)將比較2種應(yīng)用場景(即單數(shù)據(jù)中心分布式存儲系統(tǒng)和跨數(shù)據(jù)中心云際存儲系統(tǒng))中影響讀寫一致性算法性能的因素。
開發(fā)人員需要充分了解各種算法的性能,才能選擇適合當(dāng)前存儲應(yīng)用場景的讀寫一致性算法。具體來說,讀寫一致性算法部署在以下2種分布式存儲應(yīng)用場景:
(1)單數(shù)據(jù)中心分布式存儲系統(tǒng):在寫入數(shù)據(jù)量較大的情況下,前端服務(wù)器數(shù)據(jù)寫入和數(shù)據(jù)同步過程消耗的時(shí)間占數(shù)據(jù)寫入時(shí)間的很大一部分[8]。為了保證讀寫數(shù)據(jù)的性能,開發(fā)人員需要優(yōu)化讀寫操作執(zhí)行流程,以減少數(shù)據(jù)讀寫過程中的網(wǎng)絡(luò)通信開銷。
(2)跨數(shù)據(jù)中心云際存儲系統(tǒng):為了避免單數(shù)據(jù)中心可能出現(xiàn)的數(shù)據(jù)泄露和丟失等問題,跨數(shù)據(jù)中心云際存儲系統(tǒng)將數(shù)據(jù)存儲在多個(gè)數(shù)據(jù)中心。由于數(shù)據(jù)被存儲在不同地理位置的云存儲節(jié)點(diǎn),需要充分考慮各個(gè)云存儲節(jié)點(diǎn)之間的傳輸時(shí)延。
由于單數(shù)據(jù)中心需要運(yùn)行多種業(yè)務(wù),存儲節(jié)點(diǎn)之間的可用帶寬通常非常有限。圖9展示了包括1個(gè)用戶和4個(gè)存儲節(jié)點(diǎn)的分布式存儲系統(tǒng)的數(shù)據(jù)寫入操作的執(zhí)行過程:
在圖9a中,不同的存儲節(jié)點(diǎn)之間帶寬具有較大的差異性,需要充分利用用戶端設(shè)備和存儲節(jié)點(diǎn)之間的帶寬資源。
圖9b展示了傳統(tǒng)數(shù)據(jù)寫入方案的路由。由于用戶端設(shè)備直接將數(shù)據(jù)寫入到存儲節(jié)點(diǎn),寫入過程通常會受到瓶頸鏈路帶寬的限制。
在圖9c中,通過合理設(shè)計(jì)數(shù)據(jù)傳輸路由,分布式存儲系統(tǒng)可以有效避開網(wǎng)絡(luò)拓?fù)涞钠款i鏈路,保證數(shù)據(jù)寫入操作的性能。
為了保證在跨數(shù)據(jù)中心場景中數(shù)據(jù)讀寫操作的性能,部署讀寫一致性算法時(shí),存儲系統(tǒng)設(shè)計(jì)人員需要注意以下要點(diǎn):
(1)為了保證用戶訪問的性能,前端服務(wù)器應(yīng)當(dāng)盡量靠近存儲節(jié)點(diǎn),減少網(wǎng)絡(luò)傳輸時(shí)延。
(2)任意2個(gè)前端服務(wù)器至少需要訪問1個(gè)公共的存儲節(jié)點(diǎn)來保證數(shù)據(jù)一致性。
圖10展示了跨數(shù)據(jù)中心數(shù)據(jù)讀寫過程。
Figure 9 Example of the route strategies for the write operations in distributed storage systems
Figure 10 I/O process of the consensus algorithms between multiple data centers
在實(shí)際的云際存儲系統(tǒng)中,前端服務(wù)器訪問保存在不同存儲節(jié)點(diǎn)的數(shù)據(jù)的傳輸時(shí)延往往存在著較大差異性,因此,前端服務(wù)器需要選擇訪問傳輸時(shí)延較小的存儲節(jié)點(diǎn),以保證對用戶數(shù)據(jù)訪問操作的服務(wù)質(zhì)量。
本節(jié)將總結(jié)部署讀寫一致性算法需注意的要點(diǎn)以及學(xué)術(shù)研究和工業(yè)領(lǐng)域亟需解決的問題。
在實(shí)際的生產(chǎn)系統(tǒng)中,開發(fā)人員在部署讀寫一致性算法時(shí)應(yīng)當(dāng)注意以下方面:
(1)根據(jù)應(yīng)用場景中數(shù)據(jù)寫入請求數(shù)據(jù)量大小的差異,開發(fā)人員需要分析讀寫一致性算法中各個(gè)階段在數(shù)據(jù)讀寫操作中的時(shí)間占比。為了保證數(shù)據(jù)讀寫操作的執(zhí)行效率,分布式存儲系統(tǒng)需要根據(jù)數(shù)據(jù)讀寫操作的特征部署合適的讀寫一致性策略和性能優(yōu)化方案。
(2)根據(jù)分布式存儲系統(tǒng)的數(shù)據(jù)存儲機(jī)制,開發(fā)人員需要選擇合適的讀寫一致性算法來滿足存儲應(yīng)用的性能需求。由于副本和糾刪碼存儲機(jī)制有較大的差異,分布式存儲系統(tǒng)需要部署對應(yīng)的讀寫一致性算法來適應(yīng)各種存儲機(jī)制下數(shù)據(jù)讀寫操作的性能。
(3)根據(jù)應(yīng)用網(wǎng)絡(luò)環(huán)境的特性,包括傳輸時(shí)延和網(wǎng)絡(luò)帶寬,開發(fā)人員需要優(yōu)化讀寫一致性算法的通信機(jī)制來減小數(shù)據(jù)傳輸帶來的開銷。針對不同的存儲應(yīng)用場景,分布式存儲系統(tǒng)需要引入相應(yīng)的傳輸策略來減小讀寫一致性算法數(shù)據(jù)讀寫操作的傳輸開銷。
雖然當(dāng)前讀寫一致性算法能保證數(shù)據(jù)讀寫操作的性能,但是當(dāng)前讀寫一致性算法依然存在諸多問題,如網(wǎng)絡(luò)適應(yīng)能力弱和難以適應(yīng)不同大小的數(shù)據(jù)讀寫請求。為了滿足用戶讀寫性能需求,需要部署以下優(yōu)化方案:
(1)高自適應(yīng)存儲機(jī)制:隨著承載服務(wù)類型的增加,業(yè)務(wù)系統(tǒng)通常提供多種不同的在線服務(wù)。由于單獨(dú)使用副本機(jī)制和糾刪碼機(jī)制適合的應(yīng)用場景有限,分布式存儲系統(tǒng)需部署多種存儲機(jī)制融合的讀寫一致性算法,動(dòng)態(tài)調(diào)整其存儲機(jī)制,以適應(yīng)日益復(fù)雜的應(yīng)用場景。
(2)動(dòng)態(tài)調(diào)整網(wǎng)絡(luò)路由策略:由于存儲節(jié)點(diǎn)之間的網(wǎng)絡(luò)通常存在較大異構(gòu)性,讀寫一致性算法需要根據(jù)分布式存儲系統(tǒng)的網(wǎng)絡(luò)狀態(tài)調(diào)整存儲節(jié)點(diǎn)之間的網(wǎng)絡(luò)路由策略,以保證分布式存儲系統(tǒng)數(shù)據(jù)讀寫操作的性能。
(3)構(gòu)建智能讀寫一致性算法:在執(zhí)行當(dāng)前讀寫一致性算法過程中,存儲節(jié)點(diǎn)通常使用固定通信協(xié)議來保證讀寫操作的正確性,難以滿足服務(wù)質(zhì)量需求。通過引入人工智能方案分析過往的用戶行為和存儲集群狀態(tài),智能讀寫一致性算法能夠有效提升數(shù)據(jù)讀寫操作的性能。
雖然當(dāng)前工業(yè)界已廣泛部署了讀寫一致性組件庫(如ZooKeeper[23])來保證分布式存儲系統(tǒng)執(zhí)行數(shù)據(jù)讀寫操作的正確性,但是這些組件庫存在應(yīng)用場景單一和讀寫開銷較大等問題,依然有以下值得進(jìn)一步開展研究的方向:
(1)測試讀寫一致性算法性能: 雖然研究人員已開展了大量的讀寫一致性算法性能優(yōu)化工作,但現(xiàn)有研究中依然缺少對讀寫一致性算法的性能定量測試比較工作。根據(jù)讀寫一致性算法的實(shí)現(xiàn)機(jī)制,亟需構(gòu)建大量定量系統(tǒng)性實(shí)驗(yàn)來充分測量讀寫一致性算法的性能,便于開發(fā)人員選擇適合存儲應(yīng)用場景的讀寫一致性算法。
(2)構(gòu)建副本和編碼混合讀寫一致性機(jī)制:由于不同存儲機(jī)制適用的應(yīng)用場景具有較大的差異,現(xiàn)有適用單一存儲機(jī)制的讀寫一致性算法難以滿足多種用戶的數(shù)據(jù)讀寫需求,設(shè)計(jì)副本和編碼混合的讀寫一致性算法將會有效擴(kuò)大讀寫一致性算法的適用范圍。
(3)引入新硬件設(shè)備減少讀寫開銷:隨著新的時(shí)鐘硬件(如銫原子鐘[81])在數(shù)據(jù)中心的應(yīng)用,存儲節(jié)點(diǎn)可精確地獲取當(dāng)前時(shí)間,更容易實(shí)現(xiàn)時(shí)鐘同步操作。如何構(gòu)建適應(yīng)新存儲硬件設(shè)備的讀寫一致性方案也將成為提升讀寫操作性能的重要研究方向。
本文綜述了分布式存儲系統(tǒng)中的讀寫一致性算法的實(shí)現(xiàn)機(jī)制,并分析了這些算法適宜的應(yīng)用場景,從而為開發(fā)人員部署讀寫一致性算法提供了相應(yīng)的理論依據(jù)。在總結(jié)讀寫一致性算法挑戰(zhàn)性的基礎(chǔ)上,還總結(jié)了讀寫一致性算法主要的實(shí)現(xiàn)方案,綜述了相關(guān)的性能優(yōu)化工作。在此基礎(chǔ)上,本文分析了單數(shù)據(jù)中心分布式存儲系統(tǒng)和多數(shù)據(jù)中心云際存儲系統(tǒng)2種應(yīng)用場景中各種參數(shù)對讀寫一致性算法數(shù)據(jù)寫入操作性能的影響,并給出了在這些應(yīng)用場景中部署讀寫一致性算法需注意的要點(diǎn),展望了未來可能的性能優(yōu)化方案。