407

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

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

4

10 回答 10

1298

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

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

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

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

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

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

例如,节点 1 将仅保存三个分片:

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

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

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

为什么会这样?因为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

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

于 2013-03-29T15:11:40.830 回答
37

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

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

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

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

于 2013-03-29T05:34:40.057 回答
32

分片:

  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. 分片可以是 aprimary shard或 a replica shard
  9. 索引中的每个文档都属于一个single primary shard,因此您拥有的主分片的数量决定了您的索引可以容纳的最大数据量
  10. Areplica shard只是主分片的副本。

复制品:

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

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

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

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

于 2014-01-14T01:18:13.017 回答
14

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

副本是分片的副本。

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

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

于 2016-04-01T06:07:43.387 回答
12

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

Elasticsearch 分片

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

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

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

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

Elasticsearch 分片

显示pri分片的总数。

于 2020-04-18T21:28:36.187 回答
9

我将使用真实的场景来解释这一点。想象一下,您是一个正在运行的电子商务网站。随着您变得越来越受欢迎,更多的卖家和产品会添加到您的网站。您将意识到您可能需要索引的产品数量已经增加,并且它太大而无法容纳在一个节点的一个硬盘中。即使它适合硬盘,在一台机器中对所有文档执行线性搜索也非常慢。一个节点上的一个索引不会利用 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
  }
}'
于 2018-06-01T10:55:43.903 回答
7

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

碎片

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

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

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

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

复制品

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

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

  • 它在分片/节点失败的情况下提供高可用性。出于这个原因,重要的是要注意,副本分片永远不会与从中复制它的原始/主分片分配在同一节点上。
  • 它允许您扩展搜索量/吞吐量,因为搜索可以在所有副本上并行执行。
于 2019-07-29T08:58:53.043 回答
3

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

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

于 2019-03-23T16:03:15.433 回答
1

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

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

关于多个索引或多个分片的文章 弹性搜索,多个索引与一个索引和不同数据集的类型?

于 2016-02-26T06:51:52.320 回答