下面我们罗列在主分片和复制分片上成功新建、索引或删除一个文档必要的顺序步骤:
- 节点使用文档的
_id
确定文档属于分片0
。它转发请求到Node 3
,分片0
位于这个节点上。
客户端接收到成功响应的时候,文档的修改已经被应用于主分片和所有的复制分片。你的修改生效了。
有很多可选的请求参数允许你更改这一过程。你可能想牺牲一些安全来提高性能。这一选项很少使用因为Elasticsearch已经足够快,不过为了内容的完整我们将做一些阐述。
如果你设置replication
为async
,请求在主分片上被执行后就会返回给客户端。它依旧会转发请求给复制节点,但你将不知道复制节点成功与否。
上面的这个选项不建议使用。默认的sync
复制允许Elasticsearch强制反馈传输。async
复制可能会因为在不等待其它分片就绪的情况下发送过多的请求而使Elasticsearch过载。
默认主分片在尝试写入时需要规定数量(quorum)或过半的分片(可以是主节点或复制节点)可用。这是防止数据被写入到错的网络分区。规定的数量计算公式如下:
consistency
允许的值为(只有一个主分片),all
(所有主分片和复制分片)或者默认的quorum
或过半分片。
int( (primary + 3 replicas) / 2 ) + 1 = 3
但如果你只有2个节点,那你的活动分片不够规定数量,也就不能索引或删除任何文档。
当分片副本不足时会怎样?Elasticsearch会等待更多的分片出现。默认等待一分钟。如果需要,你可以设置timeout
参数让它终止的更早:100
表示100毫秒,30s
表示30秒。