发现 (Discovery)

发现是集群形成模块找到要与之形成集群的其他节点的过程。 当你启动一个 Elasticsearch 节点时,或者当一个节点认为主节点出现故障时,这个过程就会运行,并继续运行直到找到主节点或选出新的主节点。

该过程从来自一个或多个 种子主机提供者(seed hosts providers)种子(seed)地址列表开始,以及在最后已知的集群中的任何符合主节点条件的节点的地址。

该过程分两个阶段进行:

首先,每个节点通过连接到每个地址来探测种子地址,并试图识别它所连接的节点,并验证它是否是符合主节点条件的节点。

其次,如果成功,它与远程节点共享其所有已知的符合主节点条件的对等节点的列表,远程节点依次与对等节点进行响应。 然后,该节点探测它刚刚发现的所有新节点,请求它们的对等节点,等等。

如果该节点不符合主节点条件,则它继续这个发现过程,直到它发现了一个选举出的主节点。 如果没有发现选举出的主节点,则节点将在 discovery.find_peers_interval 后重试,其默认值为 1s

如果该节点符合主节点条件,那么它继续这个发现过程,直到它发现了一个被选举的主节点,或者它发现了足够多的无主的但符合主节点条件的节点来完成一个选择。 如果这两种情况都发生得不够快,那么节点将在 discovery.find_peers_interval 后重试,其默认值 1s

种子主机提供程序(seed hosts providers)

默认情况下,集群形成模块提供了两个种子主机提供程序来配置种子节点列表:基于 设置(settings) 的种子主机提供程序和基于文件(file)的种子主机提供程序。 它可以通过 发现插件(discovery plugins) 扩展到支持云环境和其他形式的种子主机提供程序。 种子主机提供程序是使用 discovery.seed_providers 设置配置的,该设置默认为基于设置(settings)的主机提供程序。 此设置接受不同提供程序的列表,允许你利用多种方法来查找集群的种子主机。

每个种子主机提供程序都产生种子节点的 IP 地址或主机名。 如果它返回的是任意的主机名,则使用 DNS 查找将这些主机名解析为 IP 地址。 如果一个主机名解析为多个 IP 地址,那么 Elasticsearch 会尝试在所有这些地址上找到一个种子节点。 如果主机提供程序到那时还没有显式给出节点的 TCP 端口,它将隐式地使用 transport.profiles.default.porttransport.port (如果未设置transport.profiles.default.port) 给出的端口范围中的第一个端口。 并发查找的数量由 discovery.seed_resolver.max_concurrent_resolvers控制(默认值为 10),每次查找的超时时间由 discovery.seed_resolver.timeout控制(默认值为 5s)。 请注意,DNS 查找受制于 JVM DNS缓存

基于设置的主机提供程序

基于设置的种子主机提供程序使用节点设置来配置种子节点地址的静态列表。 这些地址可以是主机名或 IP 地址;在每一轮发现过程中,指定为主机名的主机被解析为 IP 地址。

使用 discovery.seed_hosts 静态设置来设置主机列表。例如:

discovery.seed_hosts:
   - 192.168.1.10:9300
   - 192.168.1.11 
   - seeds.mydomain.com 

端口默认为 transport.profiles.default.port;如果未指定,则回退到 transport.port

如果主机名解析为多个 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 中有有效的种子地址,那么除了 unicast_hosts.txt 中提供的地址之外,Elasticsearch 还会使用这些地址。

unicast_hosts.txt 文件每行包含一个节点记录。 每个节点记录由主机(主机名或 IP 地址)和可选的传输端口号组成。 如果指定了端口号,则必须紧跟在主机之后(在同一行上),由一个 : 分隔。 如果未指定端口号,Elasticsearch 将隐式使用 transport.profiles.default.porttransport.port(如果未设置 transport.profiles.default.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 discovery plugin 添加了一个主机提供程序,它使用 GCE API 来查找种子节点列表。