集群服务器发现
为了加入一个正在运行的集群,任何新成员都必须知道集群中至少部分其他服务器的地址。这些信息对于连接到服务器、运行发现协议以及获取集群的所有信息是必不可少的。
Neo4j 提供了多种机制,让集群成员可以根据配置、集群运行环境以及所使用的 Neo4j 版本来相互发现并形成集群。
在 Neo4j 5.23 中,引入了一项新的发现服务。您必须在开始使用 Neo4j 2025.01 之前迁移到新版本。 有关更多信息,请参阅操作手册版本 5 中的集群服务器发现。 |
服务器发现方法
根据当前使用的 dbms.cluster.discovery.resolver_type
类型,发现服务可以使用服务器地址列表、DNS 记录或 Kubernetes 服务来发现集群中的其他服务器。发现配置用于初始发现,并持续交换有关集群拓扑变化的信息。
无论使用何种方法解析服务器地址列表,请确保包含每个在主模式下托管 |
使用服务器地址列表进行发现
如果其他集群成员的地址事先已知,则可以明确列出。但是,此方法存在局限性,例如
-
如果服务器被替换且新成员的地址不同,则列表会过时。可以通过确保新成员可以通过与旧成员相同的地址访问来避免过时列表,但这并非总是可行。
-
在某些情况下,配置集群时地址未知。例如,在使用容器编排部署集群时就可能出现这种情况。
要使用此方法,请设置 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.discovery.resolver_type=K8S
。 -
将
dbms.kubernetes.label_selector
设置为集群服务的标签选择器。有关更多信息,请参阅 Kubernetes 官方文档。 -
将
dbms.kubernetes.discovery.service_port_name
设置为 Kubernetes 服务定义中用于 Core 发现端口的服务端口名称。有关更多信息,请参阅 Kubernetes 官方文档。
使用此配置时,dbms.cluster.endpoints
不会被使用,并且任何为其指定的值都将被忽略。
发现配置用于初始发现,并持续交换有关集群拓扑变化的信息。
指标
您可以使用以下发现指标来监控发现服务。