外观
Neo4j Causal Clustering 配置
部署前准备
硬件要求
| 节点类型 | CPU | 内存 | 存储 | 网络 |
|---|---|---|---|---|
| 核心节点 | 4 核+ | 16GB+ | SSD | 千兆网卡 |
| 只读副本节点 | 4 核+ | 16GB+ | SSD | 千兆网卡 |
| 边缘节点 | 2 核+ | 8GB+ | SSD | 千兆网卡 |
软件要求
- 所有节点使用相同版本的 Neo4j 企业版
- Java 11
- 关闭防火墙或配置正确的端口开放规则
网络规划
| 端口 | 用途 | 配置参数 |
|---|---|---|
| 7000 | RAFT 通信端口 | causal_clustering.raft_server.port |
| 7001 | 集群内部通信端口 | causal_clustering.rpc_server.port |
| 7474 | HTTP 访问端口 | dbms.connector.http.listen_address |
| 7687 | Bolt 访问端口 | 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 start4. 启动只读副本节点
核心节点启动完成后,启动只读副本节点:
bash
# 在所有只读副本节点上执行
neo4j start5. 启动边缘节点
最后启动边缘节点:
bash
# 在所有边缘节点上执行
neo4j start6. 验证集群状态
使用 Cypher 命令验证集群状态:
cypher
# 查看集群成员状态
CALL dbms.cluster.overview();
# 查看当前主核心节点
CALL dbms.cluster.role();集群管理操作
添加核心节点
- 在新核心节点上安装 Neo4j
- 复制证书和配置文件
- 启动新核心节点
- 验证新节点已加入集群
添加只读副本节点
- 在新只读副本节点上安装 Neo4j
- 复制证书和配置文件
- 启动新只读副本节点
- 验证新节点已加入集群
移除节点
- 停止要移除的节点:
neo4j stop - 在其他节点上更新集群配置
- 验证节点已从集群中移除
手动故障转移
在紧急情况下,可以手动触发故障转移:
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: 建议采用滚动升级方式:
- 备份集群
- 依次升级只读副本节点
- 依次升级核心节点
- 升级边缘节点
- 验证升级后的集群状态
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 dump和neo4j-admin load命令 - 使用数据导入导出工具
- 考虑使用 ETL 工具进行数据迁移
最佳实践
1. 合理规划节点数量
- 核心节点:3 或 5 个,确保高可用性
- 只读副本节点:根据读负载情况确定
- 边缘节点:根据客户端连接数确定
2. 使用 SSD 存储
所有节点都应使用 SSD 存储,提高 IO 性能,特别是对于核心节点和只读副本节点。
3. 配置适当的网络
- 使用千兆以上网卡
- 确保节点间网络延迟低
- 配置正确的防火墙规则
4. 监控集群状态
- 定期监控集群状态和性能指标
- 设置告警规则,及时发现问题
- 定期备份集群数据
5. 遵循最小权限原则
- 为不同用户配置适当的权限
- 限制对核心节点的直接访问
- 使用边缘节点作为客户端入口
6. 定期更新版本
- 及时更新 Neo4j 版本,获取最新的功能和安全补丁
- 遵循官方升级指南,确保升级过程顺利
7. 测试故障转移
- 定期测试集群故障转移,确保在实际故障发生时能正常工作
- 测试不同故障场景,如核心节点故障、网络分区等
8. 优化查询性能
- 为频繁查询的属性创建索引
- 优化 Cypher 查询
- 考虑使用只读副本节点处理复杂查询
