单个分片
7.0 开始,新创建一个索引时,默认只有 1 个主分片;
优点
- 单个分片可以避免算分不准,聚合不准的问题;
缺点
- 单个索引,单个分片时,集群无法实现水平扩展,即使增加新的节点,也无法实现水平扩展;
两个分片
如果一个索引的主分片数是 2,那么集群增加一个节点后,ElasticSearch 会自动进行分片的移动,也叫 Shard Rebalancing。
如何设计分片数
分片数 > 节点数
- 集群中有新的节点加入,分片就可以进行自动分配;
- 分片在重新分配时,系统不会有 downtime;
多分片的好处
一个索引的多个分片,如果分布在多个节点,多个节点可以并行执行:
- 查询可以并行执行;
- 数据写入可以分散到多个机器;
分片过多所带来的副作用
Shard 是 ElasticSearch 实现集群水平扩展的最小单位,过多设置分片数会带来一些潜在的问题;
- 每个分片是一个 Lucene 的 Index,会占用机器的资源,过多的分片会导致额外的性能开销;
- 每次搜索的请求,需要从每个分片上获取数据;
- 分片的 Meta 信息由 Master 节点维护,过多,会增加管理的负担,经验值,控制分片的总数在 10w 以内;
如何确定主分片数
从存储的角度看
- 日志类应用:单个分片不要大于 50 GB;
- 搜索类应用:单个分片不要超过 20 GB;
为什么要控制分片存储的大小?
- 提高 Update 的性能;
- Merge 时,减少所需的资源;
- 丢失节点后,具备更快的恢复速度,便于分片在集群内 Rebalancing;
如何确定副本分片数
副本是主分片的拷贝,需要占用和主分片一样的资源,其主要作用有:
- 提高系统的可用性;
- 防止数据丢失;
- 响应查询请求;
副本分片对性能的影响
- 副本会降低数据的索引(写入)速度,有几份副本,就会有几倍的 CPU 资源消耗在索引上;
- 会减缓对主分片的查询压力,但是会消耗同样的内存资源;如果机器资源充足,提高副本数,可以提高整体的 QPS;
ElasticSearch 的分片策略
ElasticSearch 会尽量保证节点上的分片数大致相同,有些时候会有一些问题:
- 扩容的新节点没有数据,导致新索引集中在新的节点;
- 热点数据过于集中,可能会产生性能问题;
几个影响 ElasticSearch 分片策略的参数
-
index.routing.allocation.total_shards_per_node
; -
cluster.routing.allocation.total_shards_perL_node
;
网友评论