文档到分片的路由算法:shard=hash(_routing)%numer_of_primary_shards
1.hash算法确保文档均匀散落到分片
2.默认_routing是文档_id,也可以由配置或者请求参数指定
3.numer_of_primary_shards在创建索引时设置,一旦设置不能随意修改,否则会造成索引重建
更新文档流程(新增和删除类似)
1.客户端发起一个更新文档请求到CoordinatingNode,如果请求中包含Ingest预处理,需要转发给Ingest节点
2.CoordinatingNode计算hash后的shard,转发请求给shard所在的DataNode
3.DataNode删除文档(伪删除.del),并根据原文档的_source和请求参数,重新生成新文档并更新version,此处通过version来做乐观锁版本控制,如果修改失败次数超过retry_on_conflict,则直接返回修改失败。
由于Segment的不可变性设计,文档不支持部分修改,必须伪删除后再新增
4.修改成功后,并发同步给所有副本分片,默认同步方式
同步给副本的并非原请求,而是完整的文档,因为多次修改的同步可能会乱序到达副本分片,会造成数据不一致问题,完整文档可通过version版本号来决定保存最新数据。
4.返回响应给CoordinatingNode,再由CoordinatingNode返回响应给Client