-
7.0开始 新创建要给索引时,默认只有一个主分片
单个分片,查下算分,聚合不准的问题都可以得以避免 -
单个索引,单个分片时候,集群无法实现水平扩展
即使增加新的节点,无法实现水平扩展
在es中最小的单元是分片.无法增加节点的方式水平扩展 -
集群增加一个节点后,Elasticsearch会自动进行分片的移动,也叫Shard Rebalancing
要是为索引,生成两个主分片,当数量越来越大的时候,磁盘无法保存,只要为它增加新的节点,会自动发送第二个分片上去当分片书 > 节点数时 一旦集群中有新的数据节点加入,分片就可以自动进行分片 分片在重新分配时,系统不会有downtime 多分片的好处: 一个索引如果分布在不同的节点,多个节点可以并行执行
查询可以并行执行
数据写入可以分散到多个机器
增加插入吞吐量,查询吞吐量分片:一个分片就是一个运行的 lucene 实例,
一个节点可以包含多个分片,分片由分为如下类型: -
主分片:用于解决数据水平扩展的问题,一个索引的所有数据是分布在所有主分片之上的(每个主分片承担一部分数据,主分片又分布在不同的节点上),一个索引的主分片数量只能在创建时指定,后期无法修改,除非对数据进行重新构建索引(reindex操作)。
-
副本分片:用于解决数据高可用的问题,一个副本分片即一个主分片的拷贝,其数量可以动态调整,通过增加副本分片也可以实现提升系统读性能的作用。
分片过多带来的副作用
Shard 是 Elasticsearch 实现集群水平扩展的最小单位
过多设置分片数会带来一些潜在的问题
每个分片是一个LUCENE的索引,会使用机器的资源,过多的分片会导致额外的性能开销
Lucene 可以看以下的文章会,更好的理解
https://blog.csdn.net/ZY12166/article/details/93230169
https://blog.csdn.net/qq_15175765/article/details/78861947Lucene indices /File descriptiors /RAM /CPU 每次搜索的请求,需要从每个分片上获取数据 分片的Meta信息由Master节点维护,过多,会增加管理的负担。经验值,控制分片总数在10w以内
从存储的物理角度看
日志类应用,单个分片不要大于50GB
搜索类应用,单个分片不要超过20GB
为什么要控制分片存储大小
提高Update的性能
Merge时,减少所需的资源
丢失节点后,具备更快的恢复速度/便于分片在集群内Rebalancing
如何确定副本分片数
副本时主分片的拷贝
提高系统可用性:相应查询请求,防止数据丢失
需要占用和主分片一样的资源
对性能的影响
副本会降低数据的索引速度:有几份副本就会有几倍的CPU资源消耗在索引上
会减缓对主分片的查询压力,但是会消耗同样的内存资源
如果机器资源充分,提高副本数,可以提高整体的查询QPS
文档到分片的路由算法
哈希算法 =主分片的总数 做了一个取模的运算 shard = hash(_routing) % bumber_of_primary_shards
shard = hash(_routing) % number_of_primary_shards
- Hash 算法确保文档均匀分散到分片中
- 默认的_routing值是文档id
- 可以自行制定routing数值,例如用相同国家的商品,都分配到指定shard
- 设置index Settings 后,Primary数,不能随意修改的根本原因