Skip to content

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=true

5. 启动集群 ​

启动核心节点 ​
  • 按照顺序启动核心节点:core1 → core2 → core3
bash
# 在core1上启动
neo4j start

# 在core2上启动
neo4j start

# 在core3上启动
neo4j start
启动只读副本 ​
  • 核心节点启动成功后,启动只读副本
bash
# 在read1上启动
neo4j start

# 在read2上启动
neo4j start

6. 验证集群状态 ​

使用Neo4j Browser验证 ​
  1. 访问任意核心节点的Neo4j Browser:http://192.168.1.101:7474
  2. 登录后,执行以下查询:
    cypher
    CALL dbms.cluster.overview();
  3. 检查集群成员状态,确保所有节点都已加入集群
使用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=true

4. 启动HA集群 ​

启动第一个节点(将成为主节点) ​
bash
neo4j start
启动其他节点(将成为从节点) ​
bash
# 在slave1上启动
neo4j start

# 在slave2上启动
neo4j start

5. 验证HA集群状态 ​

使用Neo4j Browser验证 ​
  1. 访问任意节点的Neo4j Browser:http://192.168.1.101:7474
  2. 登录后,执行以下查询:
    cypher
    CALL dbms.cluster.overview();
  3. 检查集群成员状态,确保所有节点都已加入集群
使用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集群:主节点故障会自动选举新主节点
  • 尽快恢复故障节点,确保集群高可用性
  • 恢复步骤:
    1. 修复故障节点
    2. 清理数据目录(如果需要)
    3. 重新启动节点,使其重新加入集群

3. 只读副本同步延迟 ​

问题现象:只读副本与核心节点数据同步延迟

解决方法:

  • 检查网络连接,确保网络带宽足够
  • 检查只读副本资源使用情况,确保CPU和内存充足
  • 调整只读副本配置,增加页面缓存大小
  • 考虑增加只读副本数量,分担读负载

4. 集群分裂 ​

问题现象:集群分裂为多个子集群,无法正常工作

解决方法:

  • 对于因果集群:确保Raft协议正常工作,检查核心节点数量
  • 对于HA集群:确保ZooKeeper正常工作(如果使用)
  • 检查网络配置,确保核心节点之间可以通信
  • 重新启动所有节点,按照正确顺序加入集群

集群维护 ​

1. 节点扩容 ​

增加核心节点 ​

  1. 准备新服务器,安装Neo4j企业版
  2. 配置新节点的集群配置
  3. 启动新节点,使其加入集群
  4. 验证集群状态,确保新节点已加入

增加只读副本 ​

  1. 准备新服务器,安装Neo4j企业版
  2. 配置新节点为只读副本
  3. 启动新节点,使其加入集群
  4. 验证集群状态,确保新节点已加入

2. 节点缩容 ​

移除只读副本 ​

  1. 在只读副本上停止Neo4j服务
  2. 从集群中移除节点配置
  3. 验证集群状态,确保节点已移除

移除核心节点 ​

  1. 确保集群中仍有足够的核心节点(至少3个)
  2. 在要移除的核心节点上停止Neo4j服务
  3. 从集群配置中移除该节点
  4. 验证集群状态,确保节点已移除

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 --incremental

4. 集群升级 ​

升级前准备 ​

  1. 备份集群数据
  2. 测试升级过程
  3. 准备回滚计划

升级步骤 ​

  1. 按照顺序升级节点:
    • 对于因果集群:只读副本 → 核心节点
    • 对于HA集群:从节点 → 主节点
  2. 升级每个节点:
    bash
    # 停止节点
    neo4j stop
    
    # 升级Neo4j
    apt-get update && apt-get upgrade neo4j
    
    # 启动节点
    neo4j start
  3. 验证每个节点升级成功后,再升级下一个节点

版本差异 ​

因果集群 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: 集群升级可以采用滚动升级方式,不需要完全停机。按照顺序升级节点,确保升级过程中集群仍能正常工作。升级前应做好备份,准备回滚计划。