ES角色划分
ES默认有四种角色,默认这四种角色都存在,分别是:master,data, coordinating, Ingest node节点
master
master节点具备主节点的选举权,有资格成为主节点,主节点控制整个集群的元数据(metaData),比如索引的新增,删除,切片分配等;
该节点不和应用创建连接,master节点不占用IO和CPU,内存使用量一般
角色配置方式:node.master:true
data
该节点和应用创建连接,接收索引请求,会存储分配再该node上的shard的数据并负责这些shard的写入,查询等,ES集群的性能取决于该节点的个数(每个节点的最优配置的情况下),data节点会占用大量的CPU,IO和内存
data节点的分片执行查询语句,获得查询结果后奖结果反馈给coordinating,此过程较消耗硬件资源;
角色配置方式:node.data:true
coordinating
该节点和检索应用创建连接,接收检索请求,但其本身不负责存储数据,可当负责均衡节点,coordinating节点不占用IO,cpu和内存
coordinating节点接收搜索请求之后,将请求转发到与查询条件相关的多个data节点的分片上,然后多个data节点的分片执行查询语句或者查询结果再返回给coordinating节点,coordinating来把各个data节点的返回结果进行整合,排序等一系列操作后再将最终结果返回给用户请求
角色配置方式:node.master:false,node.data:false
Ingest Node节点
可以在任何节点上启用ingest,甚至使用专门的ingest nodes;
ingest node 专门对索引文档做预处理,发生在对真实文档建立索引之前,在建立索引对文档那个预处理之前,先定义一个管道(pipeline),管道里制定了一系列的处理器,每个处理器能够把文档按照某种特定的方式转换,比如在管道里定义一个从某个文档中移除字段的处理器,紧接着一个重命名字段的处理器,集群的状态也会被存储到配置的管道内,定义一个管道,简单的在索引或者bulkrequest(一种批量请求方法)操作上定义Pipeline参数,这样ingest node就会知道在就那个管道在使用,这个节点的使用过程中用的也不多
角色配置方式node.ingest:true
ES选举机制
节点发现
Zendiscovery是es自己实现的一套用于节点发现和轩主等功能的模块,没有依赖zookeeper等工具,简单来说,节点发现依赖以下配置:
conf/elasticsearch.yml:
discovery.zen.ping.unicast.hosts: [1.1.1.1, 1.1.1.2, 1.1.1.3]
官方推荐这里设置为所有的master-eligible node
master节点选举
上面提到,急群众可能会有多个master-eligible node,这时就要进行master选举,保证只有一个当选master,如果有多个node当选为master,则集群中会出现脑裂,脑裂会破坏数据的一致性,导致集群行为不可控,产生各种非预期的影响
为了避免产生脑裂,es采用了常见的分布式系统思路,保证选举出来的master被多数派(quorum)的master-eligible node认可,以此来保证只有一个master,这个quorum通过以下配置进行配置
conf/elasticsearch.yml:
discovery.zen.minimum_master_nodes: 2
这个配置对于整个集群很重要
详细说明文档
master选举谁发起的,什么时候发起的
master选举是由mater节点发起的,当一个master节点发现满足以下条件时发起选举:
1. 该Master节点当前的状态不是master
2. 该master节点通过zenDiscovery模块的ping操作询问其已知的集群其他节点,没有任何节点连接到master
3. 包括本节点内,当前已有超过minimum_master_nodes个节点没有连接到master
总之,当一个节点发现包括自己在内多数派master节点认为集群没有master时,就可以发起master选举
选举谁?
选举后是排序后第一个master节点,排序的规则为:
优先先看clusterStateVersion,clusterStateVersion越大,优先级越高,如果优先级一样的情况下,看clusterstate的id,id越小优先级越高
选举流程
每个节点都会判断master的情况,当开启选举的时候,nodeA会按照规则看看那个节点可以作为master,然后就会向目标节点发送选举json,如果目标节点此时就是一个master,那么就会将nodeA纳入集群中,如果不是,就会将该消息作为一个选票。nodeA此时就会等待,看看目标节点是否会成为master或者有别的master,如果目标节点觉得自己不是master并且后面也竞争不上,那么就会给A返回一个失败回调,nodeA就会去找下一个master,如果目标节点为自己,那么A节点就等待其余节点发送选举消息,来作为选票或者纳入自己的集群