Neo4j叢集伺服器搭建

Web程式猿部落格:http://blog.csdn.net/thinkercode

引言:Neo4j是目前主流的圖資料庫,它本身也提供了高可用的叢集解決方案,相比傳統的關係型資料庫,它可以快速的進行基於人際社交網路類的查詢查詢和檢索;它同時提供了cypher語言來方便進行圖資料庫的操作和查詢,該查詢語言類似SQL語言。

什麼是圖形資料庫

  圖形資料庫(graphic database)是利用計算機將點、線、畫霹圖形基本元素按一定資料結同灶行儲存的資料集合。
  圖形資料庫將地圖與其它型別的平面圖中的圖形描述為點、線、面等基本元素,並將這些圖形元素按一定資料結構(通常為拓撲資料結構)建立起來的資料集合。包括兩個層次:第一層次為拓撲編碼的資料集合,由描述點、線、面等圖形元素間關係的資料檔案組成,包括多邊形檔案、線段檔案、結點檔案等。檔案間通過關聯資料項相互聯絡;第二層次為座標編碼資料集合,由描述各圖形元素空間位置的座標檔案組成。圖形資料庫是地理資訊系統中對向量結構地圖數字化資料進行組織的主要形式。
  Neo4j是一個用Java實現的、高效能的、NoSQL圖形資料庫。Neo4j 使用圖(graph)相關的概念來描述資料模型,通過圖中的節點和節點的關係來建模。Neo4j完全相容ACID的事務性。Neo4j以“節點空間”來表達領域資料,相對於傳統的關係型資料庫的表、行和列來說,節點空間可以更好地儲存由節點關係和屬性構成的網路,如社交網路,朋友圈等。
  由Neo4j構建“圖”模型,也可以準確表達 資料庫模型,key-value模型,文件模型的資料關係。

高可用架構

  高可用性(High Availability)特徵只能在Neo4j 企業版中可用,Neo4j High Availability 或者 Neo4j HA 提供以下兩點主要特徵:
1. 可以是一個使用多臺neo4j從資料庫設定可以替代單臺neo4j主資料庫的容錯架構資料庫,這可以在硬體裝置損壞的情況下使資料庫具備完善的功能和讀寫操作的能力。
2. 系統具有比單臺neo4j資料庫處理更多的讀取負載處理的橫向掃描主讀架構。

  Neo4j HA 設計的目的是為了從一臺到多臺機器transition的操作簡單,而不需要在已存在的應用中做任何更改。當neo4j資料庫以HA模式執行時,總是會有一個單臺的主機(master),零個或者更多的從機(slave)。與其他主從複製設定相對比,Neo4j可以從從節點(slave)處理寫入,所以不需要從主節點直接寫入。為保持資料一致性,從節點(slave)將於主節點(master)同步處理寫入。然而更新操作最終從主節點(master)傳播到從節點(slave),所以一個從節點的寫入在其他所有從節點上不是立即可見的。這是多臺裝置與單臺裝置在Neo4j HA模式下執行操作的唯一區別,所有其他ACID特徵都一樣。從節點寫入資料同步效率極低,不建議直接往從節點寫入,自己在測試期間也發現很多問題。

在HA模式向執行多個Neo4j資料庫實體的經典設定

系統環境

  作業系統:CentOS-6.5-x86_64
  OpenJDK 1.8.0
  Neo4j enterprise-2.2.2
  Neo4j-1 192.168.10.133
  Neo4j-2 192.168.10.134
  Neo4j-3 192.168.10.135
  Neo4j-4 192.168.10.136
  Haproxy 192.168.10.141
  部署方式:先以Neo4j-1、Neo4j-2、Neo4j-3搭建叢集,之後不重啟加入Neo4j-4

服務搭建

一、4臺伺服器全部安裝JDK

[[email protected] ~]# yum install -y java-1.7.0-openjdk

二、安裝Neo4j

[[email protected] ~]# yum install -y lsof
[[email protected] ~]# tar xzf neo4j-enterprise-2.2.2-unix.tar.gz
[[email protected] ~]# mv neo4j-enterprise-2.2.2 neo4j
[[email protected] bin]# chmod  x neo4j/bin/*

三、服務配置

如果在已有的伺服器上配置叢集,只能有一條伺服器上可以有資料,其他伺服器的data/graph.db目錄必須清空
調整Neo4j-1的neo4j-server.properties配置檔案

dbms.security.auth_enabled=false
org.neo4j.server.database.mode=HA
org.neo4j.server.webserver.address=0.0.0.0

調整Neo4j-1的neo4j.properties配置檔案

remote_shell_enabled=true
remote_shell_host=127.0.0.1
remote_shell_port=1337
ha.server_id=1
ha.initial_hosts=192.168.10.133:5001,192.168.10.134:5001,192.168.10.135:5001
ha.cluster_server=192.168.10.133:5001
ha.server=192.168.10.133:6001
ha.pull_interval=10

調整Neo4j-2的neo4j-server.properties配置檔案

dbms.security.auth_enabled=false
org.neo4j.server.database.mode=HA
org.neo4j.server.webserver.address=0.0.0.0

