5.2 集群与高可用


文档摘要

5.2 集群与高可用 5.2 Neo4j 集群与高可用详解 5.2.1 高可用与集群概述 高可用性 (High Availability, HA) 指的是系统在面对硬件故障、软件错误或网络中断等异常情况时,仍能持续提供服务的能力。HA 的目标是最大限度地减少服务中断时间,保证业务的连续性。 集群 (Cluster) 是将多台计算机(节点)组织起来,协同工作,对外提供统一服务的一种架构模式。集群可以提高系统的整体性能、处理能力和容错能力。在数据库领域,集群通常用于实现数据冗余备份、负载均衡和故障转移,从而提升数据库的可用性和可扩展性。 在 Neo4j 中,集群架构是实现高可用的关键。

5.2 集群与高可用

5.2 Neo4j 集群与高可用详解

5.2.1 高可用与集群概述

高可用性 (High Availability, HA) 指的是系统在面对硬件故障、软件错误或网络中断等异常情况时,仍能持续提供服务的能力。HA 的目标是最大限度地减少服务中断时间,保证业务的连续性。

集群 (Cluster) 是将多台计算机(节点)组织起来,协同工作,对外提供统一服务的一种架构模式。集群可以提高系统的整体性能、处理能力和容错能力。在数据库领域,集群通常用于实现数据冗余备份、负载均衡和故障转移,从而提升数据库的可用性和可扩展性。

在 Neo4j 中,集群架构是实现高可用的关键。Neo4j 采用因果集群 (Causal Clustering) 架构,这是一个经过生产验证的、成熟的分布式系统,专为确保数据一致性和高可用性而设计。

5.2.2 Neo4j 因果集群架构

Neo4j 的因果集群架构主要由以下几种类型的服务器组成:

  • 核心服务器 (Core Servers): 负责处理所有的写操作和一部分读操作。核心服务器是集群的心脏,负责维护数据的一致性和完整性。在因果集群中,核心服务器通过 Raft 一致性算法 达成共识,确保写操作的强一致性。集群中必须有奇数个核心服务器,以保证在部分节点故障时,集群仍能正常选举出 Leader 并提供服务。

  • 只读副本 (Read Replicas): 主要用于处理读操作,分担核心服务器的读负载。只读副本异步地从核心服务器复制数据,提供最终一致性的读取服务。只读副本可以水平扩展,以应对不断增长的读请求压力。

  • 路由服务器 (Routers): 作为客户端的入口点,负责将客户端的请求路由到合适的服务器。路由服务器本身不存储数据,只负责请求的转发和负载均衡。在 Neo4j 中,路由功能通常由驱动程序 (Drivers) 或负载均衡器来实现,而不是独立的 Router 节点。

下图使用 Mermaid Graph TD 绘制了 Neo4j 因果集群的基本架构:

架构详解:

  1. 客户端连接: 客户端应用程序通过 负载均衡器 (Load Balancer) 连接到 Neo4j 集群。负载均衡器可以将请求均匀地分发到不同的服务器,提高整体性能和可用性。

  2. 写操作流程: 当客户端发起写操作时,负载均衡器将请求路由到核心服务器。核心服务器集群内部通过 Raft 算法选举出一个 Leader 节点,所有的写操作都首先在 Leader 节点上执行。Leader 节点将写操作日志复制到其他 Follower 核心服务器,当达到法定数量的 Follower 确认后 (Quorum),Leader 节点才会提交事务并返回客户端成功响应。这种机制保证了写操作的强一致性,即使部分核心服务器发生故障,数据也不会丢失或损坏。

  3. 读操作流程: 读操作可以路由到核心服务器只读副本。为了提高读性能和降低核心服务器的负载,通常建议将读操作路由到只读副本。只读副本异步地从核心服务器复制数据,因此读取的数据可能存在一定的延迟,但对于大多数读场景,最终一致性是可以接受的。

  4. 故障转移 (Failover): 当 Leader 核心服务器发生故障时,Raft 算法会自动触发 Leader 选举,从剩余的 Follower 核心服务器中选举出一个新的 Leader。整个过程是自动透明的,客户端通常不会感知到 Leader 的切换。只读副本也会自动连接到新的 Leader 核心服务器,继续进行数据同步。

