7.4 集群

一、搭建ES集群

  1. 单机的ES做数据存储,必然面临两个问题:海量数据存储问题、单点故障问题。

    1. 海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard),存储到多个节点

    2. 单点故障问题:将分片数据在不同节点备份(replica)

  2. 搭建方式:

    1. 集群健康检查,推荐工具:cerebro

    2. 可以在穿件索引时候进行分片配置,可以通过settings配置,也可以通过工具直接设置

  3. ES集群节点职责划分

    节点类型
    配置参数
    默认值
    节点职责

    master eligible

    node.master

    true

    备选主节点:主节点可以管理和记录集群状态、决定分片在那个节点、处理创建和删除索引库的请求

    data

    node.data

    true

    数据节点:存储数据、索引、聚合、CRUD

    ingest

    node.ingest

    true

    数据存储之前的预处理

    coordinating

    上面三个参数都为false则为coordinating节点

    路由请求到其他节点,合并其他节点处理的结果,返回给用户

    备注:建议搭建集群的时候就做好职责划分

二、集群脑裂问题

  1. 默认情况下,每个节点都是master eligible,因此,一旦master节点宕机,其他候选节点会选举一个称为主节点。当主节点与娶她节点网络故障时,可能会发生脑裂问题

  2. 为了避免脑裂,需要要求选票超过(eligible节点数量 + 1) /2 才能当选为主,因此eligible节点数量最好是奇数,对应配置项是discovery.zen.minimum_master_nodes,在ES7.0以后,预警称为默认配置,因此一般般刽发生脑裂问题

三、集群故障转移

  1. 集群的master节点会监控集群中的节点状态,如果发现有节点宕机,会立即将宕机节点的分片数据迁移到其他节点,确保数据安全,这个叫做故障转移

  2. 故障转移

    1. master宕机后,eligibleMaster选举为新的主节点

    2. master节点监控分片、节点状态,将故障节点上的分片转移到正常节点,确保数据安全

四、集群分布式存储

  1. 当新增文档时,应该保存到不同分片,保证数据平衡,那么coordinating node如何确定数据应该存储到那个分片呢

    1. ES会通过hash算法来计算文档应该存储到哪个分片:

      shard=hash(_routing)%number_ofshardsshard = hash(\_routing) \% number\_of_shards

      说明

      _routing默认是文档id

      算法与分片数量有关,因此索引库一旦创建,分片数量就不能修改!

五、集群分布式查询

  1. 查询一共分为两个阶段

    1. scatter phase:分散阶段,coordinating node会把请求分发到每一个分片

    2. gather phase:聚集阶段,coordinating node汇总data node的搜索结果,并处理为最终结果集返回给用户

最后更新于

这有帮助吗?