【问题标题】:Shards and replicas in ElasticsearchElasticsearch 中的分片和副本
【发布时间】:2013-03-19 15:38:20
【问题描述】:

我试图了解 Elasticsearch 中的分片和副本是什么,但我没能理解。如果我下载 Elasticsearch 并运行脚本,那么据我所知,我已经启动了一个具有单个节点的集群。现在这个节点(我的 PC)有 5 个分片(?)和一些副本(?)。

它们是什么,我有 5 个重复的索引吗?如果是,为什么?我可能需要一些解释。

【问题讨论】:

  • 但问题仍未得到解答。
  • 我认为你得到的答案和上面的链接答案应该可以澄清事情。那还有什么不清楚的?
  • 每个索引都可以分割成碎片以便能够分发数据。分片是索引的原子部分,如果添加更多节点,它可以分布在集群中。
  • 您可以将节点视为集群中的一台机器。在集群中可以有多个索引。每个索引都有一定数量的分片,这些分片是索引的一部分。一个节点当然可以拥有更多的分片。对于原子,我的意思是那是被分配的部分,最终根据分片分配算法移动到另一个节点。只有整个分片可以分布在集群上,而不是其中的一部分。如果您有一个带有单个分片的索引,则该分片在给定时间只能位于单个节点上。

标签: elasticsearch full-text-search


【解决方案1】:

我将尝试用一个真实的例子来解释,因为你得到的答案和回复似乎对你没有帮助。

当您下载 elasticsearch 并启动它时,您会创建一个 elasticsearch 节点,该节点会尝试加入现有集群(如果可用)或创建一个新集群。假设您使用单个节点创建了自己的新集群,即您刚刚启动的那个。我们没有数据,因此我们需要创建一个索引。

创建索引时(索引第一个文档时也会自动创建索引),您可以定义它将由多少个分片组成。如果您不指定数字,它将具有默认的分片数:5 个主分片。这是什么意思?

这意味着 elasticsearch 将创建 5 个包含您的数据的主分片:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

每次索引文档时,elasticsearch 都会决定哪个主分片应该保存该文档并将其索引到那里。主分片不是数据的副本,它们是数据!拥有多个分片确实有助于利用单台机器上的并行处理,但重点是,如果我们在同一个集群上启动另一个弹性搜索实例,分片将在集群上以均匀的方式分布。

然后节点 1 将只保存三个分片:

 ____    ____    ____ 
| 1  |  | 2  |  | 3  |
|____|  |____|  |____|

由于剩余的两个分片已经移动到新启动的节点:

 ____    ____
| 4  |  | 5  |
|____|  |____|

为什么会这样?因为elasticsearch是一个分布式搜索引擎,这样你就可以利用多个节点/机器来管理大量数据。

每个 elasticsearch 索引都至少由一个主分片组成,因为这是存储数据的地方。但是,每个分片都是有代价的,因此,如果您只有一个节点并且没有可预见的增长,那么就坚持使用一个主分片。

另一种类型的分片是副本。默认值为 1,这意味着每个主分片将被复制到另一个包含相同数据的分片。副本用于提高搜索性能和故障转移。副本分片永远不会分配在相关主节点所在的同一节点上(这几乎就像将备份放在与原始数据相同的磁盘上)。

回到我们的示例,对于 1 个副本,我们将在每个节点上拥有整个索引,因为将在第一个节点上分配 2 个副本分片,它们将包含与第二个节点上的主分片完全相同的数据:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4R |  | 5R |
|____|  |____|  |____|  |____|  |____|

第二个节点也是如此,它将包含第一个节点上的主分片的副本:

 ____    ____    ____    ____    ____
| 1R |  | 2R |  | 3R |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

通过这样的设置,如果一个节点出现故障,您仍然拥有整个索引。副本分片将自动成为主分片,尽管节点故障,集群仍将正常工作,如下所示:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

由于您拥有"number_of_replicas":1,因此无法再分配副本,因为它们永远不会分配在其主节点所在的同一节点上。这就是为什么您将有 5 个未分配的分片、副本和集群状态将是 YELLOW 而不是 GREEN。不会丢失数据,但可能会更好,因为某些分片无法分配。

一旦离开的节点被备份,它将再次加入集群并重新分配副本。可以加载第二个节点上的现有分片,但它们需要与其他分片同步,因为写入操作很可能发生在节点关闭时。此操作结束时,集群状态将变为GREEN

希望这可以为您澄清事情。

