Elasticsearch 和 CAP 定理

Elasticsearch and CAP Theorem

Elasticsearch 是一个分布式系统。根据 CAP 定理,它可以满足 3 个属性中的任意 2 个。 Elasticsearch 中的哪一个遭到破坏?

CAP 定理指出分布式系统最多可以有以下两个:

  1. 一致性。
  2. 可用性。
  3. 分区容差。

Elasticsearch 放弃 “分区容错”

原因:意思是如果创建节点失败,集群健康度会变成红色,不会继续对新创建的索引进行操作。

它将不会放弃“可用性”,因为每个 Elasticsearch 查询都将从集群返回响应 true(结果)/false(错误).

它也不会放弃“一致性”。如果它放弃了一致性,那么将不会有任何文档版本控制和索引恢复。

您在这里阅读更多内容:https://discuss.elastic.co/t/elasticsearch-and-the-cap-theorem/15102/8

我强烈反对 Harshit,Elasticsearch 在可用性方面的妥协,因为他还提到由于分片不可用,很少有请求返回错误。

ES 保证一致性——因为数据 read/write 总是一致的。保证 ES 保证分区容错性——如果任何节点被分区,一段时间后重新加入集群,它能够将丢失的数据恢复到当前状态。

而且,没有放弃Partition Tolerance的分布式系统,因为没有PT分布式系统的保证就不可能存在。

答案并不那么简单。这取决于系统的配置方式以及您希望如何使用它。我会尽量深入细节。

ElasticSearch 中的分区

  1. 每个索引都分区为分片,这意味着每个分片中的数据与其他分片互斥。每个分片还有多个Lucence索引,不在本回答范围内。
  2. 每个分片都可以有一个副本 运行(大多数设置都有),如果发生故障,副本可以提升为主副本。让我们调用一个具有 primary 工作并且可以从我们的应用程序服务器作为 Active shard 命中的 ES 节点访问的分片。因此,主分片中 没有副本 且无法访问的分片被视为 失败分片 。 (例如:“所有分片都失败”的错误意味着该索引中没有可用的主节点)
  3. ES 具有多个主节点的功能(发散分片)。这不是一个好情况,因为我们失去了 read/write 一致性。

如果发生网络分区,将会发生什么:

  1. 读取

    1. 默认情况下,读取将继续发生在活动的分片上。因此,来自失败分片的数据将被排除在我们的搜索查询之外。在这种情况下,我们认为系统是 AP。但是,这种情况是暂时的,当集群再次连接时不需要手动同步分片。
    2. 通过将搜索选项 allow_partial_search_results [1] 设置为 false,我们可以强制系统在某些分片失败时出错,从而保证一致的结果。在这种情况下,我们认为系统是 CP.
    3. 如果我们的应用程序服务器连接到的节点无法访问主节点,系统将完全失败。即使我们说我们的分区容错失败了,我们也会看到可用性受到了影响。这种情况可以称为 C 或者 CP
    4. 在某些情况下,团队必须以任何方式调出分片,并且他们的不同步副本是可访问的。所以他们决定将其设为主要(手动)。请注意,可能会有一些未同步的数据导致不同的分片。这导致 AP 情况。当情况正常化时,一致性将很难恢复(手动同步分片)
  2. 写入

    1. 只有当所有分片都失败时,写入才会停止。但即使一个分片处于活动状态,写入也会起作用并且是一致的(默认情况下)。这将是 CP
    2. 但是,我们可以将选项 index-wait-for-active-shards [2] 设置为 all 以确保写入仅在索引中的所有分片都处于活动状态时发生。我只看到标志的一点优势,那就是不惜一切代价保持所有分片的平衡。这仍然是 CP(但可用性低于前一种情况)
    3. 就像上次读取网络分区的情况一样,如果我们将未同步的副本作为主要副本(手动),可能会有一些数据丢失和不同的分片。这里的情况将是 AP,当情况恢复正常时(手动同步分片)
    4. ,一致性将很难恢复

基于以上所述,您可以做出更明智的决定并根据您的要求调整 ElasticSearch。

参考文献:

  1. https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html
  2. https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html#index-wait-for-active-shards