Elasticsearch 和 CAP 定理

Dha*_*Sab 6 distributed-system elasticsearch cap-theorem

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

Var*_*arg 9

答案并不那么简单。这取决于系统的配置方式以及您想要如何使用它。我将尝试详细介绍。

ElasticSearch 中的分区

  1. 每个索引都划分为分片,这意味着每个分片中的数据与其他分片是互斥的。每个分片还有多个 Lucence 索引,这不在本答案的范围内。
  2. 每个分片都可以有一个正在运行的副本(大多数设置都有),并且在发生故障时,可以将副本提升为主服务器。让我们将具有工作并且可从我们的应用程序服务器正在访问的 ES 节点访问的分片称为活动分片。因此,主分片中没有副本且不可访问的分片被视为失败分片。(例如:出现“所有分片失败”的错误意味着该索引中没有可用的主分片)
  3. ES 的一个特点是拥有多个主分片(发散分片)。这不是一个好情况,因为我们失去了读/写一致性。

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

  1. 内容如下

    1. 默认情况下,读取将继续发生在活动的分片上。因此,来自失败分片的数据将从我们的搜索查询中排除。在这种情况下,我们认为该系统是AP。不过,这种情况是暂时的,当集群再次连接时不需要手动同步分片。
    2. 通过将搜索选项allow_partial_search_results[1] 设置为false,我们可以在某些分片失败时强制系统出错,从而保证结果的一致性。在这种情况下,我们认为该系统是CP
    3. 如果我们的应用程序服务器连接到的节点无法访问主节点,系统将完全失败。即使我们说我们的分区容错性已经失败,我们也看到可用性受到了打击。这种情况可以称为只是CCP
    4. 在某些情况下,团队必须以某种方式启动分片,并且可以访问它们不同步的副本。因此他们决定将其设为主要(手动)。请注意,可能存在一些未同步的数据,从而导致分片不同。这就导致了AP的情况。当情况正常化时,一致性将很难恢复(手动同步分片)
    1. 只有当所有分片都失败时,写入才会停止工作。但即使一个分片处于活动状态,写入也会起作用并且保持一致(默认情况下)。这将是CP
    2. 但是,我们可以设置选项index-wait-for-active-shards[2] 以all确保仅当索引中的所有分片都处于活动状态时才会发生写入。我只看到该标志的一点优势,那就是不惜一切代价保持所有分片的平衡。这仍然是CP(但可用性比之前的情况要低)
    3. 与上次读取网络分区的情况一样,如果我们(手动)将未同步的副本作为主副本,则可能会出现一些数据丢失和分片发散的情况。这里的情况将是AP,当情况正常化时,一致性将很难恢复(手动同步分片)

基于上述内容,您可以做出更明智的决定,并根据您的要求调整 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


小智 6

我强烈不同意 Harshit 的观点,Elasticsearch 在可用性方面做出了妥协,因为他还提到,由于分片不可用,很少有请求会返回错误。

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

而且,不存在放弃分区容错性的分布式系统,因为没有PT保证的分布式系统是不可能存在的。