5.2.3 Neo4j 集群的优势

  • 高可用性: 因果集群架构通过数据冗余备份和自动故障转移机制,确保在节点故障时,集群仍能持续提供服务。Raft 算法保证了核心服务器之间数据的一致性,避免数据丢失或损坏。

  • 可扩展性: 通过增加只读副本的数量,可以水平扩展集群的读能力,应对不断增长的读请求负载。核心服务器也可以在一定程度上进行扩展,但核心服务器的扩展更侧重于提高写性能和数据容量。

  • 数据一致性: Raft 一致性算法保证了写操作的强一致性,确保集群中所有核心服务器的数据保持同步。只读副本提供最终一致性的读取服务,满足大多数读场景的需求。

  • 弹性伸缩: Neo4j 集群支持在线添加和删除只读副本,以及在一定程度上调整核心服务器集群规模,实现集群的弹性伸缩,灵活应对业务变化。

  • 易于管理: Neo4j 提供了完善的集群管理工具和监控指标,方便管理员监控集群状态、进行故障排查和日常维护。

5.2.4 Neo4j 集群部署实践

5.2.4.1 环境准备

在开始部署 Neo4j 集群之前,需要准备以下环境:

  • 服务器: 至少三台服务器用于部署核心服务器,可以根据读负载需求增加服务器部署只读副本。服务器硬件配置建议参考 Neo4j 官方文档的建议。

  • 操作系统: 支持 Linux, macOS, Windows 等操作系统。生产环境推荐使用 Linux 系统。

  • Java 环境: Neo4j 需要 Java 11 或更高版本。

  • Neo4j 软件包: 下载 Neo4j Enterprise Server 软件包。

  • 网络: 确保集群内各节点之间网络互通,端口 7687 (Bolt), 7474 (HTTP), 7473 (HTTPS), 6000 (集群内部通信) 等端口需要开放。

5.2.4.2 配置核心服务器

  1. 解压 Neo4j 软件包: 将下载的 Neo4j 软件包解压到每台核心服务器的指定目录。

  2. 配置 neo4j.conf 文件: 修改每台核心服务器 conf/neo4j.conf 文件,进行集群相关配置。以下是一个核心服务器的配置示例:

    # dbms.mode=CORE // Neo4j 默认模式为 CLUSTER,无需显式指定 dbms.serverId=core1 // 设置服务器 ID,集群内唯一 dbms.directories.data=data dbms.directories.logs=logs dbms.directories.plugins=plugins dbms.tx_log.rotation.retention_policy=7 days dbms.memory.heap.initial_size=4g dbms.memory.heap.max_size=8g dbms.connector.bolt.enabled=true dbms.connector.bolt.listen_address=:7687 dbms.connector.http.enabled=true dbms.connector.http.listen_address=:7474 dbms.connector.https.enabled=true dbms.connector.https.listen_address=:7473 # 集群配置 causal_clustering.enabled=true causal_clustering.cluster_id=my-neo4j-cluster // 设置集群 ID,所有节点必须相同 causal_clustering.discovery_listen_address=:6000 causal_clustering.discovery_advertised_address=core1-ip:6000 // 设置节点发现地址,需要配置为节点的 IP 地址或域名 causal_clustering.transaction_listen_address=:7000 causal_clustering.transaction_advertised_address=core1-ip:7000 // 设置事务地址,需要配置为节点的 IP 地址或域名 causal_clustering.raft_listen_address=:7001 causal_clustering.raft_advertised_address=core1-ip:7001 // 设置 Raft 地址,需要配置为节点的 IP 地址或域名 # 初始主机发现配置,用于引导集群启动 causal_clustering.initial_discovery_members=core1-ip:6000,core2-ip:6000,core3-ip:6000 // 列出所有核心服务器的发现地址

    关键配置项说明:

    • dbms.mode=CORE: 指定服务器模式为核心服务器。在 Neo4j 中,默认模式为 CLUSTER,已经包含了核心服务器和只读副本的功能,如果需要明确指定为核心服务器,可以设置为 CORE

    • dbms.serverId: 设置服务器 ID,集群内每个节点的 ID 必须唯一。

    • causal_clustering.enabled=true: 启用因果集群功能。

    • causal_clustering.cluster_id: 设置集群 ID,所有节点必须配置相同的集群 ID。

    • causal_clustering.discovery_listen_address: 设置节点监听发现请求的地址和端口。

    • causal_clustering.discovery_advertised_address: 设置节点对外广播的发现地址和端口,需要配置为节点的实际 IP 地址或域名。

    • causal_clustering.transaction_listen_address, causal_clustering.transaction_advertised_address: 设置事务通信地址。

    • causal_clustering.raft_listen_address, causal_clustering.raft_advertised_address: 设置 Raft 协议通信地址。

    • causal_clustering.initial_discovery_members: 设置初始主机发现成员列表,用于引导集群启动。需要列出所有核心服务器的发现地址。

    注意: 在配置 advertised_address 时,必须使用节点的实际 IP 地址或域名,确保其他节点和客户端能够访问到该地址。

  3. 复制配置文件: 将配置好的 neo4j.conf 文件复制到其他核心服务器的 conf 目录下。根据实际情况修改 dbms.serverId, causal_clustering.discovery_advertised_address, causal_clustering.transaction_advertised_address, causal_clustering.raft_advertised_address 等配置项,确保每个节点的配置正确。

