介绍
ES是一种p2p(peer to peer)的分布式架构设计,集群中的每个节点都可以与其他任意节点进行通讯。这是不同于hadoop的master-slave的分布式系统。
ES中也存在master角色,但是其功能主要是维护集群的元信息(cluster status),当任意node上的信息修改时,将变更信息同步到其他剩余node上。即,每个node都具有一套完整的cluster status。
ES各节点想组成一个集群有两个必要条件:
- cluster.name 必须一致
- 通过discovery.zen.ping.unicast.hosts
可以相互关联起来,discovery.zen.ping.unicast.hosts 列表中的IP列表称为种子节点。
ES组集群的过程
discovery机制:Zen (丢弃了自动发现的机制)
Zen机制:
- 多播(2.X后已经禁用)来寻找其它的节点
只需启动新的ElasticSearch节点即可,如果各个模块工作正常,该节点就会自动添加到与节点中集群名字(cluster.name)一样的集群,同时其它的节点都能感知到新节点的加入。
当节点并非集群的一部分时(比如节点只是刚刚启动或者重启 ),它会发送一个多播的ping请求到网段中,该请求只是用来通知所有能连接到节点和集群它已经准备好加入到集群中。 - 单播方式
当像前面描述的那样关闭多播,就可以安全地使用单播。当节点不是集群的一部分时(比如节点重启,启动或者由于某些错误从集群中断开),节点会发送一个ping请求到事先设置好的地址中,来通知集群它已经准备好加入到集群中了。相关的配置项很简单,如下:
<discovery.zen.ping.unicats.hosts>:该配置项代表集群中初始结点的主机列表。每个主机由名字(或者IP地址)加端口或者端口范围组成。比如,该属性值可以是如下的写法:[“master1″,”master2:8181”, “master3[80000-81000]”] ,因此用于单播节点发现的主机列表基本上不必是集群中的所有节点,因为一个节点一旦连接到集群中的一个节点,这个连接信息就会发送集群中其它所有的节点。
<discovery.zen.ping.unicats.concurrent_connects>(默认值: 10):该属性指定节点发现模块能够开启的单播最大并发连接数。
Zen发现机制的故障检测
ElasticSearch运行时会启动两个探测进程。一个进程用于从主节点向集群中其它节点发送ping请求来检测节点是否正常可用。另一个进程的工作反过来了,其它的节点向主节点发送ping请求来验证主节点是否正常且忠于职守。但是,如果我们的网络很慢或者节点分布在不同的主机,默认的配置可能显得力不从心。因此,ElasticSearch的节点发现模块开放出了如下的属性:
- discovery.zen.fd.ping_interval:该属性的默认值是1s,指定了本节点隔多久向目标结点发送一次ping请求。
- discovery.zen.fd.ping_timeout:该属性的默认值是30s,指定了节点等待ping请求的回复时间。如果节点百分百可用或者网络比较慢,可能就需要增加该属性值。
- discovery.zen.fd.ping_retries:该属性值默认为3,指定了在目标节点被认定不可用之前ping请求重试的次数。用户可以在网络丢包比较严重的网络状况下增加该属性值(或者修复网络状况)。
master选举的过程
Adding a Node的过程
- node会对配置文件中<discovery.zen.ping.unicast.hosts>的IP列表发送unicast消息,并通过multicast的方式寻找集群中的其他节点;
- 当发现更多节点后,再逐个连接,并询问它们知道的集群节点信息;
- 然后对自己未知的节点发送请求,请求连接。
通过这种方式,先前运行的实例可以帮助快速获取群集中当前节点的新的实例。
相关参数:
discovery.zen.ping.unicast.hosts #指几点通过单播方式发现其他节点时,单播发送请求的主机列表,可API修改
discovery.zen.ping.minimum_master_nodes #指为完成选举所需要的master-eligible节点数量;
#防止集群脑裂,在生产环境需要配置;
#此项设置还会影响到集群状态的update,当主节点收到来自其他节点的状态更新数据,更新数据是否接受前,必须由大于此设置的master-eligible数量承认,才说明此集群的更新成功,才会同步到其他所有的节点。
discovery.zen.master_election.ignore_non_master_pings #指的是集群在选举master时,不考虑非master-eligible的选票。
discovery.zen.ping_timeout #指的是一类行为的超时时间,这类行为发生在两种场景:
#在集群需要重新选举master时,在timeout时间内,相关节点会ping3次,从而做出选举的结果,若ping3次后在timeout时间内ping3次后,仍然没有做出决定,则再进行一遍此类操作。
#在一个节点准备加入集群时,会向msater节点发送请求,这里有个超时时间为timeout的20倍(默认情况下),从而确定四否加入成功。discovery.zen.join_timeout
参数介绍:
ping.multicast.enabled: false 多播关闭
discovery.zen.ping.unicast.hosts:指几点通过单播方式发现其他节点时,单播发送请求的主机列表,可API修改
discovery.zen.ping.minimum_master_nodes:指为完成选举所需要的master-eligible节点数量;
#防止集群脑裂,在生产环境需要配置;
#此项设置还会影响到集群状态的update,当主节点收到来自其他节点的状态更新数据,更新数据是否接受前,必须由大于此设置的master-eligible数量承认,才说明此集群的更新成功,才会同步到其他所有的节点。 discovery.zen.master_election.ignore_non_master_pings
#指的是集群在选举master时,不考虑非master-eligible的选票。
discovery.zen.ping_timeout
#指的是一类行为的超时时间,这类行为发生在两种场景:
#在集群需要重新选举master时,在timeout时间内,相关节点会ping3次,从而做出选举的结果,若ping3次后在timeout时间内ping3次后,仍然没有做出决定,则再进行一遍此类操作。
#在一个节点准备加入集群时,会向msater节点发送请求,这里有个超时时间为timeout的20倍(默认情况下),从而确定四否加入成功。discovery.zen.join_timeout
集群故障检测相关配置参数
集群是如何发现节点故障的?
两个方面。
- 主节点ping其余所有节点
验证节点是是否处于活跃状态 - 所有节点ping主节点
验证是否需要启动master选举。
相关参数:
discovery.zen.fd.ping_interval 默认1s ,ping间隔
discovery.zen.fd.ping_timeout 默认30s ,ping响应超时时间
discovery.zen.fd.ping_retries 默认3 ,ping 几次都失败试为节点失败