Skip to content

ES分片

同一个索引会划分为多个分片。分片可以设置副本数量,分为主分片和副本分片。

java
# 指定索引的主分片和副本分片数
PUT /blogs
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}

主分片

  • 解决数据水平扩展的问题。同一个索引可以按照分片分配数据,将数据平均分配到所有节点之上。
  • 主分片数创建好后就不能修改。
  • 一个分片就是一个运行的 Lucene 实例。

主分片过少

  • 单个分片数据量过大。查询较慢,利用不了多节点的并发查询能力。
  • 无法通过增加节点实现水平扩展。比如三个分片,有五个节点。

主分片过多

  • 节点上分配过多的分配,会影响性能,可能并发查询比较多。
  • 影响结果的准确性。比如聚合取 top 是先在每个主分片查询聚合,然后到协调节点聚合的。并不是精确值。

副本分片

  • 副本分片是主分片的拷贝。在主分片不可用时,通过副本分片继续提供服务
  • 用来解决高可用问题,提高容错性。
  • 副本分片数可以动态调整。

image.png

如何确定分片数

存储角度

  • 搜索类应用,单个分片不要超过20GB
  • 日志类应用,当分片不要超过50GB

为什么要控制分配存储大小

  • 提高Update的性能。
  • 进行Merge时,减少需要的资源。
  • 丢失节点后,具备更快的恢复速度。
  • 便于分片的Rebalance。