分片配置
在创建索引时,如果不指定分片配置,则默认主分片1,副本分片1。
在创建索引时,可以通过settings设置分片
如下所示,是设置三个主分片,一个主分片有一个副分片,因此该索引一共拥有6个分片
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
分片与自平衡:当节点挂掉后,挂掉的节点分片会自平衡到其他节点中
如上设置分片后,如果其中的一个节点挂掉过后,余下的两个节点会被es自动再进行分配:
如三个节点分配好了,此时一个节点有两个分片,当其中一个节点挂掉后,剩下的两个节点会将被es分配,各自拥有3个分片
在Elasticsearch中,每个查询在每个分片的单个线程中执行,但是,可以并行处理多个分片。
分片数量一旦确定好,不能修改
。
索引分片推荐配置方案
:
每个分片推荐大小10-30GB
分片数量推荐=节点数量*1~3倍
如:比如有1000GB数据,应该有多少个分片?多少个节点?
给每一个分片分片25G的大小,分为40个分片,按两倍计算,所以想要20个节点
路由原理
路由:文档存入对应的分片,ES计算分片编号的过程,称为路由。
Elasticsearch是怎么知道一个文档应该存放到哪个分片中呢?查询时,根据文档id查询文档, Elasticsearch又该去哪个分片中查询数据呢?
路由算法: shard_index = hash(id)% number_of_primary_shards
分片对应的索引 = 将文档id通过hash算法得到一个数字的值 模于 主分片的数量
举例说明(存):
如下图所示:有三个节点构成了一个集群,去主分片分别为P1、P2、P3,副分片为R1、R2、R3;
有一个文档id是5,那么这个文档通过hash算法算出数字为17,于主分片的数目3进行取模,得到2,所以该文档会被存储到节点3中,同时该文档会复制一份存到节点2中的副分片R2中
举例说明(取)