5.2.4.3 配置只读副本 (可选)

如果需要部署只读副本,可以按照以下步骤进行配置:

  1. 解压 Neo4j 软件包: 将 Neo4j 软件包解压到只读副本服务器的指定目录。

  2. 配置 neo4j.conf 文件: 修改只读副本服务器的 conf/neo4j.conf 文件,配置示例如下:

    dbms.mode=READ_REPLICA // 指定服务器模式为只读副本 dbms.serverId=replica1 // 设置服务器 ID,集群内唯一 dbms.directories.data=data dbms.directories.logs=logs dbms.directories.plugins=plugins dbms.tx_log.rotation.retention_policy=7 days dbms.memory.heap.initial_size=2g dbms.memory.heap.max_size=4g dbms.connector.bolt.enabled=true dbms.connector.bolt.listen_address=:7687 dbms.connector.http.enabled=true dbms.connector.http.listen_address=:7474 dbms.connector.https.enabled=true dbms.connector.https.listen_address=:7473 # 集群配置 causal_clustering.enabled=true causal_clustering.cluster_id=my-neo4j-cluster // 设置集群 ID,与核心服务器相同 causal_clustering.discovery_listen_address=:6000 causal_clustering.discovery_advertised_address=replica1-ip:6000 // 设置节点发现地址 causal_clustering.transaction_listen_address=:7000 causal_clustering.transaction_advertised_address=replica1-ip:7000 // 设置事务地址 causal_clustering.raft_listen_address=:7001 causal_clustering.raft_advertised_address=replica1-ip:7001 // 设置 Raft 地址 # 连接到现有集群 causal_clustering.initial_discovery_members=core1-ip:6000,core2-ip:6000,core3-ip:6000 // 列出核心服务器的发现地址

    关键配置项说明:

    • dbms.mode=READ_REPLICA: 指定服务器模式为只读副本。

    • 其他集群配置项需要与核心服务器保持一致,例如 causal_clustering.cluster_idcausal_clustering.initial_discovery_members

5.2.4.4 启动集群

  1. 启动核心服务器: 在每台核心服务器上,进入 Neo4j 安装目录,执行启动命令:

    ./bin/neo4j start

    首次启动时,Neo4j 会初始化集群,并选举出 Leader 节点。可以通过查看日志文件 logs/neo4j.log 确认集群启动状态。

  2. 启动只读副本 (可选): 在只读副本服务器上,执行启动命令:

    ./bin/neo4j start

    只读副本启动后,会自动连接到核心服务器集群,并开始数据同步。

5.2.4.5 连接集群

客户端应用程序可以通过 Neo4j 驱动程序连接到集群。连接集群时,需要指定集群的 URI,而不是单个节点的 URI。集群 URI 的格式如下:

