在QCon 2017倫敦大會(huì)上,Neo4J Technology首席科學(xué)家Jim Webber介紹了Neo4J是如何實(shí)現(xiàn)因果一致性的。他的演講內(nèi)容包括:高層概覽Neo4J集群的架構(gòu)、使用Raft實(shí)現(xiàn)共識(shí)機(jī)制,以及用于實(shí)現(xiàn)“寫后讀”(RAW,read-after-write)一致性的“書簽”(Bookmarking)模式。
據(jù)Webber介紹,為將集群?jiǎn)栴}分而治之,Neo4J提供了兩類角色不同的節(jié)點(diǎn),分別稱為核心(Core)節(jié)點(diǎn)和只讀(Read)節(jié)點(diǎn)。在集群中,核心節(jié)點(diǎn)用于寫操作,并提供了集群的持久性保證。只讀節(jié)點(diǎn)是核心集群的只讀異步副本,實(shí)現(xiàn)在“多讀少寫”(Read-heavy)負(fù)載場(chǎng)景下的擴(kuò)展。
,Webber進(jìn)一步介紹了為達(dá)成持久性保證,核心節(jié)點(diǎn)是如何實(shí)現(xiàn)Raft共識(shí)算法的。一旦一個(gè)事務(wù)寫入到一個(gè)核心節(jié)點(diǎn),Raft就會(huì)對(duì)事務(wù)做日志,并將事務(wù)到復(fù)制到集群中所有其余的核心節(jié)點(diǎn)。Raft并非等待事務(wù)被完全復(fù)制,而是等待大多數(shù)選舉(Majority Vote),這足以保證寫操作的持久性。
Webb還介紹了Raft在性能上和彈性上的優(yōu)點(diǎn)。對(duì)于性能而言,Raft只需等待大多數(shù)復(fù)制,因此阻塞的時(shí)間更短,進(jìn)而降低了查詢延遲。從彈性的角度看,即使一些節(jié)點(diǎn)故障,只要大多數(shù)依然可以選舉,核心集群就仍然正常工作。
Webber對(duì)Raft和Paxos做了比較,Raft相對(duì)更簡(jiǎn)單,而且更易于實(shí)現(xiàn),這就是Neo4J選擇Raft的原因。他認(rèn)為Raft降低了軟件故障出現(xiàn)的可能性,提高了應(yīng)用的可維護(hù)性。
據(jù)Webber介紹,圖數(shù)據(jù)庫(kù)通常是一類“多讀少寫”的數(shù)據(jù)庫(kù)。即使在寫操作期間,也必須讀取和遍歷圖數(shù)據(jù)。這就是在Neo4J集群中通常只讀節(jié)點(diǎn)要多于核心節(jié)點(diǎn)的原因。因?yàn)橹蛔x節(jié)點(diǎn)不參與共識(shí)提交,這意味著只讀節(jié)點(diǎn)適用于自動(dòng)擴(kuò)展,并且更易于按需部署或調(diào)配。
考慮到事務(wù)是被異步復(fù)制到只讀節(jié)點(diǎn)的,Webber給出了一個(gè)簡(jiǎn)單應(yīng)用場(chǎng)景,對(duì)此機(jī)制進(jìn)行了展示。如果用戶需要在創(chuàng)建數(shù)據(jù)后就立刻讀取它們,即便寫操作具有持久性保證,但還是有可能無(wú)法發(fā)現(xiàn)這些數(shù)據(jù)。這是由于數(shù)據(jù)是最終一致的,可能數(shù)據(jù)尚未復(fù)制到被查詢的節(jié)點(diǎn)上。
要解決這一“寫后讀”一致性問(wèn)題,Webber介紹了Neo4J中提供的一種因果一致性模式,稱為“書簽”。
書簽?zāi)J降牡谝浑A段包含一次寫操作,寫操作完成后將返回相應(yīng)的事務(wù)標(biāo)識(shí)給客戶端。第二階段是一次讀操作,客戶端在查詢中發(fā)送事務(wù)的標(biāo)識(shí)。通過(guò)使用事務(wù)標(biāo)識(shí),被讀取的節(jié)點(diǎn)將可以阻塞給定的事務(wù)。
Webber用一個(gè)代碼例子展示了書簽?zāi)J?,?qiáng)調(diào)了在他看來(lái),實(shí)現(xiàn)書簽?zāi)J绞欠浅:?jiǎn)單的。在這個(gè)例子中,客戶端接收一個(gè)事務(wù)標(biāo)識(shí),然后傳遞給此后的查詢。
要了解更多的細(xì)節(jié),可以從此處在線完整觀看該演講。Webber還推薦閱讀一下Raft的論文。
查看英文原文: Causal Consistency for Large Neo4j Clusters