【讨论】:

  • 很棒的解释,感谢您花时间整理! :)
  • 这是迄今为止对分片/副本概念的最佳解释。非常感谢:)
  • @javanna 很好的解释,可以谈谈多集群及其工作原理吗?
  • 我可以建议进一步解释一下当发生故障的节点再次恢复时会发生什么?
  • Elasticsearch v7 有更新 elastic.co/guide/en/elasticsearch/reference/current/… 从这个版本开始,每个索引将始终有一个分片,并且可以在设置中更改分片数量
【解决方案2】:

一个索引被分成碎片以便分布和扩展。

副本是分片的副本,可在节点丢失时提供可靠性。这个数字经常会混淆,因为replica count == 1 意味着集群必须拥有分片的主副本和副本副本才能处于绿色状态。

为了创建副本,您的集群中必须至少有 2 个节点。

您可能会发现这里的定义更容易理解: http://www.elasticsearch.org/guide/reference/glossary/

【讨论】:

  • 这就是每个文档所说的——索引被分成碎片,但索引实际包含什么?
  • @AlexPryiomka,索引包含数据
  • 所以和kafka世界的partition-replication基本一样?
  • @beatrice - 是的,分片(类似于主分片)相当于 Kafka 分区。并且一个副本(replica shard)相当于一个Kafka副本。
【解决方案3】:

分片:

  1. 作为分布式搜索服务器,ElasticSearch 使用名为 Shard 将索引文档分发到所有节点。
  2. index 可能存储大量数据 超出single node 的硬件限制
  3. 例如,十亿个文档的单个索引占用 1TB 磁盘空间可能不适合单个节点的磁盘,也可能太少 仅从单个节点处理搜索请求的速度很慢。
  4. 为解决此问题,Elasticsearch 提供了以下功能: 将您的索引细分为多个称为shards 的部分。
  5. 创建索引时,可以简单定义shards的个数 你想要的。
  6. Documents 存储在shards 中,分片分配给nodes 中 你的cluster
  7. 随着您的cluster 增长或缩小,Elasticsearch 将自动 在nodes 之间迁移分片,使cluster 保持平衡。
  8. 分片可以是primary shardreplica shard
  9. 索引中的每个文档都属于一个single primary shard,所以 您拥有的主分片数量决定了最大值 您的索引可以保存的数据量
  10. replica shard 只是主分片的副本。

副本:

  1. Replica shardprimary Shard的副本,防止数据丢失 硬件故障的情况。
  2. Elasticsearch 允许您制作一份或多份索引的副本 分片成所谓的副本分片,或简称replicas
  3. index 也可以复制零(意味着没有副本)或更多 次。
  4. number of shards 和副本可以在每个索引定义 创建索引的时间。
  5. 创建索引后,您可以随时动态更改副本数,但cannot change the number of shards 事后。
  6. 默认情况下,Elasticsearch 中的每个索引分配 5 个主 Shards 和1 replica 这意味着如果您至少有两个节点 在您的集群中,您的索引将有 5 个主分片和另外 5 个 副本分片(1 个完整副本),每个副本总共 10 个分片 索引。

