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