集群服务器发现

为了加入一个正在运行的集群,任何新成员都必须知道集群中至少部分其他服务器的地址。这些信息对于连接到服务器、运行发现协议以及获取集群的所有信息是必不可少的。

Neo4j 提供了多种机制,让集群成员可以根据配置、集群运行环境以及所使用的 Neo4j 版本来相互发现并形成集群。

在 Neo4j 5.23 中,引入了一项新的发现服务。您必须在开始使用 Neo4j 2025.01 之前迁移到新版本。

有关更多信息,请参阅操作手册版本 5 中的集群服务器发现

服务器发现方法

根据当前使用的 dbms.cluster.discovery.resolver_type 类型,发现服务可以使用服务器地址列表、DNS 记录或 Kubernetes 服务来发现集群中的其他服务器。发现配置用于初始发现,并持续交换有关集群拓扑变化的信息。

无论使用何种方法解析服务器地址列表,请确保包含每个在主模式下托管 system 数据库的服务器的端点。

使用服务器地址列表进行发现

如果其他集群成员的地址事先已知,则可以明确列出。但是,此方法存在局限性,例如

  • 如果服务器被替换且新成员的地址不同,则列表会过时。可以通过确保新成员可以通过与旧成员相同的地址访问来避免过时列表,但这并非总是可行。

  • 在某些情况下,配置集群时地址未知。例如,在使用容器编排部署集群时就可能出现这种情况。

要使用此方法,请设置 dbms.cluster.discovery.resolver_type=LIST 并在每个服务器的配置中硬编码地址。例如

dbms.cluster.discovery.resolver_type=LIST

server.cluster.advertised_address=server01.example.com:6000
dbms.cluster.endpoints=server01.example.com:6000,server02.example.com:6000,server03.example.com:6000

使用此方法的示例由配置三台服务器的集群进行说明。

使用具有多个记录的 DNS 进行发现

在不切实际或不可能明确列出要发现的集群成员地址的情况下,您可以使用基于 DNS 的机制。在这种情况下,服务器启动时会根据配置设置执行 DNS 记录查找。一旦服务器加入集群,进一步的拓扑更改将作为发现服务的一部分在集群中的服务器之间进行通信。

以下基于 DNS 的机制可用于获取集群中其他服务器的地址以进行发现

dbms.cluster.discovery.resolver_type=DNS

使用此配置,初始发现成员将从 DNS A 记录中解析,以查找要联系的 IP 地址。例如

dbms.cluster.discovery.resolver_type=DNS

server.cluster.advertised_address=server01.example.com:6000
dbms.cluster.endpoints=cluster01.example.com:6000

执行 DNS 查找时,域名会为集群中的每个服务器返回一个 A 记录,其中每个 A 记录都包含服务器的 IP 地址。配置的服务器使用 A 记录中的所有 IP 地址来加入或形成集群。

使用此配置时,所有服务器上的发现端口必须相同。如果无法做到,请考虑使用 SRV 发现类型。

dbms.cluster.discovery.resolver_type=SRV

使用此配置,初始发现成员将从 DNS SRV 记录中解析,以查找要联系的 IP 地址/主机名和集群通告端口。

dbms.cluster.endpoints 的值必须设置为单个域名,端口设置为 0。执行 DNS 查找时,域名会返回单个 SRV 记录。例如

dbms.cluster.discovery.resolver_type=SRV

server.cluster.advertised_address=server01.example.com:6000
dbms.cluster.endpoints=cluster01.example.com:0

DNS 返回的 SRV 记录应包含 IP 地址或主机名,以及要发现的服务器的**集群**端口。配置的服务器使用 SRV 记录中的所有地址来加入或形成集群。

Kubernetes 中的发现

一种特殊情况是当集群在 Kubernetes 中运行,并且每个服务器都作为 Kubernetes 服务运行时。然后,可以使用列表服务 API 获取其他服务器的地址,如 Kubernetes API 文档中所述。

以下设置用于配置此场景:

使用此配置时,dbms.cluster.endpoints 不会被使用,并且任何为其指定的值都将被忽略。

  • 运行 Neo4j 的 Pod 必须使用具有列出服务权限的服务帐户。有关更多信息,请参阅 Kubernetes 关于 RBAC 授权ABAC 授权的文档。

  • 配置的 server.cluster.advertised_address 必须与 Kubernetes 内部 DNS 名称精确匹配,其形式为 <service-name>.<namespace>.svc.cluster.local

发现配置用于初始发现,并持续交换有关集群拓扑变化的信息。

指标

您可以使用以下发现指标来监控发现服务。

© . All rights reserved.