没有合适的资源?快使用搜索试试~ 我知道了~
Elasticsearch分布式一致性原理剖析(一)-节点篇1
需积分: 0 3 下载量 51 浏览量
2022-08-03
19:20:51
上传
评论
收藏 319KB PDF 举报
温馨提示
试读
16页
1. ES集群构成 2. 节点发现 4. 错误检测 5. 集群扩缩容 7. 结 1. 该master-eligible节点的当前状态不是master 2. 该m
资源详情
资源评论
资源推荐
Elasticsearch分布式⼀致性原理剖析
(⼀)-节点篇
前⾔
“Elasticsearch分布式⼀致性原理剖析”系列将会对Elasticsearch的分布式⼀致
性原理进⾏详细的剖析,介绍其实现⽅式、原理以及其存在的问题等(基于
6.2版本)。
ES⽬前是最流⾏的分布式搜索引擎系统,其使⽤Lucene作为单机存储引擎并
提供强⼤的搜索查询能⼒。学习其搜索原理,则必须了解Lucene,⽽学习ES
的架构,就必须了解其分布式如何实现,⽽⼀致性是分布式系统的核⼼之
⼀。
本篇将介绍ES的集群组成、节点发现与Master选举,错误检测与扩缩容相关
的内容。ES在处理节点发现与Master选举等⽅⾯没有选择Zookeeper等外部
组件,⽽是⾃⼰实现的⼀套,本⽂会介绍ES的这套机制是如何⼯作的,存在
什么问题。本⽂的主要内容如下:
1. ES集群构成
2. 节点发现
3. Master选举
4. 错误检测
5. 集群扩缩容
6. 与Zookeeper、raft等实现⽅式的⽐较
7. ⼩结
ES集群构成
⾸先,⼀个Elasticsearch集群(下⾯简称ES集群)是由许多节点(Node)构成的,
Node可以有不同的类型,通过以下配置,可以产⽣四种不同类型的Node:
conf/elasticsearch.yml:
node.master: true/false
node.data: true/false
四种不同类型的Node是⼀个node.master和node.data的true/false的两两组
合。当然还有其他类型的Node,⽐如IngestNode(⽤于数据预处理等),不在
本⽂讨论范围内。
当node.master为true时,其表⽰这个node是⼀个master的候选节点,可以参
与选举,在ES的⽂档中常被称作master-eligible node,类似于
MasterCandidate。ES正常运⾏时只能有⼀个master(即leader),多于1个时会
发⽣脑裂。
当node.data为true时,这个节点作为⼀个数据节点,会存储分配在该node上
的shard的数据并负责这些shard的写⼊、查询等。
此外,任何⼀个集群内的node都可以执⾏任何请求,其会负责将请求转发给
对应的node进⾏处理,所以当node.master和node.data都为false时,这个节点
可以作为⼀个类似proxy的节点,接受请求并进⾏转发、结果聚合等。
上图是⼀个ES集群的⽰意图,其中NodeA是当前集群的Master,NodeB和
NodeC是Master的候选节点,其中NodeA和NodeB同时也是数据节点
(DataNode),此外,NodeD是⼀个单纯的数据节点,Node_E是⼀个proxy节
点。每个Node会跟其他所有Node建⽴连接。
到这⾥,我们提⼀个问题,供读者思考:⼀个ES集群应当配置多少个
master-eligible node,当集群的存储或者计算资源不⾜,需要扩容时,新扩
上去的节点应该设置为何种类型?
节点发现
ZenDiscovery是ES⾃⼰实现的⼀套⽤于节点发现和选主等功能的模块,没有
依赖Zookeeper等⼯具,官⽅⽂档:
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-
discovery-zen.html
简单来说,节点发现依赖以下配置:
conf/elasticsearch.yml:
discovery.zen.ping.unicast.hosts: [1.1.1.1, 1.1.1.2, 1.1.1.3]
这个配置可以看作是,在本节点到每个hosts中的节点建⽴⼀条边,当整个集
群所有的node形成⼀个联通图时,所有节点都可以知道集群中有哪些节点,
不会形成孤岛。
官⽅推荐这⾥设置为所有的master-eligible node,读者可以想想这样有何好
处:
Master选举
上⾯提到,集群中可能会有多个master-eligible node,此时就要进⾏master选
举,保证只有⼀个当选master。如果有多个node当选为master,则集群会出
现脑裂,脑裂会破坏数据的⼀致性,导致集群⾏为不可控,产⽣各种⾮预期
It is recommended that the unicast hosts list be maintained as the list of master-eligible nodes in the cluster.
的影响。
为了避免产⽣脑裂,ES采⽤了常见的分布式系统思路,保证选举出的master
被多数派(quorum)的master-eligible node认可,以此来保证只有⼀个master。
这个quorum通过以下配置进⾏配置:
conf/elasticsearch.yml:
discovery.zen.minimum_master_nodes: 2
这个配置对于整个集群⾮常重要。
1 master选举谁发起,什么时候发起?
master选举当然是由master-eligible节点发起,当⼀个master-eligible节点发现
满⾜以下条件时发起选举:
1. 该master-eligible节点的当前状态不是master。
2. 该master-eligible节点通过ZenDiscovery模块的ping操作询问其已知的集
群其他节点,没有任何节点连接到master。
3. 包括本节点在内,当前已有超过minimum_master_nodes个节点没有连
接到master。
总结⼀句话,即当⼀个节点发现包括⾃⼰在内的多数派的master-eligible节点
认为集群没有master时,就可以发起master选举。
2 当需要选举master时,选举谁?
⾸先是选举谁的问题,如下⾯源码所⽰,选举的是排序后的第⼀个
MasterCandidate(即master-eligible node)。
那么是按照什么排序的?
public MasterCandidate electMaster(Collection<MasterCandidate> candidates) {
assert hasEnoughCandidates(candidates);
List<MasterCandidate> sortedCandidates = new ArrayList<>(candidates);
sortedCandidates.sort(MasterCandidate::compare);
return sortedCandidates.get(0);
}
剩余15页未读,继续阅读
点墨楼
- 粉丝: 32
- 资源: 281
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0