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