neo4j://<load_balancer_address>

其中 <load_balancer_address> 可以是负载均衡器的地址,也可以是任意一个核心服务器或只读副本的地址。驱动程序会自动发现集群的拓扑结构,并将请求路由到合适的服务器。

代码示例 (Python Driver):

from neo4j import GraphDatabase uri = "neo4j://core1-ip:7687,core2-ip:7687,core3-ip:7687" # 列出核心服务器的 Bolt 地址,驱动程序会自动进行负载均衡 username = "neo4j" password = "password" driver = GraphDatabase.driver(uri, auth=(username, password)) def create_node(tx, name): query = "CREATE (n:Person {name: $name}) RETURN n" result = tx.run(query, name=name) record = result.single() return record["n"] with driver.session() as session: person_node = session.execute_write(create_node, "Alice") print(f"Created node: {person_node}") driver.close()

代码详解:

  • uri = "neo4j://core1-ip:7687,core2-ip:7687,core3-ip:7687": 连接 URI 中列出了所有核心服务器的 Bolt 地址,多个地址之间用逗号分隔。驱动程序会使用这些地址作为初始连接点,并自动发现集群的完整拓扑结构。

  • GraphDatabase.driver(uri, auth=(username, password)): 创建 Neo4j 驱动程序实例,传入集群 URI 和认证信息。

  • session.execute_write(create_node, "Alice"): 执行写操作 create_node 函数。驱动程序会自动将写操作路由到 Leader 核心服务器。

5.2.4.6 集群管理与监控

Neo4j 提供了多种工具和方法来管理和监控集群:

  • Neo4j Admin 工具: neo4j-admin 命令行工具可以用于执行集群管理任务,例如查看集群状态、添加/删除节点、执行备份和恢复等。

    ./bin/neo4j-admin cluster-status --verbose // 查看集群状态 ./bin/neo4j-admin member-remove <serverId> // 从集群中移除节点
  • Neo4j Browser: Neo4j Browser 可以连接到集群,并提供图形化界面来查看集群状态、监控指标和执行 Cypher 查询。在 Browser 的 "Cluster" 标签页可以查看集群成员列表和角色信息。

  • JMX 监控: Neo4j 暴露了 JMX 监控接口,可以使用 JConsole, VisualVM 等 JMX 客户端连接到 Neo4j 进程,查看更详细的性能指标和集群状态。

  • 监控系统集成: 可以将 Neo4j 的监控指标集成到 Prometheus, Grafana 等监控系统中,实现更全面的集群监控和告警。

5.2.5 高级特性与扩展

Neo4j 在集群与高可用方面提供了一些高级特性和扩展功能:

  • Fabric: Neo4j Fabric 是一个分布式图平台,可以在多个 Neo4j 集群之上构建统一的逻辑图数据库。Fabric 可以将大型图数据划分为多个子图,分布存储在不同的集群中,并提供跨图查询能力。Fabric 可以进一步提升 Neo4j 的可扩展性和数据管理能力,但 Fabric 的部署和管理也更加复杂,需要根据实际业务需求进行评估。

  • Data Center Replication (DCR): DCR 是一种跨数据中心复制解决方案,可以将 Neo4j 集群的数据异步复制到远程数据中心,实现异地容灾和数据备份。DCR 可以进一步提高系统的可用性和数据安全性,应对数据中心级别的故障。

  • 增强的监控和管理: Neo4j 提供了更丰富的监控指标和管理工具,例如更详细的 Raft 协议状态监控、更灵活的集群配置选项等,方便管理员更好地管理和维护集群。

5.2.6 总结

Neo4j 的因果集群架构是构建高可用、可扩展图数据库应用的关键。通过核心服务器集群和只读副本的协同工作,Neo4j 能够有效地应对各种故障和负载挑战,保证数据服务的持续性和稳定性。本文详细介绍了 Neo4j 集群的架构、部署实践、管理监控和高级特性,希望能够帮助读者更好地理解和应用 Neo4j 集群技术。

总结 Mermaid 图:


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U