合理设置分片数

分片和副本的设计为 ES 提供了支持分布式和故障转移的特性,但并不意味着分片和 副本是可以无限分配的。

而且索引的分片完成分配后由于索引的路由机制,我们是不能重新 修改分片数的。 可能有人会说,我不知道这个索引将来会变得多大,并且过后我也不能更改索引的大小, 所以为了保险起见,还是给它设为 1000 个分片吧。但是需要知道的是,一个分片并不是没 有代价的。需要了解:  一个分片的底层即为一个 Lucene 索引,会消耗一定文件句柄、内存、以及 CPU 运转。  每一个搜索请求都需要命中索引中的每一个分片,如果每一个分片都处于不同的节点还好, 但如果多个分片都需要在同一个节点上竞争使用相同的资源就有些糟糕了。  用于计算相关度的词项统计信息是基于分片的。如果有许多分片,每一个都只有很少的数据会导致很 低的相关度。 一个业务索引具体需要分配多少分片可能需要架构师和技术人员对业务的增长有个预 先的判断,横向扩展应当分阶段进行。为下一阶段准备好足够的资源。 只有当你进入到下 一个阶段,你才有时间思考需要作出哪些改变来达到这个阶段。一般来说,我们遵循一些原 则:  控制每个分片占用的硬盘容量不超过 ES 的最大 JVM 的堆空间设置(一般设置不超过 32G,参考下文 的 JVM 设置原则),因此,如果索引的总容量在 500G 左右,那分片大小在 16 个左右即可;当然, 最好同时考虑原则 2。  考虑一下 node 数量,一般一个节点有时候就是一台物理机,如果分片数过多,大大超过了节点数, 很可能会导致一个节点上存在多个分片,一旦该节点故障,即使保持了 1 个以上的副本,同样有可能 会导致数据丢失,集群无法恢复。所以, 一般都设置分片数不超过节点数的 3 倍。  主分片,副本和节点最大数之间数量,我们分配的时候可以参考以下关系: 节点数<=主分片数*(副本数+1)