路由机制,为什么主分片数量不可变?

document数据路由原理

我们知道ElasticSearch是分片存储的,一个索引(index)的数据会被分到多个分片(shard)共同存储,这样做ES中所有数据均衡的存储在集群中各个节点的分片中,那么我们怎么知道要查的document存储在了哪个分片呢?这个就需要用到ElasticSearch的路由机制。

document数据路由算法

shard = hash(routing) % number_of_primary_shards

number_of_primary_shards是这个索引(index)的分片数量,routing是每次对index的一个document进行增删改查的时候,都会带过来一个routing number,默认就是这个documentd的_id(可能是手动指定,也可以是自动生成),而shard就是该document所在算出的某个分片。

假设_id=1,那么就会将routing=1这个routing值传入一个hash函数中,产生一个routing值的hash值,假设hash(routing)=21,然后将hash函数产生的值对这个index的primary shard的数量求余数,21 % 5 = 1
也就决定了这个document就放在p1上。

注意:此这个计算过程就可以看出,决定一个document在哪个shard上,最重要的值就是routing值,默认是_id,也可以手动指定,相同的routing值,每次过来,从hash函数中生成的hash值一定是相同的。无论最后计算的hash值是多少,对number_of_primary_shards求余数,结果一定在0-number_of_primary_shards之间。

主分片数量不可变

通过上面的分析,特别是路由算法,我们不难知道,在我们最开始创建索引的时候,确定了primary shard的数量,之后根据路由算法,每个document就被路由到了指定的shard上面,之后的各种操作路由规则都是一样的。试想一下,如果我们改变了primary shard的数量,那么路由算法取余的时候值可能就跟之前的不一样了,就会被路由到其它的shard上面去,就会导致数据混乱,本该已经存在的document,可能通过查询根本查不到,某种程度上说这也会造成数据的丢失。

你可能感兴趣的:(路由机制,为什么主分片数量不可变?)