neo4j

Neo4j 因果叢集實作簡介

何家瑋 2022/01/13 11:48:51
126

因果叢集(Causal Cluster)

叢集技術是一項能有效加強系統整體效能、可用性、靈活性和可擴充性,並廣泛應用於生產系統的技術,而Neo4j本身也提供了資料庫叢集的功能。

高可用性叢集(High-availability clusters)為目前最廣為人知的叢集技術之一,最新版本的Neo4j中,則是使用了因果叢集(Causal Cluster)來取代舊版的HA叢集,因果叢集有著更先進的叢集架構以及安全架構,以滿足企業更大規模的生產與安全性需求。

因果叢集技術是基於Raft協定開發,是由史丹佛大學提出的一種更易於了解的一致性演算法。Neo4j因果叢集內建的bolt可直接處理負載平衡,並支援由bolt驅動管理的叢集可感知階段,比起HA叢集更為簡單而強大。

因果叢集架構

核心伺服器(core server):為交易處理提供容錯平台,負責Neo4j因果叢集安全性的單元,透過Raft協定來確保資料安全。實際上,資料交易必須經過叢集中過半數的核心伺服器同意,此筆交易才會有效。我們可以透過容錯公式來計算所須的伺服器總數:T = 2E + 1,T是伺服器總數,E是可容許錯誤的伺服器數量,這表示架設一個最小單位的核心伺服器,至少需要3台伺服器。

唯讀伺服器(read replica server):負責資料庫整體的負載平衡,提供Neo4j因果叢集可擴充性的單元,會以週期性輪詢核心伺服器的方式,來同步核心伺服器的資料。唯讀伺服器不參與拓樸決策,因此唯讀伺服器一但損壞,並不會影響整體資料庫的安全性和可用性,僅會損失查詢的效能而已。

因果叢集架設

系統需求

1. 使用x86-64架構的硬體環境

2. 4.0版本需Java 11.0 或 openJDK 11以上

本文使用的虛擬機器為Hyoer-V,使用的作業系統為cent-OS 7,JDK使用openJDK 11

需先備妥cent-OS以及安裝完JDK之後,同時關閉防火牆及SELinux,便可進入Neo4j安裝程序

安裝Neo4j

1. 使用yam安裝

首先需要新增yam的repository

rpm --import https://debian.neo4j.com/neotechnology.gpg.key
cat <<EOF >  /etc/yum.repos.d/neo4j.repo
[neo4j]
name=Neo4j RPM Repository
baseurl=https://yum.neo4j.com/stable
enabled=1
gpgcheck=1
EOF

 

本例將會安裝企業版的Neo4j,而安裝企業版時會詢問是否同意Neo4j license agreement,故安裝前需要先設定環境變數,於安裝過程中同意Neo4j license agreement

NEO4J_ACCEPT_LICENSE_AGREEMENT=yes yum install neo4j-enterprise-4.2.3

 

輸入yum指定,安裝企業版Neo4j,這裡做為範例選擇安裝的是4.2.3版

yum install neo4j-enterprise-4.2.3

 

也可以輸入下列指令尋找官方提供的版本, 再來決定安裝的版本

rpm -qa | grep neo

 

2.離線安裝

若是在無法連上網際網路的環境下,Neo4j也提供了離線安裝的選項。

前往Neo4j download center 下載欲安裝的版本

https://neo4j.com/download-center/

註冊完會員後,會收到一封下載的連結,下載完成後,將檔案放入cent-OS中,本例將檔案放至 /opt/ 下並解壓縮

tar -xf /opt/neo4j-enterprise-4.2.3-unix.tar.gz

 

3.設定檔調整

設定檔的存放位置如下:

//使用yam、rpm安裝時,路徑如下:
vi /etc/neo4j/neo4j.conf
//使用tar安裝時,路徑如下:
vi /opt/neo4j-enterprise-4.2.3/conf

找到下列的設定項目,並修改如下:

//此為本機允許監聽外部ip的設定,預設為localhost,取消注釋並將值設定為0.0.0.0,表示允許監聽任何網路位址
dbms.default_listen_address=0.0.0.0

//此為Neo4j GUI介面所使用的port,取消注釋後便可從外部使用GUI介面操作Neo4j
dbms.connector.bolt.listen_address=:7687
dbms.connector.http.listen_address=:7474

 

4.啟動Neo4j

調整完設定檔後,輸入指令啟動Neo4j

//使用yam、rpm安裝時,指如下:
systemctl start neo4j

//使用tar安裝時,指令如下:
cd /opt/neo4j-enterprise-4.2.3/
./bin/neo4j console
//如欲在背景執行,則改用start即可
./bin/neo4j start

 

5.進入Neo4j GUI介面

打開瀏覽器,輸入虛擬機器的對外IP,以及7474 port,即可進入

預設admin帳號密碼為:neo4j/neo4j

本例虛擬機器使用的ip 為192.168.137.11

進入畫面如上,至此已完成一個Neo4j 實體的安裝。

 

架設Core Server

複製兩個已安裝Neo4j虛擬機器,或是按上述步驟重新建立兩個含Neo4j實體的虛擬機器

