【问题标题】:Elasticsearch read and write consistencyElasticsearch 读写一致性
【发布时间】: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


    【解决方案1】:

    写: 我不确定以上是否适用于 ES 6.1 https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html#index-wait-for-active-shards 表示如果主分片处于活动状态并且可以更改为其他值,则索引操作返回。

    搜索是随机的,因此将等待活动分片字段设置为所有将确保在所有分片上执行写入成功。

    阅读: 偏好仍然可以使用,但它被标记为已弃用。

    【讨论】:

      【解决方案2】:

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

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

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

      例如,如果有 3 个分片(一个主分片和两个副本),并且所有分片都可用 - 操作将等待 all 3(考虑到所有 3 个都处于活动状态/可用),无论一致性参数如何(即使consistency=one
      这使得系统保持一致(至少是 document-api 部分);除非有网络分区。 但是,我还没有机会对此进行测试。

      更新:这里所说的一致性,并不是指 ACID-consistency,它只是保证在请求返回的那一刻所有副本都被更新。

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

      【讨论】:

      • 很好地回答了您自己的问题!
      猜你喜欢
      • 2015-06-04
      • 1970-01-01
      • 2018-06-25
      • 2016-06-14
      • 2014-11-15
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多