【发布时间】:2016-11-19 17:59:38
【问题描述】:
Elasticsearch 没有“读取一致性”参数(如 Cassandra)。 但它有“write consistency”和“read preference”。
文档中关于Write Consistency的内容如下
写入一致性
为了防止写入发生在网络分区的“错误”一侧,默认情况下,索引操作仅在活动分片的仲裁 (>replicas/2+1) 可用时才会成功。可以使用 action.write_consistency 设置逐个节点地覆盖此默认值。要在每个操作中更改此行为,可以使用一致性请求参数。有效的写入一致性值为 one、quorum 和 all。
注意,对于副本数为1(数据一共2个副本)的情况,那么默认行为是如果1个副本(主副本)可以执行写入则成功。
只有在复制组内的所有 活动 分片都已为文档编制索引(同步复制)后,索引操作才会返回。
我的问题是关于最后一段:
只有在复制组内的所有 活动 分片都已为文档编制索引(同步复制)后,索引操作才会返回。
如果write_consistency=quorum(默认)并且所有分片都处于活动状态(没有节点故障,没有网络分区),那么:
1) 索引操作是否会在 quorum 时立即返回
分片已完成索引? (即使所有分片都处于活动状态)
2) 或者当所有活动/活动分片都完成索引时,索引操作是否返回? (即仅在失败/超时的情况下才考虑仲裁)
在第一种情况下 - 读取可能是最终一致的(可能会得到陈旧的数据),写入更快。
在第二种情况下 - 读取是一致的(只要没有网络分区),写入速度较慢(因为它等待较慢的分片/节点)。
有人知道它是如何工作的吗?
我想知道的另一件事是为什么 'preference' 参数的默认值(在获取/搜索请求中)是 randomized 而不是 _local(我想这一定更有效)
【问题讨论】:
标签: elasticsearch eventual-consistency