1. 集群规划


1. 我们需要多大规模的集群

  • 思考方向:
    • 当前的数据量有多大?数据增长情况如何?
    • 你的机器配置如何?cpu、多大内存、多大硬盘容量?
  • 推算依据:

    • ES JVM heap 最大 32G,30G heap 大概能处理的数据量 10T。
    • 如果内存很大,如 128G,可在一台机器上运行多个 ES 节点实例。

      2. 集群中的节点角色如何分

  • 节点角色

    • Master Node:设置 node.master: true 时,节点可作为主节点。
    • DataNode Node:设置 node.data: true 时,可作为数据节点,默认值为 true。
    • Ingest Node:默认都是预处理节点,配置 node.ingest: false 来禁用。
    • Coordinate Node:将上两个配置设置为 false 时,仅担任协调节点。
  • 如何分配?

    • 小规模集群:不需严格区分。
    • 中大规模集群(十个以上节点):应考虑单独的角色充当。特别并发查询量大,查询的合并量大,可以增加独立的协调节点。角色分开的好处是分工分开,互不影响。如不会因协调角色负载过高而影响数据节点的能力。

      3. 如何避免脑裂问题

  • 为尽量避免脑裂,可配置:discovery.zen.minimum_master_nodes: (有master资格节点数/2)+1

  • 常用做法(中大规模集群):

    • Master 和 DataNode 角色分开,配置奇数个 Master,比如 3。
    • 配置选举发现数,及延长 ping master 的等待时间:doscovery.zen.ping_timeout: 30(默认值是3秒)

      4. 索引应该设置多少个分片

  • 思考问题

    • 分片对应的存储实体是什么?
      • 分片对应的存储实体是 Lucene 索引。
    • 分片是不是越多越好,分片过多有什么影响?
      • Lucene 索引,会消耗文件句柄、内存及 CPU 资源。
      • 每个分片存储一部分词频统计信息,分片越多,每个分片存储的信息越少,计算出的得分与真实的得分偏差就会越大。
  • 分片设置的可参考原则:

    • Elasticsearch 推荐的最大 JVM 堆内存是 30-32G,所以把你的分片最大容量限制为 30G,然后再对分片数量做合理估算。例如,你认为的数据能达到 200GB,推荐你最多分配 7-8 个分片。
    • 在开始阶段,一个好的方案是根据你的节点数量按照 1.5~3 倍的原则来创建分片。例如,如果你有 3 个节点,则推荐你创建的分片数最多不超过 9(3x3)个。当性能下降时,增加节点,ES 会平衡分片的放置。
    • 对于基于日期的索引需求,并且对索引数据的搜索场景非常少。也许这些索引量将达到成百上千,但每个索引的数据量只有 1GB 甚至更小。对于这种类似场景,建议只需要为索引分配一个分片。

      5. 分片应该设置几个副本?

  • 思考

    • 副本的用途是什么?备份数据,提高查询的并发度。
    • 集群规模没变的情况下,副本过多会有什么影响? 占用磁盘存储,消耗写入性能(同步时间会更长),Lucene 索引消耗句柄、内存及 CPU 资源。
  • 基本原则:
    • 为保证高可用,副本数设置为 2 即可。要求集群至少有 3 个节点,来分开存放主分片、副本。
    • 如发现并发量大时,查询性能会下降,可增加副本数,来提升并发查询能力。

      2. ES 集群架构


image.png