什么是分片
在 Elasticsearch 中,分片是数据的载体,一个 index 会被拆分为多个 shard,不同的 shard 承载一部分数据,用来实现水平拓展。同时,每一个 shard 可以分为 primary shard(主分片),和 0 个或多个 replica shard(副本分片),副本分片是主分片的拷贝,用来解决高可用的问题。
如何设定主副分片数
每一个分片为一个 Lucene 实例,对于分片的大小,分片的数量如果设置不当,会有以下影响
分片size过大
- 导致后续无法通过增加节点水平扩展
- 单个分片的数据量太大,如果需要增加副本,recovery 等场景中,会导致数据重新分配耗时更长,在 IO,带宽资源紧张时影响尤为明显。
分片数设置过多
多分片数的好处是提高查询速度,因为查询会跨多个分片并行执行,同时写入流量也会分散到多个实例。在7 .x 之前,默认 5 个 primary shard,每个 primary shard 默认分配一个 replica,7.0 开始,默认主分片设置成 1,解决了 over-sharding 的问题,分片数过多可能会导致如下问题:
- 影响搜索结果的相关性打分,影响统计结果的准确性
- 单个节点上过多的分片,会导致资源浪费,同时也会影响性能
那么我们该如何选择适合的分片数和大小?
分片大小设置建议
通常来说,有如下经验值:
- 在搜索类场景中,单个分片可以保持到 20GB
- 在日志类场景中,单个分片不要超过 50GB
分片数设置建议
基于分片大小,集群中的节点数,和节点规格来选择合适的分片数,不过需要注意的是,在关系型数据库中分库分表的概念不能在 Elasticsearch 完全套用,可能会起到反作用。建议进行一次完整的压测。通常来说有如下经验值:
- shard 的个数要尽可能等于数据节点数,或者是数据节点数的整数倍,避免数据倾斜。
- 建议单节点 shard 总数按照单节点内存 * 30 进行评估。
参考文档