发现
编辑发现
编辑发现是集群形成模块查找其他节点以形成集群的过程。此过程在您启动 Elasticsearch 节点时或当节点认为主节点失败时运行,并持续到找到主节点或选出新的主节点为止。
此过程从一个或多个种子主机提供程序的 *种子* 地址列表开始,以及上次已知集群中任何符合主节点条件的节点的地址。该过程分两个阶段运行:首先,每个节点通过连接到每个地址并尝试识别它所连接的节点并验证它是否符合主节点条件来探测种子地址。其次,如果成功,它会与远程节点共享其所有已知符合主节点条件的对等节点的列表,而远程节点会反过来响应*其*对等节点。然后,该节点探测它刚刚发现的所有新节点,请求它们的对等节点,依此类推。
如果该节点不符合主节点条件,则它会继续此发现过程,直到它发现已选出的主节点。如果未发现已选出的主节点,则该节点将在 discovery.find_peers_interval
后重试,默认为 1s
。
如果该节点符合主节点条件,则它会继续此发现过程,直到它发现已选出的主节点,或者它已发现足够多的无主符合主节点条件的节点以完成选举。如果这两个条件都没有足够快地发生,则该节点将在 discovery.find_peers_interval
后重试,默认为 1s
。
一旦选出主节点,它通常会一直保持为主节点,直到它被有意停止。如果故障检测确定集群出现故障,它也可能停止充当主节点。当节点停止担任已选出的主节点时,它将再次开始发现过程。
请参阅发现故障排除以解决发现问题。
种子主机提供程序
编辑默认情况下,集群形成模块提供两个种子主机提供程序来配置种子节点列表:一个基于 *设置* 的种子主机提供程序和一个基于 *文件* 的种子主机提供程序。可以通过 发现插件对其进行扩展以支持云环境和其他形式的种子主机提供程序。种子主机提供程序使用 discovery.seed_providers
设置进行配置,该设置默认为基于 *设置* 的主机提供程序。此设置接受不同提供程序的列表,使您可以利用多种方法来查找集群的种子主机。
每个种子主机提供程序都会产生种子节点的 IP 地址或主机名。如果它返回任何主机名,则会使用 DNS 查找将其解析为 IP 地址。如果主机名解析为多个 IP 地址,则 Elasticsearch 会尝试在所有这些地址上查找种子节点。如果主机提供程序没有明确给出节点的 TCP 端口,则它将隐式使用 transport.profiles.default.port
给定的端口范围中的第一个端口,如果未设置 transport.profiles.default.port
,则使用 transport.port
。并发查找的数量由 discovery.seed_resolver.max_concurrent_resolvers
控制,默认为 10
,每次查找的超时时间由 discovery.seed_resolver.timeout
控制,默认为 5s
。请注意,DNS 查找受制于 JVM DNS 缓存。
基于设置的种子主机提供程序
编辑基于设置的种子主机提供程序使用节点设置来配置种子节点的静态地址列表。这些地址可以作为主机名或 IP 地址给出;在每一轮发现期间,指定为主机名的主机将被解析为 IP 地址。
主机列表使用 discovery.seed_hosts
静态设置进行设置。例如
如果未指定,端口将默认为 |
|
如果主机名解析为多个 IP 地址,则 Elasticsearch 将尝试连接到每个已解析的地址。 |
基于文件的种子主机提供程序
编辑基于文件的种子主机提供程序通过外部文件配置主机列表。Elasticsearch 会在文件更改时重新加载该文件,以便可以在无需重新启动每个节点的情况下动态更改种子节点列表。例如,这为在 Docker 容器中运行的 Elasticsearch 实例提供了一种便捷的机制,以便在节点启动时可能不知道 IP 地址的情况下动态提供要连接的 IP 地址列表。
要启用基于文件的发现,请在 elasticsearch.yml
文件中按如下所示配置 file
主机提供程序
discovery.seed_providers: file
然后在 $ES_PATH_CONF/unicast_hosts.txt
中创建一个文件,格式如下所述。对 unicast_hosts.txt
文件进行任何更改时,Elasticsearch 都会获取新更改,并且将使用新的主机列表。
请注意,基于文件的发现插件会扩充 elasticsearch.yml
中的单播主机列表:如果 discovery.seed_hosts
中有有效的种子地址,则 Elasticsearch 除了 unicast_hosts.txt
中提供的地址之外,还会使用这些地址。
unicast_hosts.txt
文件每行包含一个节点条目。每个节点条目都包含主机(主机名或 IP 地址)和可选的传输端口号。如果指定了端口号,则必须紧随主机之后(在同一行上),并以 :
分隔。如果未指定端口号,则 Elasticsearch 将隐式使用 transport.profiles.default.port
给定的端口范围中的第一个端口,如果未设置 transport.profiles.default.port
,则使用 transport.port
。
例如,这是具有四个参与发现的节点的集群的 unicast_hosts.txt
示例,其中一些节点未在默认端口上运行
10.10.10.5 10.10.10.6:9305 10.10.10.5:10005 # an IPv6 address [2001:0db8:85a3:0000:0000:8a2e:0370:7334]:9301
允许使用主机名而不是 IP 地址,并且 DNS 会按上述方式解析主机名。IPv6 地址必须放在方括号内,如果需要,端口号应放在方括号后面。
您还可以在此文件中添加注释。所有注释都必须出现在以 #
开头的行上(即,注释不能从行的中间开始)。
EC2 主机提供程序
编辑EC2 发现插件添加了一个主机提供程序,该提供程序使用 AWS API 来查找种子节点列表。
Azure 经典主机提供程序
编辑Azure 经典发现插件添加了一个主机提供程序,该提供程序使用 Azure 经典 API 来查找种子节点列表。
Google Compute Engine 主机提供程序
编辑GCE 发现插件添加了一个主机提供程序,该提供程序使用 GCE API 来查找种子节点列表。