单个分片
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的分片策略会尽量保证节点上的分片数大致相同
- 扩容的新节点没有数据,导致新索引集中在新的节点
- 热点数据过于集中,可能会产生性能问题