Elasticsearch读写一致性

Vla*_*kin 22 eventual-consistency elasticsearch

Elasticsearch没有"读一致性"参数(如Cassandra).但它具有" 写一致性 "和" 读取偏好 ".

文档说明了关于写一致性的以下内容

写入一致性
为了防止写入发生在网络分区的"错误"端,默认情况下,只有当仲裁(> replicas/2 + 1)活动分片可用时,索引操作才会成功.可以使用action.write_consistency设置逐个节点地覆盖此缺省值.要更改此操作的每个操作,可以使用一致性请求参数.

有效写入一致性值是一个,仲裁和所有.

注意,对于副本数量为1(总共2个数据副本)的情况,如果1个副本(主要副本)可以执行写入,则默认行为是成功的.

索引操作仅在复制组中的所有活动分片已将文档编入索引(同步复制)后才返回.

我的问题是关于最后一段:

索引操作仅在复制组中的所有活动分片已将文档编入索引(同步复制)后才返回.

如果write_consistency=quorum(默认)和所有分片都是活动的(没有节点故障,没有网络分区),那么:
1)一旦分片的法定数量完成索引,索引操作是否会立即返回?(即使所有分片都是活动/活动的)
2)或者当所有实时/活动分片完成索引时,索引操作是否会返回?(即仅在出现故障/超时的情况下才考虑仲裁)

在第一种情况下 - 读取可能是最终一致的(可能会得到陈旧的数据),写入更快.
在第二种情况下 - 读取是一致的(只要没有网络分区),写入速度较慢(因为它等待较慢的分片/节点).

有谁知道它是如何工作的?

我想知道的另一件事 - 为什么' preference'param(在get/search请求中)的默认值是,randomized但是没有 _local(我想这一定是效率更高)

Vla*_*kin 22

我想我现在可以回答我自己的问题:)

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

无论一致性参数如何,当所有实时/活动分片完成索引时,索引操作将返回.如果没有足够的可用分片(节点),一致性参数可能只会阻止操作启动.

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

更新:通过这里的一致性,我不是指ACID一致性,它只是保证在返回请求时更新所有副本.

关于第二个问题:明显的答案是 - 它是randomized分散负荷; 另一方面,客户端可以选择随机节点进行通信,但可能不是100%有效,因为单个请求可能需要多个分片.

  • 回答您自己的问题真是太好了! (2认同)