Elasticsearch分片

3,377 阅读3分钟

ES创建索引时,默认为5个主分片和1个副分片。索引创建好后,主分片数量不可修改,只可以修改副分片数量。随着业务的增长,数据量递增,最初的分片设置可能需要进行优化。如果需要修改主分片数量,只能重建新的索引,代价比较大。本文结合日常实际应用,对ES分片优化进行了总结。

分片理论知识

1. 分片数量

总分片数=主分片数*(副分片数+1)

"settings": {
   "number_of_shards": 1,
   "number_of_replicas": 4
}

上面创建索引配置表示,总分片数=1*(1+4),表示总共5个分片。

2. 分片优势

  • 通过把分片放在不同节点,可以存储超过单节点容量的数据
  • 当主分片节点故障后,可升级一个副分片为新的主分片来应对节点故障
  • 增加副分片,可以把数据存储到更多节点上,支持集群扩容和更好处理并发请求

3. 过度分配

单节点环境下,继续采用es的默认分片设置,就属于过度分配。

分片都是有额外成本的:

  • 每个分片都是一个小的lucene索引,会消耗相应的资源,
  • 每个搜索请求会调度到索引的每个分片中.但当分片位于同一个节点,就会开始竞争相同的硬件资源时, 性能便会逐步下降。

实际应用

场景:数据量大小约为10GB, 用于输入时自动提示场景,数据每天定时更新部分字段。ES集群有5台机器。

方案一:主分片数=1,副分片数=4,每个节点持有一个分片。

  • 优点:每个节点持有一个分片,读请求可以在一个分片获取结果,不需要合并结果等操作。
  • 缺点:索引写入的时候,全部请求到主分片的机器,再由主分片同步到副分片,由于副分片较多,写入过程变慢。

方案二:主分片数=2,副分片数=4,每个节点持有一个主分片和一个副分片。

  • 优点:副分片变少,对写入操作友好。
  • 缺点:多个分片分散在不同节点上,请求会发布到各个分片号上取topN汇总。由于评分是在各个分片内进行,在本场景中存在TF/IDF评分差异,导致返回结果排序问题。

考虑业务场景,最终选择方案一。

总结

  1. 读远大于写的场景,可以减少主分片个数,增加副本数,提升读吞吐率,前提是写的优先级不高。极端情况下单分片多副本可以最大程度提升总的读吞吐。

  2. 写远大于读的场景,最大程度分配主分片个数,一个机器一个,并最大程度减少副本数(极端情况下集群规模不大且可用性优先级较低时可以不要副本)。

  3. ElasticSearch推荐的最大JVM堆空间是30~32G, 所以把你的分片最大容量限制为30GB, 然后再对分片数量做合理估算. 例如, 你认为你的数据能达到200GB, 我们推荐你最多分配7到8个分片。