上图 代表的含义 :
三个大长方形,分别代表 每一个 Elasticsearch 节点。绿色代表分片,紫色代表副本,也就是说,每一个节点有一个分片和两个副本
注意,不是一个索引为一个分片,而是一个索引的数据量庞大时,将1个索引分成多份,每一份称之为分片。
假设有个数据,数据名称叫zhangsan,有三个节点,一个索引,且这一个索引有三个分片。但你知道zhangsan这条数据在哪个分片中么?
这只能用路由计算来计算,这条数据在哪个分片
routing 是一个可变值,默认是文档的 _id ,也可以设置成一个自定义的值。 routing 通过 hash 函数生成一个数字,然后这个数字再除以 number_of_primary_shards (主分片的数量)后得到余数 。这个分布在 0 到 number_of_primary_shards-1 之间的余数,就是我们所寻求的文档所在分片的位置。
这就解释了为什么我们要在创建索引的时候就确定好主分片的数量 并且永远不会改变这个数量:因为如果数量变化了,那么所有之前路由的值都会无效,文档也再也找不到了。
所有的文档 API( get 、 index 、 delete 、 bulk 、 update 以及 mget )都接受一个叫做 routing 的路由参数 ,通过这个参数我们可以自定义文档到分片的映射。一个自定义的路由参数可以用来确保所有相关的文档——例如所有属于同一个用户的文档——都被存储到同一个分片中。