集群服务器发现

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

Neo4j 提供了多种机制供集群成员相互发现并形成集群,具体取决于所使用的配置、集群运行的环境以及所使用的 Neo4j 版本。

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

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

服务器发现方法

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

无论使用哪种方法解析服务器地址列表,请确保包含每个以主要(Primary)模式托管 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 服务运行。此时,可以按照 Kubernetes API 文档中的说明,使用 List Service API 获取其他服务器的地址。

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

使用此配置时,dbms.cluster.endpoints 将不会被使用,分配给它的任何值都将被忽略。

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

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

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

指标 (Metrics)

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