【讨论】:

    【解决方案4】:

    如果你真的不喜欢看到它是黄色的。您可以将副本数设置为零:

    curl -XPUT 'localhost:9200/_settings' -d '
    {
        "index" : {
            "number_of_replicas" : 0
        }
    }
    '
    

    请注意,您应该只在本地开发盒上执行此操作。

    【讨论】:

    • 这对多节点集群来说是一种不好的做法。绝不是 2 个或更多节点的推荐选项。
    【解决方案5】:

    一个索引被分成碎片以便分布和扩展。

    副本是分片的副本。

    节点是弹性搜索的运行实例,属于集群。

    一个集群由一个或多个共享相同集群名称的节点组成。每个集群都有一个主节点,该主节点由集群自动选择,如果当前主节点发生故障,可以替换该主节点。

    【讨论】:

    • 我有三个AWS ec2 实例,每个实例都安装了elasticsearch。意味着我们这里有三个节点?如果所有这些节点都具有相同的cluster.name: test 属性集,它是否会创建一个集群名称test,它将具有三个节点?
    【解决方案6】:

    简单来说,shard 只不过是存储在磁盘上单独文件夹中的索引的一部分:

    此屏幕截图显示了整个 Elasticsearch 目录。

    如您所见,所有数据都进入data 目录。

    通过检查索引C-mAfLltQzuas72iMiIXNw,我们看到它有五个分片(文件夹04)。

    另一方面,JH_A8PgCRj-GK0GeQ0limw 索引只有一个分片(0 文件夹)。

    pri 显示分片的总数。

    【讨论】:

      【解决方案7】:

      我将使用真实的场景来解释这一点。想象一下,您是一个正在运行的电子商务网站。随着您变得越来越受欢迎,更多的卖家和产品会添加到您的网站。您将意识到您可能需要索引的产品数量已经增加,并且它太大而无法容纳在一个节点的一个硬盘中。即使它适合硬盘,在一台机器中对所有文档执行线性搜索也非常慢。一个节点上的一个索引不会利用 elasticsearch 工作的分布式集群配置。

      因此 elasticsearch 将索引中的文档拆分到集群中的多个节点上。文档的每个拆分都称为一个分片。每个携带文档分片的节点将只有文档的一个子集。假设您有 100 个产品和 5 个分片,每个分片将有 20 个产品。这种数据分片使弹性搜索中的低延迟搜索成为可能。搜索在多个节点上并行进行。结果被汇总并返回。然而,分片不提供容错。这意味着如果包含分片的任何节点关闭,集群运行状况将变为黄色。这意味着某些数据不可用。

      为了增加容错副本,请考虑一下。默认情况下,弹性搜索会为每个分片创建一个副本。这些副本总是在主分片不驻留的其他节点上创建。因此,为了使系统具有容错能力,您可能必须增加集群中的节点数量,这还取决于索引的分片数量。根据副本和分片计算所需节点数的通用公式是“节点数=分片数*(副本数+1)”。标准做法是至少有一个副本以进行容错。

      设置分片数量是一个静态操作,这意味着您必须在创建索引时指定它。之后的任何更改都需要完全重新索引数据,并且需要时间。但是,设置副本数量是一个动态操作,也可以在创建索引后的任何时间完成。

      您可以使用以下命令为您的索引设置分片和副本的数量。

      curl -XPUT 'localhost:9200/sampleindex?pretty' -H 'Content-Type: application/json' -d '
      {
        "settings":{
          "number_of_shards":2,
          "number_of_replicas":1
        }
      }'
      

      【讨论】:

        【解决方案8】:

        不是答案,而是core concepts 对 ElasticSearch 的另一个参考,我认为它们很明显是对@javanna 答案的补充。

        分片

        索引可能存储大量数据,这些数据可能超出单个节点的硬件限制。例如,占用 1TB 磁盘空间的十亿个文档的单个索引可能不适合单个节点的磁盘,或者可能太慢而无法单独处理来自单个节点的搜索请求。

        为了解决这个问题,Elasticsearch 提供了将您的索引细分为多个称为分片的片段的能力。创建索引时,您可以简单地定义所需的分片数量。每个分片本身就是一个功能齐全且独立的“索引”,可以托管在集群中的任何节点上。

        分片之所以重要,主要有两个原因:

        • 它允许您水平拆分/缩放您的内容量。
        • 它允许您跨分片(可能在多个节点上)分布和并行化操作,从而提高性能/吞吐量

        复制品

        在随时可能出现故障的网络/云环境中,如果分片/节点因某种原因脱机或消失,则非常有用且强烈建议使用故障转移机制。为此,Elasticsearch 允许您将索引分片的一个或多个副本制作成所谓的副本分片或简称副本。

        复制之所以重要,主要有两个原因:

        • 它提供高可用性以防分片/节点发生故障。出于这个原因,重要的是要注意,副本分片永远不会分配在与从中复制它的原始/主分片相同的节点上。
        • 它允许您扩展您的搜索量/吞吐量,因为搜索可以在所有副本上并行执行。

        【讨论】:

          【解决方案9】:

          Elasticsearch 具有极好的可扩展性,所有功劳都归功于其分布式架构。由于分片,这成为可能。现在,在进一步讨论之前,让我们考虑一个简单且非常常见的用例。让我们假设,您有一个包含大量文档的索引,为了简单起见,考虑该索引的大小为 1 TB(即,该索引中每个文档的大小总和为 1 TB )。此外,假设您有两个节点,每个节点都有 512 GB 的空间可用于存储数据。可以清楚地看到,我们的整个索引不能存储在可用的两个节点中的任何一个中,因此我们需要在这些节点之间分配索引。

          在这种情况下,索引的大小超过了单个节点的硬件限制,Sharding 会来救援。分片通过将索引分成更小的部分来解决这个问题,这些部分被称为分片。

          【讨论】:

            【解决方案10】:

            在 ElasticSearch 中,我们在顶层将文档编入索引。每个索引都有多个分片,内部分布数据,分片内部存在 Lucene 段,它是数据的核心存储。因此,如果索引有 5 个分片,则意味着数据已分布在分片中,并且分片中不存在相同的数据。

            观看解释 ES 核心的视频 https://www.youtube.com/watch?v=PpX7J-G2PEo

            关于多个索引或多个分片的文章 Elastic search, multiple indexes vs one index and types for different data sets?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-12-22
              • 2016-06-07
              • 2014-04-18
              • 2014-02-22
              相关资源
              最近更新 更多