Skip to content

Neo4j Causal Clustering 配置

部署前准备

硬件要求

节点类型CPU内存存储网络
核心节点4 核+16GB+SSD千兆网卡
只读副本节点4 核+16GB+SSD千兆网卡
边缘节点2 核+8GB+SSD千兆网卡

软件要求

  • 所有节点使用相同版本的 Neo4j 企业版
  • Java 11
  • 关闭防火墙或配置正确的端口开放规则

网络规划

端口用途配置参数
7000RAFT 通信端口causal_clustering.raft_server.port
7001集群内部通信端口causal_clustering.rpc_server.port
7474HTTP 访问端口dbms.connector.http.listen_address
7687Bolt 访问端口dbms.connector.bolt.listen_address
6000备份端口dbms.backup.listen_address

核心节点配置

基本配置

txt
# 启用因果集群模式
dbms.mode=CORE

# 配置集群名称
dbms.cluster.database=neo4j

# 配置节点 ID(每个节点唯一)
causal_clustering.server_id=1

# 配置集群初始成员列表
causal_clustering.initial_discovery_members=core1:5000,core2:5000,core3:5000

# 配置 Raft 通信端口
causal_clustering.raft_server.port=7000

# 配置集群内部通信端口
causal_clustering.rpc_server.port=7001

网络配置

txt
# 配置 Bolt 连接器监听地址
dbms.connector.bolt.listen_address=0.0.0.0:7687

# 配置 HTTP 连接器监听地址
dbms.connector.http.listen_address=0.0.0.0:7474

# 配置 HTTPS 连接器监听地址
dbms.connector.https.listen_address=0.0.0.0:7473

# 配置备份监听地址
dbms.backup.listen_address=0.0.0.0:6000

存储配置

txt
# 数据目录
dbms.directories.data=/var/lib/neo4j/data

# 事务日志目录
dbms.directories.transaction_logs=/var/lib/neo4j/data/transactions

# 确保目录存在且 Neo4j 用户有读写权限
sudo mkdir -p /var/lib/neo4j/data
sudo chown -R neo4j:neo4j /var/lib/neo4j/

只读副本节点配置

基本配置

txt
# 启用只读副本模式
dbms.mode=READ_REPLICA

# 配置集群名称
dbms.cluster.database=neo4j

# 配置集群初始成员列表
causal_clustering.initial_discovery_members=core1:5000,core2:5000,core3:5000

# 配置集群内部通信端口
causal_clustering.rpc_server.port=7001

复制配置

txt
# 配置复制批量大小
causal_clustering.replication.batch_size=1024

# 配置复制队列大小
causal_clustering.replication.queue_size=2048

# 配置复制超时时间
causal_clustering.replication.timeout=30s

边缘节点配置

基本配置

txt
# 启用边缘节点模式
dbms.mode=EDGE

# 配置集群名称
dbms.cluster.database=neo4j

# 配置集群初始成员列表
causal_clustering.initial_discovery_members=core1:5000,core2:5000,core3:5000

路由配置

txt
# 配置读写分离策略
dbms.routing.default_router=SERVER

# 配置路由策略
dbms.routing.policy.default=write_to_core

集群安全配置

认证配置

txt
# 启用认证
dbms.security.auth_enabled=true

# 配置认证数据库
dbms.security.auth_store.location=auth.db

加密配置

txt
# 启用 Bolt 加密
dbms.ssl.policy.bolt.enabled=true
dbms.ssl.policy.bolt.base_directory=certificates/bolt
dbms.ssl.policy.bolt.private_key=private.key
dbms.ssl.policy.bolt.public_certificate=public.crt

# 启用 HTTP 加密
dbms.ssl.policy.https.enabled=true
dbms.ssl.policy.https.base_directory=certificates/https
dbms.ssl.policy.https.private_key=private.key
dbms.ssl.policy.https.public_certificate=public.crt

# 启用集群通信加密
dbms.ssl.policy.cluster.enabled=true
dbms.ssl.policy.cluster.base_directory=certificates/cluster
dbms.ssl.policy.cluster.private_key=private.key
dbms.ssl.policy.cluster.public_certificate=public.crt

