有道云笔记:https://note.youdao.com/ynoteshare1/index.html?id=682ce6287c26572497e56cc1967b9ba5&type=note
路由文档到分片
shard = hash(routing) % number_of_primary_shards
routing 值是一个任意字符串,它默认是 _id 但也可以自定义。这个 routing 字符串通过哈
希函数生成一个数字,然后除以主切片的数量得到一个余数(remainder),余数的范围永远
00是 0 到 number_of_primary_shards - 1 ,这个数字就是特定文档所在的分片
与之类似的redis集群则是用crc16配合算法决定数据归属槽,crc16(key)&16383
数据的主从同步
1. 客户端给 Node 1 发送新建、索引或删除请求。
2. 节点使用文档的 _id 确定文档属于分片 0 。它转发请求到 Node 3 ,分片 0 位于这个节
点上。
3. Node 3 在主分片上执行请求,如果成功,它转发请求到相应的位于 Node 1 和 Node 2 的
复制节点上。当所有的复制节点报告成功, Node 3 报告成功到请求的节点,请求的节点
再报告给客户端。
默认replication为sync,同步复制,可以通过修改参数实现一步。不过async 复制
可能会因为在不等待其它分片就绪的情况下发送过多的请求而使Elasticsearch过载。
检索文档
对于读请求,为了平衡负载,请求节点会为每个请求选择不同的分片——它会循环所有分片
副本。
可能的情况是,一个被索引的文档已经存在于主分片上却还没来得及同步到复制分片上。这
时复制分片会报告文档未找到,主分片会成功返回文档。一旦索引请求成功返回给用户,文
档则在主分片和复制分片都是可用的
自带负载均衡,平衡检索。不过在复制分片同步数据之前会返回未找到。