ES集群的高可用性之节点

为了防止ES集群中单点问题,一般都需要对集群节点做高可用性,当发生单点问题时,也可以向外正常提供服务。这里主要记录一下节点的加入、离开和主节点选举。

集群安装教程请参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html

节点角色

集群是由多个节点组成的,每个节点都扮演着不同的角色,一般常用的有 Master、Data 和 client。节点角色介绍:https://www.jianshu.com/p/7c4818dda91a

节点角色配置参数:
node.master: true
node.data: false
node.ingest: false 

在一个集群中,可以通过 http://localhost:9200/_cat/nodes?v 查看到每个节点在集群中扮演的角色,一个节点可同时拥有多个角色,如值MDI,同时也是每个节点的默认值,其中的 Ingest 节点也称作预处理节点,不过在生产环境中一般将master 和 data节点分开的。所有节点默认都是支持 Ingest 操作的。节点组合参考:https://blog.51cto.com/michaelkang/2061712

新节点的加入

随着数量大的增加,有时候我们不得进行机器的扩容,这时间就需要加入一些新的机器节点,用来提高访问速度。

当一个新节点加入的时候,它通过读取 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节点。参考:https://www.elastic.co/guide/cn/elasticsearch/guide/current/important-configuration-changes.html

脑裂的概念:
如果你有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 配置详解:https://www.cnblogs.com/zlslch/p/6419948.html

参考资料