发现
编辑发现编辑
发现是集群形成模块找到其他节点以形成集群的过程。此过程在您启动 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 Classic 主机提供程序编辑
Azure Classic 发现插件 添加了一个主机提供程序,该提供程序使用 Azure Classic API 查找种子节点列表。
Google Compute Engine 主机提供程序编辑
GCE 发现插件 添加了一个主机提供程序,该提供程序使用 GCE API 查找种子节点列表。