单个分片

7.0开始创建一个索引时,默认只有一个主分片

  • 单个分片,查询算分,聚合不准的问题都可以得以避免

单个索引,单个分片时候,集群无法实现水平扩展

  • 即使增加新的节点,无法实现水平扩展,shard是Elasticsearch实现集群水平扩展的最小单位

    两个分片

    集群增加一个节点后,ES会自动进行分片的平衡,shard rebalancing

    如何设计分片数

    当分片数>节点数时

  • 一旦集群中有新的数据节点加入,分片会自动进行分片

  • 分片在重新分配时,系统不会有downtime

多分片的好处

  • 一个索引如果分布在不同的节点,可以多节点并行执行,提升查询效率
  • 数据写入可以分散到多个机器

过多分片的副作用

  • 每个分片是一个Lucence的索引,会占用机器资源文件描述/内存/CPU,过多分片导致额外的性能开销
  • 每次搜索请求需要从每个分片上获取数据
  • 分片的meta信息由master节点维护,过多增加管理负担,控制分片总数在10w以内

    确定主分片数

    从存储的物理角度看,日志类应用单个分片不要大于50GB,搜索类应用单个分片不超过20GB
    控制分片存储大小
    提高update性能
    merge时,减少所需的资源
    丢失节点后,具备更快的恢复速度/便于分片在集群内rebalancing

    如何确定副本分片数

    提高系统可用性:相应查询请求,防止数据丢失
    需要占用和主分片一样的资源
    对性能的影响
    副本会降低数据的索引速度,有几份副本就会有几倍的cpu资源消耗在索引上
    会缓解对主分片的查询压力,但会消耗同样的内存资源
    机器资源充分,提高副本书,可以提高整体的查询QPS
    案例1

  • 每天1GB的数据,一个索引一个主分片,一个副本分片

  • 保留半年的数据,接近360GB的数据量

案例2

  • 5个不同的日志,每天创建一个日志索引,每个日志索引创建10个主分片
  • 保留半年的数据
  • 51030*6=9000个分片

调整分片总数设定,避免分配不均衡

  • index.routing.allocation.total_shards_per_node
  • cluster.routing.allocation.total_shards_per_node

ES的分片策略会尽量保证节点上的分片数大致相同

  • 扩容的新节点没有数据,导致新索引集中在新的节点
  • 热点数据过于集中,可能会产生性能问题