外观
Neo4j 集群安装
因果集群安装
系统要求
- 服务器数量:至少3个核心节点,推荐5个核心节点以提高容错性
- 硬件要求:与单实例相同,推荐8GB以上内存
- 网络要求:低延迟、高带宽的局域网
- Java版本:Java 11或Java 17
- Neo4j版本:Neo4j 4.x或5.x企业版
网络端口配置
- 核心节点之间:
- 7000-7001:集群通信端口
- 7474-7475:HTTP/HTTPS端口
- 7687-7688:Bolt端口
- 只读副本:
- 7000-7001:集群通信端口
- 7474-7475:HTTP/HTTPS端口
- 7687-7688:Bolt端口
安装步骤
1. 准备服务器
- 准备3台或更多服务器,例如:
- core1: 192.168.1.101
- core2: 192.168.1.102
- core3: 192.168.1.103
- read1: 192.168.1.201(可选,只读副本)
- read2: 192.168.1.202(可选,只读副本)
2. 安装Neo4j企业版
- 在所有服务器上安装Neo4j企业版
- 可以使用APT/RPM、ZIP或Docker安装方式
- 确保所有服务器安装相同版本的Neo4j
3. 配置核心节点
配置core1(192.168.1.101)
txt
# 基本配置
server.directories.data=/var/lib/neo4j/data
server.directories.logs=/var/log/neo4j
server.directories.conf=/etc/neo4j
# 网络配置
server.default_listen_address=0.0.0.0
server.bolt.listen_address=0.0.0.0:7687
server.http.listen_address=0.0.0.0:7474
# 因果集群配置
dbms.mode=CORE
dbms.cluster.initial_discovery_members=192.168.1.101:5000,192.168.1.102:5000,192.168.1.103:5000
dbms.cluster.discovery_listen_address=:5000
dbms.cluster.raft.listen_address=:7000
dbms.cluster.transaction_listen_address=:6000
# 集群名称
dbms.cluster.cluster_name=neo4j-cluster
# 认证配置
dbms.security.auth_enabled=true配置core2(192.168.1.102)和core3(192.168.1.103)
- 与core1配置相同,只需确保
server.default_listen_address指向正确的本机IP - 或保持
server.default_listen_address=0.0.0.0,系统会自动使用本机IP
4. 配置只读副本
配置read1(192.168.1.201)
txt
# 基本配置
server.directories.data=/var/lib/neo4j/data
server.directories.logs=/var/log/neo4j
server.directories.conf=/etc/neo4j
# 网络配置
server.default_listen_address=0.0.0.0
server.bolt.listen_address=0.0.0.0:7687
server.http.listen_address=0.0.0.0:7474
# 因果集群配置
dbms.mode=READ_REPLICA
dbms.cluster.initial_discovery_members=192.168.1.101:5000,192.168.1.102:5000,192.168.1.103:5000
dbms.cluster.discovery_listen_address=:5000
# 集群名称
dbms.cluster.cluster_name=neo4j-cluster
# 认证配置
dbms.security.auth_enabled=true5. 启动集群
启动核心节点
- 按照顺序启动核心节点:core1 → core2 → core3
bash
# 在core1上启动
neo4j start
# 在core2上启动
neo4j start
# 在core3上启动
neo4j start启动只读副本
- 核心节点启动成功后,启动只读副本
bash
# 在read1上启动
neo4j start
# 在read2上启动
neo4j start6. 验证集群状态
使用Neo4j Browser验证
- 访问任意核心节点的Neo4j Browser:
http://192.168.1.101:7474 - 登录后,执行以下查询:cypher
CALL dbms.cluster.overview(); - 检查集群成员状态,确保所有节点都已加入集群
使用Cypher Shell验证
bash
# 连接到核心节点
cypher-shell -u neo4j -p <password> -a bolt://192.168.1.101:7687
# 检查集群状态
neo4j@neo4j> CALL dbms.cluster.overview();
# 检查Raft状态
neo4j@neo4j> CALL dbms.cluster.raftStatus();高可用性集群(HA)安装
系统要求
- 服务器数量:至少2个节点,推荐3个或更多节点
- 硬件要求:与单实例相同
- 网络要求:低延迟、高带宽的局域网
- Java版本:Java 11
- Neo4j版本:仅支持Neo4j 3.x企业版
网络端口配置
- 7474-7475:HTTP/HTTPS端口
- 7687-7688:Bolt端口
- 5001:HA集群通信端口
安装步骤
1. 准备服务器
- 准备3台服务器,例如:
- master: 192.168.1.101
- slave1: 192.168.1.102
- slave2: 192.168.1.103
2. 安装Neo4j 3.x企业版
- 在所有服务器上安装Neo4j 3.x企业版
- 可以使用APT/RPM或ZIP安装方式
3. 配置所有节点
修改neo4j.conf配置文件
txt
# 基本配置
dbms.directories.data=/var/lib/neo4j/data
dbms.directories.logs=/var/log/neo4j
dbms.directories.conf=/etc/neo4j
# 网络配置
dbms.connectors.default_listen_address=0.0.0.0
# Bolt配置
dbms.connector.bolt.enabled=true
dbms.connector.bolt.listen_address=0.0.0.0:7687
# HTTP配置
dbms.connector.http.enabled=true
dbms.connector.http.listen_address=0.0.0.0:7474
# HA集群配置
dbms.mode=HA
ha.server_id=1 # 每个节点的ID必须唯一,分别设置为1, 2, 3
high_availability.host=0.0.0.0
high_availability.port=5001
ha.initial_hosts=192.168.1.101:5001,192.168.1.102:5001,192.168.1.103:5001
high_availability.cluster_name=neo4j-ha-cluster
# 认证配置
dbms.security.auth_enabled=true4. 启动HA集群
启动第一个节点(将成为主节点)
bash
neo4j start启动其他节点(将成为从节点)
bash
# 在slave1上启动
neo4j start
# 在slave2上启动
neo4j start5. 验证HA集群状态
使用Neo4j Browser验证
- 访问任意节点的Neo4j Browser:
http://192.168.1.101:7474 - 登录后,执行以下查询:cypher
CALL dbms.cluster.overview(); - 检查集群成员状态,确保所有节点都已加入集群
使用Cypher Shell验证
bash
# 连接到主节点
cypher-shell -u neo4j -p <password> -a bolt://192.168.1.101:7687
# 检查HA状态
neo4j@neo4j> CALL dbms.ha.status();Docker集群部署
使用Docker Compose部署因果集群
创建docker-compose.yml文件
yaml
version: '3'
services:
core1:
image: neo4j:5.14.0-enterprise
container_name: neo4j-core1
ports:
- "7474:7474"
- "7687:7687"
- "5000:5000"
- "6000:6000"
- "7000:7000"
volumes:
- ./data/core1:/data
- ./logs/core1:/logs
- ./conf/core1:/var/lib/neo4j/conf
environment:
- NEO4J_ACCEPT_LICENSE_AGREEMENT=yes
- NEO4J_AUTH=neo4j/password
- NEO4J_dbms_mode=CORE
- NEO4J_causal__clustering_initial__discovery__members=core1:5000,core2:5000,core3:5000
- NEO4J_causal__clustering_discovery__listen__address=:5000
- NEO4J_causal__clustering_transaction__listen__address=:6000
- NEO4J_causal__clustering_raft__listen__address=:7000
- NEO4J_dbms_connector_bolt_listen__address=:7687
- NEO4J_dbms_connector_http_listen__address=:7474
core2:
image: neo4j:5.14.0-enterprise
container_name: neo4j-core2
ports:
- "7475:7474"
- "7688:7687"
- "5001:5000"
- "6001:6000"
- "7001:7000"
volumes:
- ./data/core2:/data
- ./logs/core2:/logs
- ./conf/core2:/var/lib/neo4j/conf
environment:
- NEO4J_ACCEPT_LICENSE_AGREEMENT=yes
- NEO4J_AUTH=neo4j/password
- NEO4J_dbms_mode=CORE
- NEO4J_causal__clustering_initial__discovery__members=core1:5000,core2:5000,core3:5000
- NEO4J_causal__clustering_discovery__listen__address=:5000
- NEO4J_causal__clustering_transaction__listen__address=:6000
- NEO4J_causal__clustering_raft__listen__address=:7000
- NEO4J_dbms_connector_bolt_listen__address=:7687
- NEO4J_dbms_connector_http_listen__address=:7474
core3:
image: neo4j:5.14.0-enterprise
container_name: neo4j-core3
ports:
- "7476:7474"
- "7689:7687"
- "5002:5000"
- "6002:6000"
- "7002:7000"
volumes:
- ./data/core3:/data
- ./logs/core3:/logs
- ./conf/core3:/var/lib/neo4j/conf
environment:
- NEO4J_ACCEPT_LICENSE_AGREEMENT=yes
- NEO4J_AUTH=neo4j/password
- NEO4J_dbms_mode=CORE
- NEO4J_causal__clustering_initial__discovery__members=core1:5000,core2:5000,core3:5000
- NEO4J_causal__clustering_discovery__listen__address=:5000
- NEO4J_causal__clustering_transaction__listen__address=:6000
- NEO4J_causal__clustering_raft__listen__address=:7000
- NEO4J_dbms_connector_bolt_listen__address=:7687
- NEO4J_dbms_connector_http_listen__address=:7474
read1:
image: neo4j:5.14.0-enterprise
container_name: neo4j-read1
ports:
- "7477:7474"
- "7690:7687"
- "5003:5000"
volumes:
- ./data/read1:/data
- ./logs/read1:/logs
- ./conf/read1:/var/lib/neo4j/conf
environment:
- NEO4J_ACCEPT_LICENSE_AGREEMENT=yes
- NEO4J_AUTH=neo4j/password
- NEO4J_dbms_mode=READ_REPLICA
- NEO4J_causal__clustering_initial__discovery__members=core1:5000,core2:5000,core3:5000
- NEO4J_causal__clustering_discovery__listen__address=:5000
- NEO4J_dbms_connector_bolt_listen__address=:7687
- NEO4J_dbms_connector_http_listen__address=:7474启动集群
bash
# 创建数据和配置目录
mkdir -p data/{core1,core2,core3,read1} logs/{core1,core2,core3,read1} conf/{core1,core2,core3,read1}
# 启动集群
docker-compose up -d
# 查看集群状态
docker-compose logs -f验证集群
bash
# 连接到core1
cypher-shell -u neo4j -p password -a bolt://localhost:7687
# 检查集群状态
neo4j@neo4j> CALL dbms.cluster.overview();集群配置最佳实践
1. 核心节点配置
- 数量:推荐使用奇数个核心节点(3、5、7等)
- 内存配置:核心节点需要更多内存,特别是JVM堆内存
- 存储:使用SSD存储,提高读写性能
- 网络:确保核心节点之间网络延迟低
2. 只读副本配置
- 数量:根据读负载需求配置,推荐2-4个只读副本
- 内存配置:只读副本需要更多页面缓存,用于缓存查询结果
- 存储:使用SSD存储
- 网络:确保只读副本与核心节点之间网络畅通
3. 安全配置
- 启用认证:必须启用认证,设置强密码
- 使用HTTPS:生产环境建议使用HTTPS加密通信
- 防火墙配置:限制集群端口的访问范围
- 定期更新:定期更新Neo4j版本,修复安全漏洞
4. 监控配置
- 启用监控:启用Prometheus监控,集成Grafana
- 设置告警:监控集群状态、Raft状态、资源使用率
- 日志配置:启用查询日志,便于性能分析
- 定期备份:配置自动备份,确保数据安全
集群常见问题处理
1. 节点无法加入集群
问题现象:节点启动后无法加入集群,日志中显示连接超时
解决方法:
- 检查网络连接,确保节点之间可以相互通信
- 检查防火墙配置,确保集群端口已开放
- 检查集群配置文件,确保
dbms.cluster.initial_discovery_members配置正确 - 检查节点时间同步,确保所有节点时间一致
2. 核心节点故障
问题现象:核心节点崩溃,集群状态异常
解决方法:
- 对于因果集群:如果超过一半核心节点正常,集群仍可正常工作
- 对于HA集群:主节点故障会自动选举新主节点
- 尽快恢复故障节点,确保集群高可用性
- 恢复步骤:
- 修复故障节点
- 清理数据目录(如果需要)
- 重新启动节点,使其重新加入集群
3. 只读副本同步延迟
问题现象:只读副本与核心节点数据同步延迟
解决方法:
- 检查网络连接,确保网络带宽足够
- 检查只读副本资源使用情况,确保CPU和内存充足
- 调整只读副本配置,增加页面缓存大小
- 考虑增加只读副本数量,分担读负载
4. 集群分裂
问题现象:集群分裂为多个子集群,无法正常工作
解决方法:
- 对于因果集群:确保Raft协议正常工作,检查核心节点数量
- 对于HA集群:确保ZooKeeper正常工作(如果使用)
- 检查网络配置,确保核心节点之间可以通信
- 重新启动所有节点,按照正确顺序加入集群
集群维护
1. 节点扩容
增加核心节点
- 准备新服务器,安装Neo4j企业版
- 配置新节点的集群配置
- 启动新节点,使其加入集群
- 验证集群状态,确保新节点已加入
增加只读副本
- 准备新服务器,安装Neo4j企业版
- 配置新节点为只读副本
- 启动新节点,使其加入集群
- 验证集群状态,确保新节点已加入
2. 节点缩容
移除只读副本
- 在只读副本上停止Neo4j服务
- 从集群中移除节点配置
- 验证集群状态,确保节点已移除
移除核心节点
- 确保集群中仍有足够的核心节点(至少3个)
- 在要移除的核心节点上停止Neo4j服务
- 从集群配置中移除该节点
- 验证集群状态,确保节点已移除
3. 集群备份
全量备份
bash
# 在任意核心节点上执行
neo4j-admin backup --backup-dir=/path/to/backup --name=cluster-backup增量备份
bash
# 在任意核心节点上执行
neo4j-admin backup --backup-dir=/path/to/backup --name=cluster-backup --incremental4. 集群升级
升级前准备
- 备份集群数据
- 测试升级过程
- 准备回滚计划
升级步骤
- 按照顺序升级节点:
- 对于因果集群:只读副本 → 核心节点
- 对于HA集群:从节点 → 主节点
- 升级每个节点:bash
# 停止节点 neo4j stop # 升级Neo4j apt-get update && apt-get upgrade neo4j # 启动节点 neo4j start - 验证每个节点升级成功后,再升级下一个节点
版本差异
因果集群 vs HA集群
| 特性 | 因果集群 | 高可用性集群 |
|---|---|---|
| 支持版本 | Neo4j 3.1+ | 仅Neo4j 3.x |
| 一致性 | 强一致性(Raft) | 最终一致性(主从复制) |
| 扩展性 | 支持水平扩展读性能 | 支持水平扩展读性能 |
| 容错性 | 自动故障恢复 | 自动主节点切换 |
| 架构复杂度 | 较高 | 较低 |
| 适用场景 | 生产环境,需要强一致性 | 仅适用于仍在使用Neo4j 3.x的环境 |
Neo4j 4.x vs 5.x集群差异
- 配置参数:5.x的配置参数有所调整,特别是集群相关参数
- 性能优化:5.x在集群性能方面有显著优化
- 管理工具:5.x提供了更丰富的集群管理工具
- 安全特性:5.x增强了集群安全特性
常见问题(FAQ)
Q1: 因果集群和HA集群有什么区别?
A1: 因果集群基于Raft协议,提供强一致性,支持水平扩展,适用于Neo4j 4.x及以上版本;HA集群基于主从复制,提供最终一致性,仅支持Neo4j 3.x版本,已被因果集群替代。
Q2: 集群需要多少个核心节点?
A2: 推荐使用奇数个核心节点,最少3个,推荐5个或7个,以提高容错性。核心节点数量决定了集群可以容忍的故障节点数量:3个核心节点可以容忍1个故障节点,5个核心节点可以容忍2个故障节点。
Q3: 如何选择只读副本的数量?
A3: 只读副本的数量取决于读负载需求。一般建议根据读请求量配置2-4个只读副本,每个只读副本可以处理一定量的读请求。
Q4: 集群节点之间需要时间同步吗?
A4: 是的,集群节点之间需要精确的时间同步,建议使用NTP服务同步所有节点的时间。时间不同步可能导致集群通信问题和Raft选举失败。
Q5: 如何监控集群状态?
A5: 可以使用以下方法监控集群状态:
- Neo4j Browser的监控面板
- 集成Prometheus和Grafana
- 使用Neo4j提供的监控API
- 定期检查集群日志
Q6: 集群备份应该在哪个节点上执行?
A6: 集群备份可以在任意核心节点上执行,建议在负载较低的核心节点上执行,避免影响集群性能。
Q7: 如何处理集群中的超节点问题?
A7: 超节点是指拥有大量关系的节点,会影响集群性能。处理方法包括:
- 拆分超节点,将其拆分为多个节点
- 使用关系类型分组,减少单节点关系数量
- 优化查询,避免遍历超节点的所有关系
Q8: 集群中的节点可以分布在不同的数据中心吗?
A8: 是的,Neo4j支持跨数据中心部署集群。对于因果集群,可以配置数据中心感知的Raft;对于HA集群,可以配置多数据中心部署。跨数据中心部署需要考虑网络延迟和带宽问题。
Q9: 如何配置集群的负载均衡?
A9: 可以使用以下方法配置集群负载均衡:
- 使用Neo4j提供的负载均衡器
- 使用第三方负载均衡器,如Nginx、HAProxy
- 客户端实现负载均衡,连接不同的只读副本
Q10: 集群升级需要停机吗?
A10: 集群升级可以采用滚动升级方式,不需要完全停机。按照顺序升级节点,确保升级过程中集群仍能正常工作。升级前应做好备份,准备回滚计划。
