ES集群的高可用性知识点整理
为了防止ES集群中单点问题,一般都需要对集群节点做高可用性,当发生单点问题时,也可以向外正常提供服务。这里主要记录一下节点的加入、离开和选举。
集群安装教程请参考: https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html
节点角色: https://www.jianshu.com/p/7c4818dda91a
新节点的加入
随着数量大的增加,有时候我们不得进行机器的扩容,这时间就需要加入一些新的机器节点,用来提高访问速度。
当一个新节点加入的时候,它通过读取 discovery.zen.ping.unicast.hosts
配置的节点获取集群状态,然后找到 master
节点,并向其发送一个join request(discovery.zen.join_timeout)。主节点接收到请求后,同步集群状态到新节点。
对于每个节点角色一般有三种,分别为master、data 和 eligible 。就是我们通过 http://localhost:9200/_cat/nodes?v 查看到的列 node.role 的值。
master: 表示为master节点,主要管理集群信息、primary分片和replica分片信息、维护index信息。
data: 表示数据节点,存储数据,维护倒排索引,提供数据检索等。
eligible: 表示参与选举
每个节点都可以配置成这三种身份,如果不配置的话,则默认为 mdi 角色。
非主节点离开
当主节点定期ping(ping_interval 默认为1s)一个节点出现3次ping不通的情况时(ping_timeout 默认为30s),主节点会认为该节点已宕机,将该节点踢出集群。
主节点的选举
当主节点发生故障时,集群中的其他节点将会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信息。