Elasticsearch集群节点发现

节点发现是ES集群formation模块找到其他节点形成集群的过程。当你启动一个ES节点或者一个节点认为主节点挂了并开始选择新的主节点时运行节点发现任务。

节点发现开始时会获取来自一个或多个种子主机提供者的种子地址,还有最后已知集群中所有可以称为主节点的地址。这个过程分为两个阶段进行:一,集群中的每个节点通过连接每个种子地址来尝试验证种子地址所连接的节点并判断该节点是否可以成为主节点;二,验证成功后,节点会向远程节点分享可以成为主节点的节点列表,远程节点再依次告知与它同级的节点。节点继续探索在此过程中发现的新节点然后告诉它的同级节点,以此类推。

如果一个节点不是可用主节点,它会继续进行节点发现直到获取到一个被选举成功的主节点。如果还是没有找到主节点,则会在一段时间后进行重试,默认为1s。

种子主机提供者

默认情况下,集群formation模块提供了两种种子主机提供者来配置种子节点:基于设置和基于文件的种子主机提供者。通过插件可以扩展到云服务或者其他形式的种子服务提供者。选择哪种提供者可以通过discovery.seed_providers设置来指定,默认为基于设置的提供方式。这个设置支持提供者列表,允许你的服务中使用多种提供者来提供种子地址。

每个种子主机提供者会提供种子节点的IP地址或者服务器名称。如果提供服务器名称则会由DNS服务解析为IP地址。如果一个服务器地址被解析为多个IP地址,则ES会尝试在这些地址中发现所有的种子节点。如果TCP端口没有指定,则使用transport.profiles.default.port的值,如果这个值也没有设置,则使用transport.port。DNS探索并发数默认为10,超时时间默认为5s。

基于设置的种子主机提供者

基于设置的种子主机提供者会在设置中静态的配置一些种子服务地址,地址是IP或者服务器名称,在进行节点发现是服务器名称会被解析为IP地址。

1
2
3
4
discovery.seed_hosts:
- 192.168.1.10:9300
- 192.168.1.11
- seeds.mydomain.com
基于文件的种子主机提供者

这种方式利用一个外部文件来配置种子主机。当这个文件发生变化时ES会重新加载,所以无需重新启动每个节点就可以动态更新种子地址。例如,这为在Docker中运行的ES实例提供了一种方便的机制,可以在节点启动不知道种子IP地址时动态的提供需要连接的种子IP地址。

还有一些其他提供者如:EC2 host provider,Azure Classic host provider, Google Computer Engine host provider。