調整Neo4j-2的neo4j.properties配置檔案

remote_shell_enabled=true
remote_shell_host=127.0.0.1
remote_shell_port=1337
ha.server_id=2
ha.initial_hosts=192.168.10.133:5001,192.168.10.134:5001,192.168.10.135:5001
ha.cluster_server=192.168.10.134:5001
ha.server=192.168.10.134:6001
ha.pull_interval=10

調整Neo4j-3的neo4j-server.properties配置檔案

dbms.security.auth_enabled=false
org.neo4j.server.database.mode=HA
org.neo4j.server.webserver.address=0.0.0.0

調整Neo4j-3的neo4j.properties配置檔案

remote_shell_enabled=true
remote_shell_host=127.0.0.1
remote_shell_port=1337
ha.server_id=3
ha.initial_hosts=192.168.10.133:5001,192.168.10.134:5001,192.168.10.135:5001
ha.cluster_server=192.168.10.135:5001
ha.server=192.168.10.135:6001
ha.pull_interval=10

四、啟動服務

Neo4j-1[[email protected] ~]# neo4j/bin/neo4j start
Neo4j-2[[email protected] ~]# neo4j/bin/neo4j start
Neo4j-3[[email protected] ~]# neo4j/bin/neo4j start

如果無法啟動服務就把iptables和selinux關閉,或者設定防火請規則。

五、動態新增一臺伺服器到叢集
調整Neo4j-4的neo4j-server.properties配置檔案

dbms.security.auth_enabled=false
org.neo4j.server.database.mode=HA
org.neo4j.server.webserver.address=0.0.0.0

調整Neo4j-4的neo4j.properties配置檔案

remote_shell_enabled=true
remote_shell_host=127.0.0.1
remote_shell_port=1337
ha.server_id=4
ha.initial_hosts=192.168.10.133:5001,192.168.10.134:5001,192.168.10.135:5001,192.168.10.136:5001
ha.cluster_server=192.168.10.136:5001
ha.server=192.168.10.136:6001
ha.pull_interval=10

六、啟動Neo4j-4服務

Neo4j-4[[email protected] ~]# neo4j/bin/neo4j start

此時叢集中已經有了四臺伺服器,其中一臺主庫,3臺從庫

叢集狀態

一主多重模式

一、Haproxy下載與安裝

[[email protected] ~]# wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.20.tar.gz
[[email protected] ~]# tar xzvf haproxy-1.4.20.tar.gz
[[email protected] ~]# cd haproxy-1.4.20
[[email protected] ~]# uname -a
[[email protected] ~]# make TARGET=linux26
[[email protected] ~]# make install

二、配置Haproxy
把所有從庫配置在Haproxy中,通過程式區分主從服務

[[email protected] ~]# vi /usr/local/sbin/haproxy.cfg
global
daemon
maxconn 256
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http-in
bind *:7474
default_backend neo4j-slaves
backend neo4j-slaves
option httpchk GET /db/manage/server/ha/slave
server s1 192.168.10.134:7474 maxconn 32 check
server s2 192.168.10.135:7474 maxconn 32 check
server s3 192.168.10.136:7474 maxconn 32 check

三、啟動服務

[[email protected] ~]# /usr/local/sbin/haproxy -f /usr/local/sbin/haproxy.cfg &

應用程式在寫資料時連線192.168.10.133:7474伺服器,再讀資料時連線192.168.10.141:7474

master自動選舉模式

Neo4j支援自動推薦master,當master出現故障的時候,會自動選舉一臺slave為master,由於Neo4j並沒有MongoDB的mongos路由服務,導致這種高可用模式只能通過負載均衡器來實現。上述方式當master掛了,Neo4j會自動推舉一臺slave為master,但是應用程式並不知道,所以並沒有用到該特性。實現該特性需要利用兩個負載均衡器,一個傳送請求到master,一個傳送請求到slave,請求型別的區分就要在應用程式端來實現。這裡的取捨,雖然Neo4j允許在slave寫入,這種間接關係增加了不必要的寫請求延遲,通過這種模式可以區分讀寫,且能實現自動推舉master功能。

一、配置Haproxy

global
daemon
maxconn 256
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http-in
bind *:7474
default_backend neo4j-master
backend neo4j-master
option httpchk GET /db/manage/server/ha/master
server s1 192.168.10.134:7474 maxconn 32 check
server s2 192.168.10.135:7474 maxconn 32 check
server s3 192.168.10.136:7474 maxconn 32 check
server s4 192.168.10.133:7474 maxconn 32 check
frontend http-in-slaves
bind *:7475
default_backend neo4j-slaves
backend neo4j-slaves
option httpchk GET /db/manage/server/ha/slave
server s1 192.168.10.134:7474 maxconn 32 check
server s2 192.168.10.135:7474 maxconn 32 check
server s3 192.168.10.136:7474 maxconn 32 check
server s4 192.168.10.133:7474 maxconn 32 check

二、啟動服務

[[email protected] ~]# /usr/local/sbin/haproxy -f /usr/local/sbin/haproxy.cfg &

應用程式在寫資料時連線192.168.10.141:7474伺服器,再讀資料時連線192.168.10.141:7475