Elasticsearch读写一致性

时间:2016-07-16 18:50:33

标签: elasticsearch eventual-consistency

Elasticsearch没有"读取一致性"帕拉姆(像卡桑德拉)。 但它有" write consistency"和" read preference"。

文档说明了以下关于Write Consistency

的内容
  

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

     

有效写入一致性值是一个,法定数量和全部。

     

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

     

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

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

  

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

如果write_consistency=quorum(默认)和所有分片都处于活动状态(没有节点故障,没有网络分区),则:
1)索引操作是否在法定人数后立即返回 分片已完成索引? (即使所有分片都是活动/活动的)
2)当所有实时/活动分片完成索引时,索引操作是否会返回? (即仅在出现故障/超时的情况下才考虑法定人数)

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

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

我想知道的另一件事 - 为什么' preference'的默认值。 param(在获取/搜索请求中)是randomized但不是_local(我认为这必须更高效)

2 个答案:

答案 0 :(得分:20)

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

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

  

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

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

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

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

答案 1 :(得分:1)

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

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

读: 仍然可以使用首选项,但它被标记为已弃用。