今天的主角會是 Neo4j Causal Clusters (因果叢集),但會先簡單介紹一下它的前身 Neo4j High Availability Cluster。為何說是前身呢?因為 Neo4j HA 只支援到 Neo4j Enterprise 3.5.x,到了 4.0 版已經完全移除,且官方之後也不再持續維護 HA。
Neo4j HA 是企業版功能,可以在線上服務的環境,同時提供多台 Neo4j 資料庫服務作為容錯架構,在有個別服務中斷、甚至硬體損壞時,都還是可以繼續提供前台完整的資料讀寫,並且擁有比單一台 Neo4j 伺服器更強大的資料負載能力。
(圖片來源:Neo4j 官網)
如上圖,Neo4j HA 架構會有一台 master、多台 slave,資料會由 master 寫入,並同步到 slave,雖然 slave 也可以寫入,但這樣會增加延遲;資料的讀取則是 master、slave 都可以操作。
因果叢集提供了額外的保護層,確保數據損壞的機會為零,而 Neo4j HA 由於基礎架構而容易受到攻擊。
另外就是因果叢集的 bolt+routing 功能,提供內建的自動負載平衡,比起 Neo4j HA 叢集需要的額外負載平衡層,可以更簡單而強大。
(圖片來源:Neo4j 官網)
Core Server
核心伺服器 Core Server 使用 Raft 協定來保障資料,做法是只要超過半數以上的 Core Server 確認了交易,就可以安全的回傳給應用程式。如果 Core Server 發生問題無法寫入,將自動轉成唯讀。
Read Replica Server
Read Replica 只能讀取,作為整個資料庫服務的讀取負載平衡,大約會以毫秒的頻率週期性輪詢 Core Server 取得交易記錄。
接下來先試著在本機端實作因果叢集,三台 Core Server 和三台 Read Replica。
安裝 Neo4j 後,把同一個資料庫複製三份,並修改 neo4j.conf,三台 Core Server 都需要以下的共同設定
dbms.mode=CORE
causal_clustering.minimum_core_cluster_size_at_formation=3
causal_clustering.minimum_core_cluster_size_at_runtime=3
causal_clustering.initial_discovery_members=localhost:5000,localhost:5001,localhost:5002
以上就是設定伺服器的身份為 Core,所有 Core Server 的 address/port。
接下來就是這三台 Core Server 要各別設定的部分
第一台 Core Server
causal_clustering.discovery_listen_address=:5000
causal_clustering.transaction_listen_address=:6000
causal_clustering.raft_listen_address=:7000
dbms.connector.bolt.listen_address=:7687
dbms.connector.http.listen_address=:7474
dbms.connector.https.listen_address=:6474
dbms.backup.listen_address=0.0.0.0:6362
raft_listen_address, raft_listen_address 指定該伺服器將綁定哪個 address/port 來做叢集通訊
第二台 Core Server
causal_clustering.discovery_listen_address=:5001
causal_clustering.transaction_listen_address=:6001
causal_clustering.raft_listen_address:=7001
dbms.connector.bolt.listen_address=:7688
dbms.connector.http.listen_address=:7475
dbms.connector.https.listen_address=:6475
dbms.backup.listen_address=0.0.0.0:6363
第三台 Core Server
causal_clustering.discovery_listen_address=:5002
causal_clustering.transaction_listen_address=:6002
causal_clustering.raft_listen_address:=7002
dbms.connector.bolt.listen_address=:7689
dbms.connector.http.listen_address=:7476
dbms.connector.https.listen_address=:6476
dbms.backup.listen_address=0.0.0.0:6364
接下來設定三台 Read Replica Server
causal_clustering.initial_discovery_members 仍然是指向上述三台 Core Server
第一台 Read Replica Server
dbms.mode=READ_REPLICA
causal_clustering.initial_discovery_members=localhost:5000,localhost:5001,localhost:5002
causal_clustering.discovery_listen_address=:5003
causal_clustering.transaction_listen_address=:6003
dbms.connector.bolt.listen_address=:7690
dbms.connector.http.listen_address=:7477
dbms.connector.https.listen_address=:6477
dbms.backup.listen_address=:6365
第二台 Read Replica Server
dbms.mode=READ_REPLICA
causal_clustering.initial_discovery_members=localhost:5000,localhost:5001,localhost:5002
causal_clustering.discovery_listen_address=:5003
causal_clustering.transaction_listen_address=:6004
dbms.connector.bolt.listen_address=:7691
dbms.connector.http.listen_address=:7478
dbms.connector.https.listen_address=:6478
dbms.backup.listen_address=:6366
第三台 Read Replica Server
dbms.mode=READ_REPLICA
causal_clustering.initial_discovery_members=localhost:5000,localhost:5001,localhost:5002
causal_clustering.discovery_listen_address=:5005
causal_clustering.transaction_listen_address=:6005
dbms.connector.bolt.listen_address=:7692
dbms.connector.http.listen_address=:7479
dbms.connector.https.listen_address=:6479
dbms.backup.listen_address=:6367
個別啟動服務後,就可以在本機構成了一個小型的因果叢集資料庫服務。
參考來源:
https://neo4j.com/developer/kb/comparing-ha-vs-causal-clusters/
https://neo4j.com/docs/operations-manual/current/tutorial/local-causal-cluster