本例使用的ip如下:

core01: 192.168.137.11
core02: 192.168.137.12
core03: 192.168.137.13

再次打開各自的neo4j.comf,修改叢集設定值:

core01:

// 告知其他實體要連接的位址,亦可使用hostname
dbms.default_advertised_address=192.168.137.11
// 資料庫實體的執行模式,共有CORE及REPLICA兩種模式,設定為CORE以建立core server
dbms.mode=CORE
// 啟動core server時,設定初始核心叢集的成員位址,亦可使用hostname
causal_clustering.initial_discovery_members=192.168.137.11:5000,192.168.137.12:5000,192.168.137.13:5000
// 設定預期核心叢集的成員數量
causal_clustering.minimum_core_cluster_size_at_formation=3
// 設定最小可運作的核心叢集成員數量
causal_clustering.minimum_core_cluster_size_at_runtime=3

core02:

// 告知其他實體要連接的位址,亦可使用hostname
dbms.default_advertised_address=192.168.137.12
// 資料庫實體的執行模式,共有CORE及REPLICA兩種模式,設定為CORE以建立core server
dbms.mode=CORE
// 啟動core server時,設定初始核心叢集的成員位址,亦可使用hostname
causal_clustering.initial_discovery_members=192.168.137.11:5000,192.168.137.12:5000,192.168.137.13:5000
// 設定預期核心叢集的成員數量
causal_clustering.minimum_core_cluster_size_at_formation=3
// 設定最小可運作的核心叢集成員數量
causal_clustering.minimum_core_cluster_size_at_runtime=3

core03:

// 告知其他實體要連接的位址,亦可使用hostname
dbms.default_advertised_address=192.168.137.13
// 資料庫實體的執行模式,共有CORE及REPLICA兩種模式,設定為CORE以建立core server
dbms.mode=CORE
// 啟動core server時,設定初始核心叢集的成員位址,亦可使用hostname
causal_clustering.initial_discovery_members=192.168.137.11:5000,192.168.137.12:5000,192.168.137.13:5000
// 設定預期核心叢集的成員數量
causal_clustering.minimum_core_cluster_size_at_formation=3
// 設定最小可運作的核心叢集成員數量
causal_clustering.minimum_core_cluster_size_at_runtime=3

設定完後,依序啟動三台Neo4j服務(啟動順序不受影響)

叢集初始化需要一些時間,可以透過監看log來得知何時建置完成

// 於cent-OS中輸入
journalctl -u neo4j -f

從log可以看出,core01成功與core02及core03連線,並組成因果叢集

我們再次進入GUI介面,點選左下角的:sysinfo,查看目前資料庫狀態

從圖上左下我們可以看到,core01在這個core server中是擔任LEADER的角色,右方資訊欄可以看到,目前所有資料庫的leader及follower是哪一台主機,這表示因果叢集已成功建立。

 

架設Read Replica Server

再次複製一個已安裝Neo4j虛擬機器,或是按前述步驟重新建立一個含Neo4j實體的虛擬機器

此一Replica server所使用的ip為:192.168.137.14

再次打開neo4j.comf,修改叢集設定值:

// 告知其他實體要連接的位址,亦可使用hostname
dbms.default_advertised_address=192.168.137.14
// 資料庫實體的執行模式,共有CORE及REPLICA兩種模式,設定為READ_REPLICA以建立read replica server
dbms.mode=READ_REPLICA
// 啟動core server時,設定初始核心叢集的成員位址,亦可使用hostname
causal_clustering.initial_discovery_members=192.168.137.11:5000,192.168.137.12:5000,192.168.137.13:5000

設定完畢後啟動Neo4j,監看log並靜待Neo4j建立唯讀副本伺服器

回到核心伺服器,查詢資料庫狀態:

可以看到唯讀副本伺服器已成功建立

再登入唯讀副本伺服器查詢資料,查詢是否與核心伺服器一致

確認查詢到的資料完全一致,至此Neo4j的因果叢集已完全架設完畢。

 

分離Read Replica Server

基於版本升級或其他需求,可能需要將唯讀副本伺服器分離,並維持現有資料快照,但是此舉會降低查詢性能並降低安全性。

進入唯讀副本的neo4j.comf,修改叢集設定值:

// 資料庫實體的執行模式,欲暫時從因果叢集切換為獨立實體時,可設定為SINGLE
dbms.mode=SINGLE

 

使用PORT

作用 預設port config對應設定
HTTP 7474 dbms.connector.http.listen_address
HTTPS 7473 dbms.connector.https.listen_address
Bolt 7687 dbms.connector.bolt.listen_address
Causal Cluster discovery management 5000 causal_clustering.discovery_listen_address
Causal Cluster transaction 6000 causal_clustering.transaction_listen_address
Causal Cluster RAFT 7000 causal_clustering.raft_listen_address
Causal Cluster routing connector 7688 dbms.routing.listen_address

 

Reference:

https://neo4j.com/docs/operations-manual/4.2/installation/linux/rpm/

https://neo4j.com/docs/operations-manual/4.2/clustering/deploy/

何家瑋