ES集群的高可用性之节点
By admin
- One minute read - 82 words为了防止ES集群中单点问题,一般都需要对集群节点做高可用性,当发生单点问题时,也可以向外正常提供服务。这里主要记录一下节点的加入、离开和主节点选举。
集群安装教程请参考:
节点角色
集群是由多个节点组成的,每个节点都扮演着不同的角色,一般常用的有 Master、Data 和 client。节点角色介绍:
节点角色配置参数: node.master: true node.data: false node.ingest: false
在一个集群中,可以通过 查看到每个节点在集群中扮演的角色,一个节点可同时拥有多个角色,如值MDI,同时也是每个节点的默认值,其中的 Ingest 节点也称作预处理节点,不过在生产环境中一般将master 和 data节点分开的。所有节点默认都是支持 Ingest 操作的。节点组合参考:
新节点的加入
随着数量大的增加,有时候我们不得进行机器的扩容,这时间就需要加入一些新的机器节点,用来提高访问速度。
当一个新节点加入的时候,它通过读取 discovery.zen.ping.unicast.hosts
配置的节点获取集群状态,然后找到 master
节点,并向其发送一个join request(discovery.zen.join_timeout)
。主节点接收到请求后,同步集群状态到新节点。
节点离开
这里指非 mastr 节点。
当master主节点定期ping(ping_interval 默认为1s)一个节点出现3次ping不通的情况时(ping_timeout 默认为30s
),主节点会认为该节点已宕机,将该节点踢出集群。
主节点的选举
我们知道集群中master节点角色的重要性,如果此节点出现问题的话,服务基本处于不可用状态了,所以保证master节点的高可用性至关重要。
当主节点发生故障时,集群中的其他节点将会ping当前的 master eligible 节点,并从中选出一个新的主节点。
节点可以通过设置 node.master=true
来设置自己的角色为主节点。
通过配置discovery.zen.minimum_master_nodes
防止集群出现脑裂。该配置通过检查集群中 master eligible 的个数来判断是否选举出一个主节点。其个数最好设置为**(number_master eligible/2)+1**,防止当主节点出问题时,一个集群分裂为两个集群。
具有最小编号的active master eligible node将会被选举为master节点。参考:
脑裂的概念:
如果你有2个Master候选节点,并设置最小Master节点数为1,当网络抖动或偶然断开时,2个Master都会认为另一个Master挂掉了,他们都被选举为主Master,则此时集群中存在两个主Master,即物理上1个集群变成了逻辑上的2个集群,而当其中一个Master再次挂掉时,即便它恢复后回到了原有的集群,在它作为主Master期间写入的数据都会丢失,因为它上面维护了Index信息。类似我们平时的投票选举一下,10个人如果赞成与返对的比例为5:5就不太好了,所以必须保证双方的票数无法完全一样才可以。
为了防止脑裂,常常设置参数为discovery.zen.minimum_master_nodes=N/2+1,其中N为集群中Master节点的个数。建议集群中Master节点的个数为奇数个,如3个或者5个。
在版本 6 和更早的版本中,还有一些其他以 discovery.zen.* 开头的选项,允许你配置 Zen Discovery 的行为。其中一些设置不再有效,已被删除。其他的已经改名。如果一个参数已经被改名,那么它的旧名称在版本 7 中就被弃用,你需要调整配置来使用新名称。
新的集群协调子系统包括一个新的故障检测机制。这意味着 discovery.zen.fd.* 开头的 Zen Discovery 错误检测设置不再有效。大多数用户应该在版本 7 或更高版本中使用默认的故障检测配置,如果需要进行任何更改,可以使用cluster.fault_detection.*
elasticsearch.yml
配置详解: