1.我们能够发送请求给集群中任意一个节点。每个节点都有能力处理任意请求。每个节点都知道任意文档所在的节点
2.新建索引和删除请求都是写操作,它们必须在主分片上成功完成才能赋值到相关的复制分片上
3.在主分片和复制分片上成功新建、索引或删除一个文档必要的顺序步骤:
(1) 客户端给Node1 发送新建、索引或删除请求。
(2) 节点使用文档的_id确定文档属于分片0.转发请求到Node3,分片0位于这个节点上。
(3) Node3在主分片上执行请求,如果成功,它转发请求到相应的位于Node1和Node2的复制节点上。当所有的复制节点报告成功,Node3报告成功到请求的节点,请求的节点再报告给客户端。
(4)客户端接收到成功响应的时候,文档的修改已经被用于主分片和所有的复制分片,修改生效了。
分片的一致性
理解分片-consistency(一致性)
默认主分片在尝试写入时需要规定数量(quorum)或过半的分片(可以是主节点或复制节点)可用。这是防止数据被写入到错的网络分区,规定的数量计算公式如下: int((primary+number_of_replicas)/2)+1 consistency 允许的值为one(只有一个主分片),all(所有主分片和复制分片)或者默认的quorum或过半分片。 注意:number_of_replicas是在索引中的设置,用来定义复制分片的数量,而不是现在活动的复制节点的数量。如果你定义了索引有3个复制节点那规定数量是: int((primary+3 replicas)/2)+1=3 注意:新索引默认有1个复制分片,这意味着为了满足quorum的要求需要两个活动的分片。当然,这个默认设置将阻止我们在单一节点集群中进行操作。为了避开这个问题,规定数量只有在number_of_replicas大于一时才生效。
在主分片或复制分片上检索一个文档步骤
1.客户端给Node1发送get请求 2、节点使用文档对的_id确定文档属于分片0,分片0对应的复制分片在三个节点上都有。此时,它转发请求到Node2 3、Node2返回文档给Node1然后返回给客户端。对于读请求,为了平衡负载,请求节点会为每个请求选择不同的分片---它会循环所有分片副本。可能的情况是:一个被索引的文档已经存在于主分片上却还没来得及同步到复制分片上。这时复制分片会报告文档未找到,主分片会成功返回文档。一旦索引请求成功返回给用户,文档则在主分片和复制分片都是可用的。