您的位置:首頁>關(guān)于我們>新聞動(dòng)態(tài) |
互聯(lián)網(wǎng)和移動(dòng)應(yīng)用的普及讓人們使用信息服務(wù)越來越方便,也使各類信息系統(tǒng)面臨著越來越大的數(shù)據(jù)規(guī)模和訪問請求的壓力。隨著分布式數(shù)據(jù)庫在互聯(lián)網(wǎng)行業(yè)的廣泛應(yīng)用,通過分布式數(shù)據(jù)庫來擴(kuò)展信息系統(tǒng)的處理能力,成為近年來服務(wù)提供商的一種普遍選擇。目前,分布式數(shù)據(jù)庫解決方案已經(jīng)呈現(xiàn)百花齊放的態(tài)勢,如何選擇合適的分布式數(shù)據(jù)庫又成為困擾決策者的一個(gè)問題。
大勢所趨
從技術(shù)角度來看,分布式數(shù)據(jù)庫解決方案大致可以分為兩大類,即分布式數(shù)據(jù)庫中間件和原生分布式數(shù)據(jù)庫。分布式數(shù)據(jù)庫中間件是架構(gòu)在多個(gè)傳統(tǒng)單點(diǎn)數(shù)據(jù)庫系統(tǒng)上的中間層解決方案,通過將數(shù)據(jù)分拆到不同的數(shù)據(jù)庫節(jié)點(diǎn)上,利用中間件來管理和訪問各個(gè)數(shù)據(jù)庫中的數(shù)據(jù),通常需要用戶參與到數(shù)據(jù)分拆和節(jié)點(diǎn)管理過程中。
互聯(lián)網(wǎng)行業(yè)最初所使用的分布式數(shù)據(jù)庫方案多是基于中間件的,在解決服務(wù)壓力問題上也取得了較好的效果,但同時(shí)也暴露出不少問題。
原生分布式數(shù)據(jù)庫是指從架構(gòu)設(shè)計(jì)、底層存儲(chǔ)和查詢處理均面向分布式數(shù)據(jù)管理需求,數(shù)據(jù)庫集群作為一個(gè)整體對外提供服務(wù),用戶無需關(guān)注集群內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)。由于原生數(shù)據(jù)庫系統(tǒng)開發(fā)的難度大,最初的版本通常功能簡單,限制了其應(yīng)用的場景。隨著版本的不斷成熟,原生分布式數(shù)據(jù)庫已經(jīng)展現(xiàn)出了取代分布式數(shù)據(jù)庫中間件的趨勢。
本文將從數(shù)據(jù)可靠性、副本同步和服務(wù)可用性等幾個(gè)方面進(jìn)行分析,對比兩種方案的區(qū)別。
數(shù)據(jù)可靠性
幾乎所有的分布式數(shù)據(jù)庫解決方案都宣稱可以在普通PC服務(wù)器集群上實(shí)現(xiàn)超過高端共享存儲(chǔ)的數(shù)據(jù)可靠性。這一點(diǎn)都是通過冗余來實(shí)現(xiàn)的,即將數(shù)據(jù)進(jìn)行分片,然后將每個(gè)分片復(fù)制出n個(gè)副本,并且存儲(chǔ)在集群中的n個(gè)不同節(jié)點(diǎn)上,當(dāng)集群中宕機(jī)的節(jié)點(diǎn)數(shù)少于n時(shí),總能保證有一個(gè)副本的數(shù)據(jù)不會(huì)丟失。由于節(jié)點(diǎn)宕機(jī)等原因?qū)е路制北镜臄?shù)量少于n時(shí),需要通過將副本復(fù)制到新節(jié)點(diǎn)來保證副本數(shù)量。
在分布式數(shù)據(jù)庫中間件方案中,由于底層的每個(gè)節(jié)點(diǎn)都是一個(gè)獨(dú)立的數(shù)據(jù)庫系統(tǒng),中間件很難實(shí)現(xiàn)分片副本在不同節(jié)點(diǎn)間的復(fù)制,因此多利用底層數(shù)據(jù)庫的主備同步機(jī)制為每個(gè)節(jié)點(diǎn)配置獨(dú)立的備份節(jié)點(diǎn)。
為了實(shí)現(xiàn)更好的數(shù)據(jù)可靠性,通常需要一主兩備3個(gè)副本,這樣會(huì)導(dǎo)致服務(wù)器利用率降低和管理的復(fù)雜性升高。對于原生分布式數(shù)據(jù)庫系統(tǒng)來說,系統(tǒng)支持?jǐn)?shù)據(jù)的自動(dòng)分片,以及分片副本在集群節(jié)點(diǎn)間的自動(dòng)遷移和復(fù)制,實(shí)現(xiàn)負(fù)載均衡,在服務(wù)器利用率和管理復(fù)雜性上均明顯優(yōu)于中間件方案。
副本同步
多副本技術(shù)雖然保證了分布式數(shù)據(jù)庫中的數(shù)據(jù)可靠性,但同時(shí)帶來了副本同步的問題,即如何保證數(shù)據(jù)分片不同副本的同步更新。具體實(shí)現(xiàn)副本同步的技術(shù)可以分為四類:
a)更新主副本,同步復(fù)制到從副本:數(shù)據(jù)副本有主從之分,所有的更新發(fā)生在主副本,當(dāng)更新被同步復(fù)制到從副本后,更新完成。
b)更新主副本,異步復(fù)制到從副本:數(shù)據(jù)副本有主從之分,所有的更新發(fā)生在主副本,且即時(shí)生效,主副本的更新以異步方式復(fù)制給從副本。
c)并發(fā)更新不同副本:數(shù)據(jù)副本無主從之分,數(shù)據(jù)更新可以發(fā)生在任何副本,并且更新可以同步或異步方式復(fù)制到其它副本。
d)集中保存更新,定期合并副本:數(shù)據(jù)副本無主從之分,所有的更新被保存在集群中的特定節(jié)點(diǎn)上,定期被合并到各個(gè)副本中。
不同的原生分布式數(shù)據(jù)庫系統(tǒng)根據(jù)針對的應(yīng)用場景不同,可以選擇其中的一種或多種實(shí)現(xiàn)技術(shù),并且技術(shù)實(shí)現(xiàn)的細(xì)節(jié)對用戶透明。對于分布式數(shù)據(jù)庫中間件來說,由于其數(shù)據(jù)副本是依賴于底層數(shù)據(jù)庫的主從復(fù)制機(jī)制實(shí)現(xiàn)的,只可能采用技術(shù)a或者b,并且用戶需要對每個(gè)節(jié)點(diǎn)的主從復(fù)制進(jìn)行配置和監(jiān)控。
服務(wù)可用性
服務(wù)可用性是指集群中的任何一個(gè)或多個(gè)節(jié)點(diǎn)宕機(jī)都不會(huì)影響數(shù)據(jù)庫服務(wù)的可用性。在分布式數(shù)據(jù)庫系統(tǒng)中,通常都會(huì)有管理節(jié)點(diǎn)和服務(wù)節(jié)點(diǎn)兩類角色。管理節(jié)點(diǎn)負(fù)責(zé)感知集群中各節(jié)點(diǎn)的狀態(tài),實(shí)現(xiàn)管理數(shù)據(jù)分布和節(jié)點(diǎn)上下線等功能;服務(wù)節(jié)點(diǎn)中保存數(shù)據(jù)分片副本,對外提供數(shù)據(jù)庫服務(wù)??扇萑体礄C(jī)節(jié)點(diǎn)的角色和數(shù)量是影響分布式數(shù)據(jù)庫可用性的重要因素,一般來說管理節(jié)點(diǎn)宕機(jī)會(huì)直接影響服務(wù)可用性,而少于數(shù)據(jù)副本數(shù)量的服務(wù)節(jié)點(diǎn)宕機(jī)不會(huì)影響服務(wù)可用性。
在原生分布式數(shù)據(jù)庫系統(tǒng)中,管理節(jié)點(diǎn)通常是輕節(jié)點(diǎn),僅需維護(hù)數(shù)據(jù)分布等少量的元數(shù)據(jù),通過心跳和租約機(jī)制監(jiān)控集群中其它節(jié)點(diǎn)的狀態(tài)。為了避免管理節(jié)點(diǎn)宕機(jī)造成的單點(diǎn)故障,原生分布式數(shù)據(jù)庫中會(huì)部署多個(gè)管理節(jié)點(diǎn),然后采用Paxos協(xié)議來自動(dòng)選舉主管理節(jié)點(diǎn)。所有服務(wù)節(jié)點(diǎn)是對等的,通過心跳機(jī)制與主管理節(jié)點(diǎn)保持通訊,少于數(shù)據(jù)副本數(shù)量的服務(wù)節(jié)點(diǎn)宕機(jī)不會(huì)影響服務(wù)可用性。通過向主管理節(jié)點(diǎn)注冊,可以方便地添加新的節(jié)點(diǎn),從而實(shí)現(xiàn)良好的擴(kuò)展性。
在分布式數(shù)據(jù)庫中間件方案中,中間件節(jié)點(diǎn)不僅需要維護(hù)數(shù)據(jù)分布等元數(shù)據(jù),還需要實(shí)現(xiàn)查詢解析、查詢重寫和結(jié)果聚合等功能。
近來,也有一些分布式數(shù)據(jù)庫中間件開始將管理功能和服務(wù)功能分離成單獨(dú)的管理節(jié)點(diǎn)和中間件節(jié)點(diǎn),然后采用Paxos協(xié)議來自動(dòng)選舉主管理節(jié)點(diǎn)。底層的數(shù)據(jù)庫節(jié)點(diǎn)雖然負(fù)責(zé)存儲(chǔ)數(shù)據(jù),但并不能直接對外提供服務(wù),必須和中間件節(jié)點(diǎn)配合才能對外提供服務(wù)。由于底層數(shù)據(jù)庫節(jié)點(diǎn)的容災(zāi)是依賴于各自的主備同步機(jī)制,因此,任何一個(gè)數(shù)據(jù)庫節(jié)點(diǎn)的主備庫同時(shí)宕機(jī)都會(huì)導(dǎo)致整個(gè)系統(tǒng)的服務(wù)不可用。
綜合來看,影響分布式數(shù)據(jù)庫中間件解決方案服務(wù)可用性的因素要比原生分布式數(shù)據(jù)庫更多并且更復(fù)雜,需要用戶花費(fèi)更多的精力去配置和管理。
跨節(jié)點(diǎn)訪問
將數(shù)據(jù)分片后冗余存儲(chǔ)于集群中的各個(gè)節(jié)點(diǎn),是分布式數(shù)據(jù)庫實(shí)現(xiàn)大規(guī)模數(shù)據(jù)的可靠存儲(chǔ)的有效手段。然而,當(dāng)用戶需要在一個(gè)事務(wù)中同時(shí)訪問位于不同節(jié)點(diǎn)上的數(shù)據(jù)時(shí),如何保證事務(wù)的ACID特性成為所有解決方案的共同難題。有一些分布式數(shù)據(jù)庫中間件產(chǎn)品建議用戶對數(shù)據(jù)進(jìn)行劃分,避免出現(xiàn)跨節(jié)點(diǎn)訪問數(shù)據(jù),從一定程度上來緩解這個(gè)難題;在無法避免跨節(jié)點(diǎn)訪問數(shù)據(jù)時(shí),通過最終一致性和補(bǔ)償機(jī)制來解決。然而,一方面這種思路大幅度增加了用戶使用的難度,另一方面,很多場景下是無法應(yīng)用最終一致性和補(bǔ)償機(jī)制的。
目前,兩階段提交協(xié)議(2PC)是公認(rèn)的解決這一難題的有效手段。2PC是一種阻塞協(xié)議,即當(dāng)事務(wù)處理過程中出現(xiàn)協(xié)調(diào)者故障時(shí),部分參與者的事務(wù)會(huì)處于未決狀態(tài),影響到所涉及數(shù)據(jù)的可用性,必須等待協(xié)調(diào)者恢復(fù)后才能解決。對于分布式數(shù)據(jù)庫中間件來說,底層的節(jié)點(diǎn)都是獨(dú)立的數(shù)據(jù)庫系統(tǒng),有各自的日志系統(tǒng)和事務(wù)處理機(jī)制,只能在中間件節(jié)點(diǎn)上來實(shí)現(xiàn)2PC,其實(shí)現(xiàn)的難度相當(dāng)于重寫一個(gè)數(shù)據(jù)庫引擎,所實(shí)現(xiàn)的效率也難以與原生數(shù)據(jù)庫相媲美。因此,雖然有部分分布式數(shù)據(jù)庫中間件也提供2PC的支持,但通常不建議用戶使用或者建議用戶自行解決使用過程中的未決事務(wù)。
數(shù)據(jù)快照
分布式系統(tǒng)中的時(shí)間同步是一個(gè)難以解決的問題。使用NTP協(xié)議或原子鐘對每個(gè)節(jié)點(diǎn)的時(shí)鐘進(jìn)行同步,能夠滿足對時(shí)效性要求不高的應(yīng)用需求,但對于毫秒級(jí)的交易系統(tǒng)來說,所存在的誤差仍然是不可接受的。在分布式數(shù)據(jù)庫系統(tǒng)中,基于各節(jié)點(diǎn)的時(shí)間來獲取一個(gè)全局的數(shù)據(jù)快照是不可行的,存在著數(shù)據(jù)不一致的風(fēng)險(xiǎn)。通常的解決辦法是設(shè)置一個(gè)全局協(xié)調(diào)者,來為所有的事務(wù)分配全局唯一的事務(wù)號(hào),這個(gè)事務(wù)號(hào)可以作為一個(gè)邏輯時(shí)間來使用。
對于原生分布式數(shù)據(jù)庫系統(tǒng),全局唯一事務(wù)號(hào)分配機(jī)制是集成在事務(wù)處理過程中的,并沒有額外的處理開銷。而對于分布式數(shù)據(jù)庫中間件來說,底層的每個(gè)數(shù)據(jù)庫節(jié)點(diǎn)都有自己獨(dú)立的事務(wù)處理機(jī)制,如果不設(shè)置全局協(xié)調(diào)者來分配全局唯一的事務(wù)號(hào),則在不停機(jī)的狀態(tài)下用戶無法獲取統(tǒng)一的全局?jǐn)?shù)據(jù)快照;如果設(shè)置全局協(xié)調(diào)者來分配事務(wù)號(hào),一方面會(huì)增加額外申請事務(wù)號(hào)的開銷,另一方面還需要對底層數(shù)據(jù)庫節(jié)點(diǎn)的事務(wù)處理機(jī)制進(jìn)行改造,使其必須按照事務(wù)號(hào)順序執(zhí)行事務(wù),這都會(huì)對極大地影響數(shù)據(jù)庫的性能。
小結(jié)
分布式數(shù)據(jù)庫中間件技術(shù)是十多年前伴隨互聯(lián)網(wǎng)應(yīng)用的興起而發(fā)展起來的,幫助很多互聯(lián)網(wǎng)企業(yè)有效地解決了控制成本和應(yīng)對服務(wù)壓力等問題,也誕生了很多優(yōu)秀的中間件產(chǎn)品,但同時(shí)也暴露出對應(yīng)用開發(fā)的侵入、功能性能受限和管理運(yùn)維難度大等問題。究其原因,這類技術(shù)是在特定的歷史時(shí)期利用現(xiàn)有數(shù)據(jù)庫產(chǎn)品來解決問題的一種應(yīng)用級(jí)方案,雖然其中用到了一些數(shù)據(jù)庫實(shí)現(xiàn)技術(shù),但本質(zhì)上并不是一個(gè)數(shù)據(jù)庫系統(tǒng)。原生分布式數(shù)據(jù)庫系統(tǒng)從誕生之初便是針對大規(guī)模數(shù)據(jù)存儲(chǔ)和高并發(fā)數(shù)據(jù)訪問而設(shè)計(jì)的系統(tǒng)級(jí)解決方案,假以時(shí)日,它一定會(huì)取代中間件成為這一領(lǐng)域的主流技術(shù)。