权限配置

txt
# 配置角色映射文件
dbms.security.role_mapping_file=roles.json

# 配置权限提供者
dbms.security.authorization_provider=neo4j-auth

集群部署步骤

1. 准备证书

使用 Neo4j 提供的工具生成集群证书:

bash
# 生成自签名证书
neo4j-admin certificate create --self-signed --subject "CN=Cluster" --outdir certificates

# 复制证书到所有节点
sudo scp -r certificates/* node2:/var/lib/neo4j/certificates/
sudo scp -r certificates/* node3:/var/lib/neo4j/certificates/
# ... 复制到其他节点

2. 配置所有节点

在每个节点上配置 neo4j.conf 文件,根据节点类型配置不同的参数。

3. 启动核心节点

首先启动所有核心节点,确保它们能形成集群:

bash
# 在所有核心节点上执行
neo4j start

4. 启动只读副本节点

核心节点启动完成后,启动只读副本节点:

bash
# 在所有只读副本节点上执行
neo4j start

5. 启动边缘节点

最后启动边缘节点:

bash
# 在所有边缘节点上执行
neo4j start

6. 验证集群状态

使用 Cypher 命令验证集群状态:

cypher
# 查看集群成员状态
CALL dbms.cluster.overview();

# 查看当前主核心节点
CALL dbms.cluster.role();

集群管理操作

添加核心节点

  1. 在新核心节点上安装 Neo4j
  2. 复制证书和配置文件
  3. 启动新核心节点
  4. 验证新节点已加入集群

添加只读副本节点

  1. 在新只读副本节点上安装 Neo4j
  2. 复制证书和配置文件
  3. 启动新只读副本节点
  4. 验证新节点已加入集群

移除节点

  1. 停止要移除的节点:neo4j stop
  2. 在其他节点上更新集群配置
  3. 验证节点已从集群中移除

手动故障转移

在紧急情况下,可以手动触发故障转移:

bash
# 连接到任意核心节点
cypher-shell -u neo4j -p password

# 执行故障转移命令
CALL dbms.cluster.forceLeaderElection();

监控与维护

监控集群状态

cypher
# 查看集群成员状态
CALL dbms.cluster.overview();

# 查看复制延迟
CALL dbms.cluster.replication.getReplicationLag();

# 查看 Raft 状态
CALL dbms.cluster.raft.status();

监控指标

Causal Clustering 提供了以下监控指标:

指标名称描述
causal_clustering.members.healthy健康集群成员数
causal_clustering.members.total集群成员总数
causal_clustering.replication.lag复制延迟
causal_clustering.leader_elections领导选举次数
causal_clustering.raft.committed_entries已提交的 Raft 条目数
causal_clustering.raft.applied_entries已应用的 Raft 条目数

日志管理

txt
# 配置集群日志级别
dbms.logs.debug.level=INFO

# 配置集群日志文件
dbms.logs.debug.name=debug.log

备份与恢复

备份集群

bash
# 从任意核心节点或只读副本节点进行备份
neo4j-admin backup --backup-dir=/backup --name=cluster-backup --from=core1:6000

恢复集群

bash
# 在所有核心节点上恢复备份
neo4j-admin restore --from=/backup/cluster-backup --database=neo4j --force

# 启动集群
neo4j start

故障排查

集群无法形成

  • 检查所有节点的 causal_clustering.initial_discovery_members 配置是否一致
  • 检查节点间网络连接是否正常
  • 检查防火墙是否开放了必要的端口
  • 查看节点日志,查找错误信息

复制延迟过高

  • 检查节点间网络延迟
  • 检查核心节点负载情况
  • 调整复制配置参数,如 causal_clustering.replication.batch_size
  • 考虑增加核心节点数量

领导选举失败

  • 确保集群中有多数核心节点在线
  • 检查节点间网络连接
  • 查看 Raft 日志,查找选举失败原因

节点无法加入集群

  • 检查节点证书是否有效
  • 检查节点配置是否正确
  • 检查节点间网络连接
  • 查看节点日志,查找错误信息

常见问题(FAQ)

Q1: Causal Clustering 与 HA Cluster 有什么区别?

A1: 主要区别包括:

  • 一致性算法:Causal Clustering 使用 Raft 算法,HA Cluster 使用主从复制
  • 一致性保证:Causal Clustering 提供因果一致性,HA Cluster 提供最终一致性
  • 节点类型:Causal Clustering 包含核心节点、只读副本节点和边缘节点,HA Cluster 包含主节点和从节点
  • 版本支持:Causal Clustering 支持 Neo4j 4.x+,HA Cluster 支持 Neo4j 3.5.x 及以下版本

Q2: 核心节点的最佳数量是多少?

A2: 核心节点数量应为奇数,建议使用 3 或 5 个核心节点。3 个核心节点可以容忍 1 个节点故障,5 个核心节点可以容忍 2 个节点故障。

Q3: 如何选择只读副本节点的数量?

A3: 只读副本节点数量取决于读负载情况。建议根据读流量和性能需求来确定,通常为核心节点数量的 1-3 倍。

Q4: 如何实现读写分离?

A4: Causal Clustering 自动支持读写分离:

  • 写入操作自动路由到核心节点
  • 读取操作可以路由到只读副本节点
  • 可以通过驱动程序配置读取偏好

Q5: 如何升级 Causal Clustering 集群?

A5: 建议采用滚动升级方式:

  1. 备份集群
  2. 依次升级只读副本节点
  3. 依次升级核心节点
  4. 升级边缘节点
  5. 验证升级后的集群状态

Q6: 如何处理脑裂问题?

A6: Causal Clustering 使用 Raft 算法,通过多数派原则避免脑裂问题。只有当多数核心节点在线时,才能选举主节点并处理写入操作。

Q7: 如何监控集群性能?

A7: 监控方法包括:

  • 使用 Neo4j 自带的监控工具
  • 集成 Prometheus 和 Grafana
  • 监控系统资源使用情况
  • 查看集群日志

Q8: 如何配置跨数据中心部署?

A8: 跨数据中心部署时需要考虑:

  • 网络延迟:确保数据中心间网络延迟低
  • 节点分布:在每个数据中心部署核心节点
  • 复制配置:调整复制参数以适应网络延迟
  • 故障转移策略:配置适当的故障转移超时

Q9: 如何备份 Causal Clustering 集群?

A9: 可以从任意核心节点或只读副本节点进行热备份,使用 neo4j-admin backup 命令。建议定期从不同节点进行备份,以提高备份的可靠性。

Q10: 如何从 Causal Clustering 迁移到其他部署模式?

A10: 迁移方法包括:

  • 使用 neo4j-admin dumpneo4j-admin load 命令
  • 使用数据导入导出工具
  • 考虑使用 ETL 工具进行数据迁移

最佳实践

1. 合理规划节点数量

  • 核心节点:3 或 5 个,确保高可用性
  • 只读副本节点:根据读负载情况确定
  • 边缘节点:根据客户端连接数确定

2. 使用 SSD 存储

所有节点都应使用 SSD 存储,提高 IO 性能,特别是对于核心节点和只读副本节点。

3. 配置适当的网络

  • 使用千兆以上网卡
  • 确保节点间网络延迟低
  • 配置正确的防火墙规则

4. 监控集群状态

  • 定期监控集群状态和性能指标
  • 设置告警规则,及时发现问题
  • 定期备份集群数据

5. 遵循最小权限原则

  • 为不同用户配置适当的权限
  • 限制对核心节点的直接访问
  • 使用边缘节点作为客户端入口

6. 定期更新版本

  • 及时更新 Neo4j 版本,获取最新的功能和安全补丁
  • 遵循官方升级指南,确保升级过程顺利

7. 测试故障转移

  • 定期测试集群故障转移,确保在实际故障发生时能正常工作
  • 测试不同故障场景,如核心节点故障、网络分区等

8. 优化查询性能

  • 为频繁查询的属性创建索引
  • 优化 Cypher 查询
  • 考虑使用只读副本节点处理复杂查询