背景知识
ElasticSearch(下文简称ES)集群中,每一台服务器都有自己的角色,有一部分服务器可以设定为候选Master(至少是3台),也就是说这些服务器已经具备成为Master角色的能力,但是具体谁最终成为Master是要通过选举才可以。
在ES配置文件里,有两个参数来决定该节点是否是候选Master或者Data节点,如果想让某个节点只作为Data节点,那么需要将node.master设置为false,而node.data设置为true:
node.master: true/false node.data: true/false
上图是一个ES集群的示意图,其中NodeA是当前集群的Master,NodeB和NodeC是Master的候选节点,其中NodeA和NodeB同时也是数据节点(DataNode),此外,NodeD是一个单纯的数据节点,Node_E是一个proxy节点。每个Node会跟其他所有Node建立连接。
节点发现
ES服务启动后,首先要通过节点发现功能加入集群。ZenDiscovery是ES自己实现的一套用于节点发现和选主等功能的模块,没有依赖Zookeeper等工具。 简单来说,节点发现依赖以下配置:
discovery.seed_hosts: ["192.168.222.101", "192.168.222.102", "192.168.222.103"]这个配置可以看作是,在本节点到每个discovery.sedd_hosts中的节点建立一条关联线,当整个集群所有的node形成一个联通图时,所有节点都可以知道集群中有哪些节点存在了。
Master选举
上面提到,集群中可能会有多个候选Master节点,此时就要进行Master选举,保证只有一个当选Master。如果有多个节点当选为Master,则集群会出现脑裂,脑裂会破坏数据的一致性,导致集群行为不可控,产生各种非预期的影响。
脑裂示意图
为了避免产生脑裂,ES采用了常见的分布式系统思路,保证选举出的master被多数派(quorum)的候选Master节点认可,以此来保证只有一个Master。这个quorum通过以下配置进行配置:
discovery.zen.minimum_master_nodes: 2这个配置对于整个集群非常重要。
谁发起Master选举
Master选举是由候选Master节点发起,当一个候选Master节点发现满足以下条件时就会发起选举:
该候选Master节点的当前状态不是Master;
该候选Master节点通过ZenDiscovery模块的ping操作询问其已知的集群其他节点,没有任何节点连接到Master;
包括本节点在内,当前已有超过minimum_master_nodes个节点没有连接到Master。
简单讲,就是当一个候选Master节点发现包括自己在内的多数候选Master节点认为集群没有Master时,就可以发起Master选举。
如何选举
ES Master选举有一套自己的算法,该算法是基于一种称为“状态机复制”的机制。状态机复制的基本原理是,在一个分布式系统中,每个节点都有一份当前的状态,并且每个节点都可以独立决定自己是否被选举为Master节点。在ES集群中,每个节点都会比较当前节点和其他节点的状态,如果当前节点的状态最新,则当前节点将被选为Master节点。
ES的选举工作流程大致如下:
① 首先,所有候选Master节点都会比较自己的状态,如果自己的状态最新,则发起投票;
② 其他节点收到投票后,也会比较自己的状态,如果自己的状态最新,则会再次发起投票;
③ 当某个节点收到来自其他节点的投票,且自己的状态最新时,则会将自己的状态发送给其他节点,并同意自己被选为Master节点;
④ 其他节点收到来自Master节点的状态后,会将自己的状态更新,同意将Master节点选为Master节点(有点绕口);
⑤ 一旦Master节点确定,其他节点就会向Master节点发送心跳包,以确保Master节点的活动状态;
⑥ 如果Master节点失去连接,则其他节点会开始新的投票,以确定新的Master节点。
按照上述流程,我们描述一个简单的场景来帮助大家理解:
假如集群中有3个候选Master节点,分别为Node_A、 Node_B、 Node_C。三个节点都认为当前没有Master,于是都各自发起选举。
假如此时Node_A的状态最新,所以选举结果都为Node_A。于是Node_A开始等选票,Node_B、Node_C都向Node_A发起投票,当Node_A接收到第一次投票(假如是Node_B发起的)时,加上它自己的一票,就获得了两票了(超过半数),于是Node_A成为Master。
有一点要说明,对于ES集群来说,当Master节点确立时,它就会等待其它节点join自己成为一个集群了,当所有其它非Master节点全部join到Master时,集群才算彻底创建完成。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !