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 时,仅担任协调节点。
- Master Node:设置
- 如何分配?
- 小规模集群:不需严格区分。
- 中大规模集群(十个以上节点):应考虑单独的角色充当。特别并发查询量大,查询的合并量大,可以增加独立的协调节点。角色分开的好处是分工分开,互不影响。如不会因协调角色负载过高而影响数据节点的能力。
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 个节点,来分开存放主分片、副本。
- 如发现并发量大时,查询性能会下降,可增加副本数,来提升并发查询能力。