7.4 集群
一、搭建ES集群
单机的ES做数据存储,必然面临两个问题:海量数据存储问题、单点故障问题。
海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard),存储到多个节点
单点故障问题:将分片数据在不同节点备份(replica)
ES集群节点职责划分
节点类型配置参数默认值节点职责master eligible
node.master
true
备选主节点:主节点可以管理和记录集群状态、决定分片在那个节点、处理创建和删除索引库的请求
data
node.data
true
数据节点:存储数据、索引、聚合、CRUD
ingest
node.ingest
true
数据存储之前的预处理
coordinating
上面三个参数都为false则为coordinating节点
无
路由请求到其他节点,合并其他节点处理的结果,返回给用户
备注:建议搭建集群的时候就做好职责划分
二、集群脑裂问题
默认情况下,每个节点都是master eligible,因此,一旦master节点宕机,其他候选节点会选举一个称为主节点。当主节点与娶她节点网络故障时,可能会发生脑裂问题
为了避免脑裂,需要要求选票超过(eligible节点数量 + 1) /2 才能当选为主,因此eligible节点数量最好是奇数,对应配置项是discovery.zen.minimum_master_nodes,在ES7.0以后,预警称为默认配置,因此一般般刽发生脑裂问题
三、集群故障转移
集群的master节点会监控集群中的节点状态,如果发现有节点宕机,会立即将宕机节点的分片数据迁移到其他节点,确保数据安全,这个叫做故障转移
故障转移
master宕机后,eligibleMaster选举为新的主节点
master节点监控分片、节点状态,将故障节点上的分片转移到正常节点,确保数据安全
四、集群分布式存储
当新增文档时,应该保存到不同分片,保证数据平衡,那么coordinating node如何确定数据应该存储到那个分片呢
ES会通过hash算法来计算文档应该存储到哪个分片:
说明
_routing默认是文档id
算法与分片数量有关,因此索引库一旦创建,分片数量就不能修改!
五、集群分布式查询
查询一共分为两个阶段
scatter phase:分散阶段,coordinating node会把请求分发到每一个分片
gather phase:聚集阶段,coordinating node汇总data node的搜索结果,并处理为最终结果集返回给用户
最后更新于
这有帮助吗?