Elasticsearch 读写一致性

28
Elasticsearch没有像Cassandra一样的“读一致性”参数。但它有“写一致性”和“读偏好”。关于写一致性,文档中说明如下: 写入一致性
为了防止在网络分区的“错误”一侧进行写入,索引操作默认情况下仅在存在大多数(>副本数/2+1)活动分片时才成功。可以使用action.write_consistency设置在节点级别上覆盖此默认值。要针对每个操作更改此行为,则可以使用一致性请求参数。
有效的写入一致性值为一个、法定人数和所有。
请注意,对于副本数为1(数据总共有2个副本)的情况,默认行为是如果1个副本(主副本)可以执行写入,则成功。
索引操作仅在复制组内所有活动分片都索引了文档(同步复制)后才返回。
如果write_consistency=quorum(默认)且所有分片都处于活动状态(无节点故障,无网络分区),则:
1)索引操作是否会在大多数分片完成索引后立即返回?(尽管所有分片都是活动的)
2)还是索引操作会在所有活动分片完成索引后返回?(即只有在出现故障/超时的情况下才考虑大多数)

在第一种情况下 - 读取可能是最终一致的(可能获取过时数据),写入更快。
在第二种情况下 - 读取是一致的(只要没有网络分区),写入较慢(因为它等待较慢的分片/节点)。

有人知道它是如何工作的吗?

我想知道的另一件事是 - 为什么get/search请求中'preference'参数的默认值是randomized而不是_local(我认为后者可能更有效率)

3个回答

33

我现在认为我可以回答自己的问题了 :)

关于第一个问题,通过反复阅读文档(这个这个)几次 :) 我意识到这个陈述应该是正确的:

索引操作返回当所有活动分片都完成索引时,无论一致性参数如何。一致性参数只有在没有足够可用的分片(节点)时才能防止操作开始。

例如,如果有3个分片(一个主分片和两个副本),并且所有分片都可用 - 操作将等待所有3个(考虑到所有3个都是活动/可用的),无论一致性参数(即使consistency=one
这使得系统保持一致(至少是文档API部分); 除非存在网络分区。 但是,我还没有机会测试它。

更新:在这里的一致性,我不是指ACID-一致性,而是指请求返回时所有副本都已更新的保证。

关于第二个问题: 显而易见的答案是 - 它是随机化以分担负载; 另一方面,客户端可以选择一个随机节点进行交谈,但可能不是100%有效,因为单个请求可能需要多个分片。


2
做得好!解决了自己的问题! - animageofmine

2

1
似乎我来晚了,但这里是另一个 文档 的来源。

索引、更新、删除和批量 API 支持设置刷新以控制此请求所做更改何时对搜索可见。以下是允许的值:

因此,如果我们想实现“写后读一致性”,我们选择在索引更新操作中使用 refresh=truerefresh=wait_for 参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接