新建索引和文档
新建索引和删除请求都是写操作,它们必须在主分片上成功完成才能复制到相关的复制分片上。
主分片和复制分片上成功创建索引和删除一个文档必要的顺序步骤:
1、客户端给node1发送新建索引和删除请求。
2、节点使用文档的_id确定文档属于分片0.它转发请求到node3,分片0位于这 个节点上。
3、node3在主分片上执行请求,如果成功,它转发请求到相应的位于node1和node2的复制节点上。当所有的复制节点报告成功,node3报告成功到请求的节点,请求的节点再报告给客户端。
客户端收到成功响应的时候,文档的修改已经被应用于主分片和所有的复制分片上。你的修改已经成功。
有很多可选的请求参数允许你更改这一过程。你可能想牺牲一些安全来提高性能。
replication
复制的默认值是sync。这将导致主分片得到的复制分片的成功响应后才返回。
如果你设置replication为async,请求在主分片上被执行后就会返回客户端,它依旧会转发请求给复制节点,但你将不知道复制节点成功与否。
上面的这个选项不建议使用。默认的sync复制允许Elasticsearch强制反馈传输。async复制可能会因为在不等待其它分片就绪的情况下发送过多的请求而使Elasticsearch过载。
consistency
默认主分片在尝试写入时需要规定数量(quorum)或过半的分片(可以使主节点或者复制节点)可用。这是防止数据被写入到错误的网络分区。规定数量计算公式如下:
int((primary + number_of_replicas) / 2 ) + 1
consistency允许的值为one(只有一个主分片),all(所有的主分片和复制分片)或者默认的quorum或过半分片。
注意:
number_of_replicas是在索引中的设置,用来定义复制分片的数量,而不是现在活动的数量。如果你定义了索引有3个复制节点,那规定数量是:
int((primary + 3 replicas) / 2 ) + 1 = 3
但如果你只有两个节点,那你的活动分片不够规定的数量,也就不能索引或删除文档。
timeout
当分片副本不足时会怎么样?Elasticsearch会等待更多的分片出现。默认等待一分钟。如果需要,你可以设置timeout参数让它终止的更早:100表示100毫秒,30s表示30秒。
注意:
新索引默认有一个复制分片,这意味着为了满足quorum的要求需要两个活动分片。当然,这个默认设置将阻止我们在单一节点集群中进行操作。为了避开这个问题,规定数量number_of_replicas大于一时才生效。