目錄
- 前言
- 一、Docker 安裝部署neo4j
- 二、源碼包安裝 neo4j
- 三、k8s搭建NEO4J因果集
- neo4j 3個(gè)成員組成的集群
- 托管Kubernetes上部署Neo4J單核
- 總結(jié)
前言
Neo4j是一個(gè)高性能的,NOSQL圖形數(shù)據(jù)庫,本身就支持集群部署,今天要搭建的就是neo4j的因果集群,其中分為:
核心節(jié)點(diǎn):core-server,可以對數(shù)據(jù)進(jìn)行讀寫的中心節(jié)點(diǎn),通過選舉確定leader,follower.
只讀節(jié)點(diǎn):read-replica,只提供數(shù)據(jù)訪問的只讀節(jié)點(diǎn),需要連接核心節(jié)點(diǎn),可以非常方便的進(jìn)行擴(kuò)展
一、Docker 安裝部署neo4j
第一步,從鏡像源中查找鏡像
docker search neo4j
第二步,拉取鏡像源
docker pull neo4j(:版本號(hào)) //缺省 “:版本號(hào)” 時(shí)默認(rèn)安裝latest版本的
第三步,查看本地鏡像,檢驗(yàn)是否拉取成功
docker images
啟動(dòng)容器
docker run -d --name container_name -p 27474:7474 -p 27687:7687 -v /home/neo4j/data:/data -v /home/neo4j/logs:/logs -v /home/neo4j/conf:/var/lib/neo4j/conf -v /home/neo4j/import:/var/lib/neo4j/import --env NEO4J_AUTH=neo4j/password neo4j
-d --name container_name //-d表示容器后臺(tái)運(yùn)行 --name指定容器名字 -p 27474:7474 -p 27687:7687 //映射容器的端口號(hào)到宿主機(jī)的端口號(hào);27474 為宿主機(jī)端口 -v /home/neo4j/data:/data //把容器內(nèi)的數(shù)據(jù)目錄掛載到宿主機(jī)的對應(yīng)目錄下 -v /home/neo4j/logs:/logs //掛載日志目錄 -v /home/neo4j/conf:/var/lib/neo4j/conf //掛載配置目錄 -v /home/neo4j/import:/var/lib/neo4j/import //掛載數(shù)據(jù)導(dǎo)入目錄 --env NEO4J_AUTH=neo4j/password //設(shè)定數(shù)據(jù)庫的名字的訪問密碼 neo4j //指定使用的鏡像
修改配置文件
// 進(jìn)入容器配置目錄掛載在宿主機(jī)的對應(yīng)目錄,我這里是/home/neo4j/conf cd /home/neo4j/conf // vim編輯器打開neo4j.conf vim neo4j.conf // 進(jìn)行以下更改 //在文件配置末尾添加這一行 dbms.connectors.default_listen_address=0.0.0.0 //指定連接器的默認(rèn)監(jiān)聽ip為0.0.0.0,即允許任何ip連接到數(shù)據(jù)庫 //修改 dbms.connector.bolt.listen_address=0.0.0.0:7687 //取消注釋并把對bolt請求的監(jiān)聽“地址:端口”改為“0.0.0.0:7687” dbms.connector.http.listen_address=0.0.0.0:7474 //取消注釋并把對http請求的監(jiān)聽“地址:端口”改為“0.0.0.0:7474”
重啟neo4j容器
二、源碼包安裝 neo4j
// 命令下載 curl -O http://dist.neo4j.org/neo4j-community-3.4.5-unix.tar.gz // 解壓安裝 tar -axvf neo4j-community-3.4.5-unix.tar.gz
安裝目錄下找到conf目錄下的neo4j.conf文件,修改相應(yīng)配置
# 修改第22行l(wèi)oad csv時(shí)l路徑,在前面加個(gè)#,可從任意路徑讀取文件 #dbms.directories.import=import # 修改35行和36行,設(shè)置JVM初始堆內(nèi)存和JVM最大堆內(nèi)存 # 生產(chǎn)環(huán)境給的JVM最大堆內(nèi)存越大越好,但是要小于機(jī)器的物理內(nèi)存 dbms.memory.heap.initial_size=5g dbms.memory.heap.max_size=10g # 修改46行,可以認(rèn)為這個(gè)是緩存,如果機(jī)器配置高,這個(gè)越大越好 dbms.memory.pagecache.size=10g # 修改54行,去掉改行的#,可以遠(yuǎn)程通過ip訪問neo4j數(shù)據(jù)庫 dbms.connectors.default_listen_address=0.0.0.0 # 默認(rèn) bolt端口是7687,http端口是7474,https關(guān)口是7473,不修改下面3項(xiàng)也可以 # 修改71行,去掉#,設(shè)置http端口為7687,端口可以自定義,只要不和其他端口沖突就行 dbms.connector.bolt.listen_address=:7687 # 修改75行,去掉#,設(shè)置http端口為7474,端口可以自定義,只要不和其他端口沖突就行 dbms.connector.http.listen_address=:7474 # 修改79行,去掉#,設(shè)置http端口為7473,端口可以自定義,只要不和其他端口沖突就行 dbms.connector.https.listen_address=:7473 # 修改227行,去掉#,允許從遠(yuǎn)程url來load csv dbms.security.allow_csv_import_from_file_urls=true # 修改246行,允許使用neo4j-shell,類似于mysql 命令行之類的 dbms.shell.enabled=true # 修改248行,去掉#,設(shè)置連接neo4j-shell的端口,一般都是localhost或者127.0.0.1,這樣安全,其他地址的話,一般使用https就行 dbms.shell.host=127.0.0.1 # 修改250行,去掉#,設(shè)置neo4j-shell端口,端口可以自定義,只要不和其他端口沖突就行 dbms.shell.port=1337 # 修改254行,設(shè)置neo4j可讀可寫 dbms.read_only=false # 設(shè)置JDK,若系統(tǒng)默認(rèn)是jdk1.8及以上可以不需要設(shè)置 JAVA_HOME=/usr/java/jdk1.8.0_144 JRE_HOME=/usr/java/jdk1.8.0_144/jre
APOC下載
Neo4j插件APOC
將下載好的.jar文件直接放到neo4j安裝目錄下的plugins文件夾目錄下就可以了。不要解壓!!!
配置
neo4j安裝目錄下conf文件夾里的neo4j.conf 將dbms.security.auth_enabled=false注釋掉
文件末尾加上:
dbms.sercurity.procedures.unrestricted=apoc.* dbms.memory.pagecache.size=10g dbms.memory.heap.initial_size=1g dbms.memory.heap.max_size=4g
三、k8s搭建NEO4J因果集
此集群是有狀態(tài)的服務(wù),所以使用k8s的StatefulSet進(jìn)行部署,創(chuàng)建neo4j-core-server.yaml文件
部署NEO4J-CORE-SERVER集群
# 先創(chuàng)建neo4j的命名空間namespace --- apiVersion: v1 kind: Namespace metadata: name: neo4j labels: name: neo4j --- apiVersion: apps/v1beta1 kind: StatefulSet metadata: name: neo4j-core namespace: neo4j labels: app: neo4j-core spec: replicas: 2 # 部署2個(gè)core-server selector: matchLabels: app: neo4j-core serviceName: neo4j-core template: metadata: labels: app: neo4j-core spec: containers: - name: neo4j-core image: neo4j:3.5.5-enterprise # 官方鏡像,3.5.5企業(yè)版 imagePullPolicy: IfNotPresent env: # 這里通過env,配置鏡像環(huán)境參數(shù),這是因?yàn)榇绥R像是通過這樣來進(jìn)行配置參數(shù)的 - name: NEO4J_ACCEPT_LICENSE_AGREEMENT # 接受證書協(xié)議,必須的 value: "yes" - name: NEO4J_dbms_connectors_default__advertised__address # 指定自身pod的ip地址,默認(rèn)為localhost,在集群中必須注明自身地址,這里直接用ip valueFrom: fieldRef: fieldPath: status.podIP - name: NEO4J_dbms_mode # 節(jié)點(diǎn)的模式,選擇CORE,就是核心節(jié)點(diǎn) value: "CORE" - name: NEO4J_AUTH # 一定要自定義初始驗(yàn)證的用戶名/密碼 value: "neo4j/your-password" - name: NEO4J_causal__clustering_minimum__core__cluster__size__at__formation value: "2" - name: NEO4J_causal__clustering_minimum__core__cluster__size__at__runtime value: "2" - name: NEO4J_causal__clustering_discovery__type # 默認(rèn)集群發(fā)現(xiàn)方式為LIST,這里寫不寫都行 value: "LIST" - name: NEO4J_causal__clustering_initial__discovery__members # 手動(dòng)寫明集群中所有成員的ip:port,5000端口為集群發(fā)現(xiàn)端口 value: "neo4j-core-0.neo4j-core.neo4j.svc.cluster.local:5000,neo4j-core-1.neo4j-core.neo4j.svc.cluster.local:5000" - name: NEO4J_causal__clustering_discovery__advertised__address # 下面這三個(gè)必須定義,為節(jié)點(diǎn)自身的ip:port,相當(dāng)于節(jié)點(diǎn)自身的名稱,因?yàn)槟J(rèn)是會(huì)用自身hostname,但是在k8s中,無法單單通過hostname解析到ip地址,這樣定義的自身地址會(huì)無法識(shí)別 value: $(NEO4J_dbms_connectors_default__advertised__address):5000 - name: NEO4J_causalClustering_transactionAdvertisedAddress value: $(NEO4J_dbms_connectors_default__advertised__address):6000 - name: NEO4J_causalClustering_raftAdvertisedAddress value: $(NEO4J_dbms_connectors_default__advertised__address):7000 volumeMounts: - name: neo4j-core # 掛載數(shù)據(jù)目錄/data mountPath: /data volumeClaimTemplates: - metadata: name: neo4j-core # 這里name要和上面volumeMounts的name一致,才能綁定到對應(yīng)的pod annotations: volume.beta.kubernetes.io/storage-class: "managed-nfs-storage" # 這里是上一步創(chuàng)建的nfs動(dòng)態(tài)卷name spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 2Gi # 大小自定義 --- apiVersion: v1 kind: Service metadata: name: neo4j-core namespace: neo4j spec: selector: app: neo4j-core type: NodePort # 這里用nodeport來開啟外網(wǎng)訪問,沒用traefik是因?yàn)?687的連接端口不是http訪問,需要4層負(fù)載,但是traefik不支持,所以只能通過nodeport來實(shí)現(xiàn)外網(wǎng)訪問,才能正常訪問7474端口的web管理界面。 ports: - protocol: TCP name: http port: 7474 nodePort: 27474 targetPort: 7474 - protocol: TCP name: blot port: 7687 nodePort: 27687 targetPort: 7687
執(zhí)行 yaml文件
kubectl create -f neo4j-core-server.yaml
【注】
1. 以上yaml文件中的注釋要看清楚,因?yàn)?因果集群的核心節(jié)點(diǎn)是采用的選舉方式來確定主節(jié)點(diǎn)的,所以最好是單數(shù)節(jié)點(diǎn),我這里只部署了2個(gè)節(jié)點(diǎn),只是因?yàn)橘Y源不太夠,測試而已,生產(chǎn)使用的話,最少3節(jié)點(diǎn)。
2. 在這里,我用的默認(rèn)的list的集群發(fā)現(xiàn)方式,有一點(diǎn)不好,就是如果增加節(jié)點(diǎn),需要自己手動(dòng)寫上所有集群節(jié)點(diǎn)到列表中,且增加核心節(jié)點(diǎn)的時(shí)候,會(huì)比較麻煩。
官方有三種發(fā)現(xiàn)方式,分別為LIST,DNS,K8S。
DNS的發(fā)現(xiàn)方式,可以通過在Service中,使用clusterIP:None 來取消負(fù)載的ip,然后在`NEO4J_causal__clustering_initial__discovery__members` 中設(shè)置為 `neo4j-core-0.neo4j-core.neo4j.svc.cluster.local:5000`,然后通過k8s集群中的dns服務(wù),來解析到此Service中所有的ip。
這樣配置非常方便,還不需要修改,沒用是因?yàn)镾ervice中,如果用了clusterIP:None 則沒發(fā)使用nodeport來暴露7687的tcp端口給k8s外部網(wǎng)絡(luò)使用,除非traefik可以實(shí)現(xiàn)tcp的4層負(fù)載,或者不是使用的traefik,二是nginx的Ingress,實(shí)現(xiàn)4層負(fù)載即可。
K8S的發(fā)現(xiàn)方式呢,由于文檔沒有示例的配置參考,不管怎么樣設(shè)置,都還是無法正常啟動(dòng),所以就沒法用。3. 數(shù)據(jù)持久化存儲(chǔ),我這里用的nfs動(dòng)態(tài)卷。
4. 其中一定要自定義初始化的用戶密碼,因?yàn)閚eo4j的每個(gè)節(jié)點(diǎn)的用戶驗(yàn)證系統(tǒng)是獨(dú)立的!
也就是說,你在leader節(jié)點(diǎn)上新增用戶或修改密碼,是不會(huì)同步到follower節(jié)點(diǎn)上的。
所以,為了不至于當(dāng)leader節(jié)點(diǎn)掛掉后,新的leader節(jié)點(diǎn)密碼不同導(dǎo)致出錯(cuò),部署時(shí)最好統(tǒng)一用戶密碼,當(dāng)然只讀節(jié)點(diǎn)也是。
執(zhí)行后,查看pod的日志,如下則為正常啟動(dòng)
部署只讀節(jié)點(diǎn)READ-REPLICA
core核心節(jié)點(diǎn)部署完成后,則可以進(jìn)行只讀節(jié)點(diǎn)的部署,只讀節(jié)點(diǎn)比核心節(jié)點(diǎn)則簡單很多,創(chuàng)建neo4j-read-replica.yaml 文件
--- apiVersion: apps/v1 kind: Deployment metadata: name: neorj-read-replica namespace: neo4j labels: app: neorj-read-replica spec: replicas: 3 selector: matchLabels: app: neorj-read-replica template: metadata: labels: app: neorj-read-replica spec: containers: - name: neorj-read-replica image: neo4j:3.5.5-enterprise imagePullPolicy: IfNotPresent env: - name: NEO4J_ACCEPT_LICENSE_AGREEMENT value: "yes" - name: NEO4J_dbms_connectors_default__advertised__address valueFrom: fieldRef: fieldPath: status.podIP - name: NEO4J_dbms_mode # 指定模式為只讀節(jié)點(diǎn)模式 value: "READ_REPLICA" - name: NEO4J_AUTH value: "neo4j/your-password" # 統(tǒng)一設(shè)置用戶密碼 - name: NEO4J_causal__clustering_discovery__type value: "LIST" - name: NEO4J_causal__clustering_initial__discovery__members value: "neo4j-core-0.neo4j-core.neo4j.svc.cluster.local:5000,neo4j-core-1.neo4j-core.neo4j.svc.cluster.local:5000" --- apiVersion: v1 kind: Service metadata: name: neorj-read-replica namespace: neo4j spec: selector: app: neorj-read-replica ports: - protocol: TCP port: 7687 targetPort: 7687
執(zhí)行此yaml文件,創(chuàng)建只讀節(jié)點(diǎn)
kubectl create -f neo4j-read-replica.yaml
【注】
部署3個(gè)只讀節(jié)點(diǎn),無狀態(tài)服務(wù),不需要進(jìn)行數(shù)據(jù)持久化,只需要將core節(jié)點(diǎn)的集群列表寫出就行了,會(huì)自動(dòng)去找到核心節(jié)點(diǎn)的集群,然后從中復(fù)制數(shù)據(jù),提供訪問即可。
因?yàn)橹蛔x節(jié)點(diǎn)只能訪問數(shù)據(jù),所以沒必要提供k8s的外部訪問,所以直接在service中負(fù)載一下bolt的訪問端口就行了,以提供給k8s內(nèi)部應(yīng)用訪問即可。
查看日志如下為正常啟動(dòng)
訪問WEB界面
部署完成后,設(shè)置域名,設(shè)置nginx,訪問web界面
默認(rèn)用戶密碼為: neo4j / neo4j
登錄修改密碼,然后查看狀態(tài),可以看到集群的狀態(tài)
neo4j 3個(gè)成員組成的集群
為每個(gè)成員創(chuàng)建一個(gè)PersistentVolume
volume.sh
for i in $(seq 0 2); do cat <<EOF | kubectl create -f - kind: PersistentVolume apiVersion: v1 metadata: name: pv${i} labels: type: local app: neo4j spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce hostPath: path: "/tmp/${i}" EOF cat <<EOF | kubectl create -f - kind: PersistentVolumeClaim apiVersion: v1 metadata: name: datadir-neo4j-${i} labels: app: neo4j spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi EOF done
運(yùn)行此腳本,它將創(chuàng)建3個(gè)卷
$ kubectl get pv NAME CAPACITY ACCESSMODES STATUS CLAIM REASON AGE pv0 1Gi RWO Bound default/datadir-neo4j-0 7s pv1 1Gi RWO Bound default/datadir-neo4j-1 7s pv2 1Gi RWO Bound default/datadir-neo4j-2 7s
$ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESSMODES AGE datadir-neo4j-0 Bound pv0 1Gi RWO 26s datadir-neo4j-1 Bound pv1 1Gi RWO 26s datadir-neo4j-2 Bound pv2 1Gi RWO 25s
我們需要?jiǎng)?chuàng)建一個(gè)PetSet模板
# Headless service to provide DNS lookup apiVersion: v1 kind: Service metadata: labels: app: neo4j name: neo4j spec: clusterIP: None ports: - port: 7474 selector: app: neo4j ---- # new API name apiVersion: "apps/v1alpha1" kind: PetSet metadata: name: neo4j spec: serviceName: neo4j replicas: 3 template: metadata: annotations: pod.alpha.kubernetes.io/initialized: "true" pod.beta.kubernetes.io/init-containers: '[ { "name": "install", "image": "gcr.io/google_containers/busybox:1.24", "command": ["/bin/sh", "-c", "echo \" unsupported.dbms.edition=enterprise\n dbms.mode=CORE\n dbms.connectors.default_advertised_address=$HOSTNAME.neo4j.default.svc.cluster.local\n dbms.connectors.default_listen_address=0.0.0.0\n dbms.connector.bolt.type=BOLT\n dbms.connector.bolt.enabled=true\n dbms.connector.bolt.listen_address=0.0.0.0:7687\n dbms.connector.http.type=HTTP\n dbms.connector.http.enabled=true\n dbms.connector.http.listen_address=0.0.0.0:7474\n causal_clustering.raft_messages_log_enable=true\n causal_clustering.initial_discovery_members=neo4j-0.neo4j.default.svc.cluster.local:5000,neo4j-1.neo4j.default.svc.cluster.local:5000,neo4j-2.neo4j.default.svc.cluster.local:5000\n causal_clustering.leader_election_timeout=2s\n \" > /work-dir/neo4j.conf" ], "volumeMounts": [ { "name": "confdir", "mountPath": "/work-dir" } ] } ]' labels: app: neo4j spec: containers: - name: neo4j image: "neo4j/neo4j-experimental:3.1.0-M13-beta3-enterprise" imagePullPolicy: Always ports: - containerPort: 5000 name: discovery - containerPort: 6000 name: tx - containerPort: 7000 name: raft - containerPort: 7474 name: browser - containerPort: 7687 name: bolt securityContext: privileged: true volumeMounts: - name: datadir mountPath: /data - name: confdir mountPath: /conf volumes: - name: confdir volumeClaimTemplates: - metadata: name: datadir annotations: volume.alpha.kubernetes.io/storage-class: anything spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 2Gi
創(chuàng)建PetSet
$ kubectl create -f neo4j.yaml service "neo4j" created petset "neo4j" created
檢查Pod是否已啟動(dòng)并正在運(yùn)行
$ kubectl get pods NAME READY STATUS RESTARTS AGE neo4j-0 1/1 Running 0 2m neo4j-1 1/1 Running 0 14s neo4j-2 1/1 Running 0 10s
neo4j的日志文件
$ kubectl logs neo4j-0 Starting Neo4j. 2016-11-25 16:39:50.333+0000 INFO Starting... 2016-11-25 16:39:51.723+0000 INFO Bolt enabled on 0.0.0.0:7687. 2016-11-25 16:39:51.733+0000 INFO Initiating metrics... 2016-11-25 16:39:51.911+0000 INFO Waiting for other members to join cluster before continuing... 2016-11-25 16:40:12.074+0000 INFO Started. 2016-11-25 16:40:12.428+0000 INFO Mounted REST API at: /db/manage 2016-11-25 16:40:13.350+0000 INFO Remote interface available at http://neo4j-0.neo4j.default.svc.cluster.local:7474/
$ kubectl logs neo4j-1 Starting Neo4j. 2016-11-25 16:39:53.846+0000 INFO Starting... 2016-11-25 16:39:56.212+0000 INFO Bolt enabled on 0.0.0.0:7687. 2016-11-25 16:39:56.225+0000 INFO Initiating metrics... 2016-11-25 16:39:56.341+0000 INFO Waiting for other members to join cluster before continuing... 2016-11-25 16:40:16.623+0000 INFO Started. 2016-11-25 16:40:16.951+0000 INFO Mounted REST API at: /db/manage 2016-11-25 16:40:17.607+0000 INFO Remote interface available at http://neo4j-1.neo4j.default.svc.cluster.local:7474/
$ kubectl logs neo4j-2 Starting Neo4j. 2016-11-25 16:39:57.828+0000 INFO Starting... 2016-11-25 16:39:59.166+0000 INFO Bolt enabled on 0.0.0.0:7687. 2016-11-25 16:39:59.176+0000 INFO Initiating metrics... 2016-11-25 16:39:59.329+0000 INFO Waiting for other members to join cluster before continuing... 2016-11-25 16:40:19.216+0000 INFO Started. 2016-11-25 16:40:19.675+0000 INFO Mounted REST API at: /db/manage 2016-11-25 16:40:21.029+0000 INFO Remote interface available at http://neo4j-2.neo4j.default.svc.cluster.local:7474/
為每個(gè)服務(wù)器設(shè)置了端口轉(zhuǎn)發(fā)
$ kubectl port-forward neo4j-0 27474:7474 27687:7687
運(yùn)行以下過程來獲得集群的概述
CALL dbms.cluster.overview() ╒════════════════════════════════════╤══════════════════════════════════════════════════════╤════════╕ │id │addresses │role │ ╞════════════════════════════════════╪══════════════════════════════════════════════════════╪════════╡ │81d8e5e2-02db-4414-85de-a7025b346e84│[bolt://neo4j-0.neo4j.default.svc.cluster.local:27687,│LEADER │ │ │ http://neo4j-0.neo4j.default.svc.cluster.local:27474]│ │ ├────────────────────────────────────┼──────────────────────────────────────────────────────┼────────┤ │347b7517-7ca0-4b92-b9f0-9249d46b2ad3│[bolt://neo4j-1.neo4j.default.svc.cluster.local:27687,│FOLLOWER│ │ │ http://neo4j-1.neo4j.default.svc.cluster.local:27474]│ │ ├────────────────────────────────────┼──────────────────────────────────────────────────────┼────────┤ │a5ec1335-91ce-4358-910b-8af9086c2969│[bolt://neo4j-2.neo4j.default.svc.cluster.local:27687,│FOLLOWER│ │ │ http://neo4j-2.neo4j.default.svc.cluster.local:27474]│ │ └────────────────────────────────────┴──────────────────────────────────────────────────────┴────────┘
如果 希望集群中有5臺(tái)服務(wù)器而不是3臺(tái),運(yùn)行以下命令來增加副本的大小
$ kubectl patch petset neo4j -p '{"spec":{"replicas":5}}' "neo4j" patched
再次運(yùn)行該過程
CALL dbms.cluster.overview() ╒════════════════════════════════════╤══════════════════════════════════════════════════════╤════════╕ │id │addresses │role │ ╞════════════════════════════════════╪══════════════════════════════════════════════════════╪════════╡ │81d8e5e2-02db-4414-85de-a7025b346e84│[bolt://neo4j-0.neo4j.default.svc.cluster.local:27687,│LEADER │ │ │ http://neo4j-0.neo4j.default.svc.cluster.local:27474]│ │ ├────────────────────────────────────┼──────────────────────────────────────────────────────┼────────┤ │347b7517-7ca0-4b92-b9f0-9249d46b2ad3│[bolt://neo4j-1.neo4j.default.svc.cluster.local:27687,│FOLLOWER│ │ │ http://neo4j-1.neo4j.default.svc.cluster.local:27474]│ │ ├────────────────────────────────────┼──────────────────────────────────────────────────────┼────────┤ │a5ec1335-91ce-4358-910b-8af9086c2969│[bolt://neo4j-2.neo4j.default.svc.cluster.local:27687,│FOLLOWER│ │ │ http://neo4j-2.neo4j.default.svc.cluster.local:27474]│ │ ├────────────────────────────────────┼──────────────────────────────────────────────────────┼────────┤ │28613d06-d4c5-461c-b277-ddb3f05e5647│[bolt://neo4j-3.neo4j.default.svc.cluster.local:27687,│FOLLOWER│ │ │ http://neo4j-3.neo4j.default.svc.cluster.local:27474]│ │ ├────────────────────────────────────┼──────────────────────────────────────────────────────┼────────┤ │2eaa0058-a4f3-4f07-9f22-d310562ad1ec│[bolt://neo4j-4.neo4j.default.svc.cluster.local:27687,│FOLLOWER│ │ │ http://neo4j-4.neo4j.default.svc.cluster.local:27474]│ │ └────────────────────────────────────┴──────────────────────────────────────────────────────┴────────┘
再次回到3很簡單
$ kubectl patch petset neo4j -p '{"spec":{"replicas":3}}' "neo4j" patched
CALL dbms.cluster.overview() ╒════════════════════════════════════╤══════════════════════════════════════════════════════╤════════╕ │id │addresses │role │ ╞════════════════════════════════════╪══════════════════════════════════════════════════════╪════════╡ │81d8e5e2-02db-4414-85de-a7025b346e84│[bolt://neo4j-0.neo4j.default.svc.cluster.local:27687,│LEADER │ │ │ http://neo4j-0.neo4j.default.svc.cluster.local:27474]│ │ ├────────────────────────────────────┼──────────────────────────────────────────────────────┼────────┤ │347b7517-7ca0-4b92-b9f0-9249d46b2ad3│[bolt://neo4j-1.neo4j.default.svc.cluster.local:27687,│FOLLOWER│ │ │ http://neo4j-1.neo4j.default.svc.cluster.local:27474]│ │ ├────────────────────────────────────┼──────────────────────────────────────────────────────┼────────┤ │a5ec1335-91ce-4358-910b-8af9086c2969│[bolt://neo4j-2.neo4j.default.svc.cluster.local:27687,│FOLLOWER│ │ │ http://neo4j-2.neo4j.default.svc.cluster.local:27474]│ │ └────────────────────────────────────┴──────────────────────────────────────────────────────┴────────┘
托管Kubernetes上部署Neo4J單核
cd /tmp/ git clone https: //github.com/sdaschner/neo4j-helm --branch single-instance cd neo4j-helm/ helm template graphdb \ --set acceptLicenseAgreement=yes \ --set neo4jPassword=mySecretPassword . \ > /tmp/neo4j.yaml kubectl apply -f /tmp/neo4j.yaml