ES分片
同一个索引会划分为多个分片。分片可以设置副本数量,分为主分片和副本分片。
java
# 指定索引的主分片和副本分片数
PUT /blogs
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
主分片
- 解决数据水平扩展的问题。同一个索引可以按照分片分配数据,将数据平均分配到所有节点之上。
- 主分片数创建好后就不能修改。
- 一个分片就是一个运行的 Lucene 实例。
主分片过少
- 单个分片数据量过大。查询较慢,利用不了多节点的并发查询能力。
- 无法通过增加节点实现水平扩展。比如三个分片,有五个节点。
主分片过多
- 节点上分配过多的分配,会影响性能,可能并发查询比较多。
- 影响结果的准确性。比如聚合取 top 是先在每个主分片查询聚合,然后到协调节点聚合的。并不是精确值。
副本分片
- 副本分片是主分片的拷贝。在主分片不可用时,通过副本分片继续提供服务。
- 用来解决高可用问题,提高容错性。
- 副本分片数可以动态调整。
如何确定分片数
存储角度
- 搜索类应用,单个分片不要超过20GB
- 日志类应用,当分片不要超过50GB
为什么要控制分配存储大小
- 提高Update的性能。
- 进行Merge时,减少需要的资源。
- 丢失节点后,具备更快的恢复速度。
- 便于分片的Rebalance。