Elasticsearch中的碎片和副本

时间:2013-03-29 00:55:01

标签: elasticsearch full-text-search

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

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

10 个答案:

答案 0 :(得分:818)

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

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

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

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

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

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

然后,

节点1将仅保留三个分片:

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

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

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

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

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

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

回到我们的示例,使用1个副本,我们将在每个节点上拥有整个索引,因为将在第一个节点上分配3个副本分片,它们将包含与第二个节点上的原色完全相同的数据: / p>

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

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

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

使用这样的设置,如果节点出现故障,您仍然拥有整个索引。副本分片将自动成为主分片,并且群集将在节点发生故障时正常工作,如下所示:

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

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

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

希望这能为你澄清事情。

答案 1 :(得分:19)

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

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

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

答案 2 :(得分:18)

将索引分解为碎片以便分发它们并进行缩放。

副本是分片的副本,并在节点丢失时提供可靠性。此数字通常存在混淆,因为副本计数== 1表示群集必须具有可用于处于绿色状态的主分片和分片的复制副本。

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

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

最诚挚的问候, 保罗

答案 3 :(得分:4)

索引被分解为碎片以便分发它们并进行缩放。

副本是分片的副本。

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

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

答案 4 :(得分:3)

<强>碎片:

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

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

答案 5 :(得分:3)

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

Elasticsearch shards

此屏幕快照显示了整个Elasticsearch目录。

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

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

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

Elasticsearch shards

pri显示分片的总数。

答案 6 :(得分:2)

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

碎片

  

索引可能存储大量数据,这些数据可能超过单个节点的硬件限制。例如,十亿个文档的单个索引占用了1TB的磁盘空间,可能无法容纳在单个节点的磁盘上,或者可能太慢而无法单独满足来自单个节点的搜索请求。

     

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

     

共享很重要,主要有两个原因:

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

Replicas

  

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

     

复制很重要,主要有两个原因:

     
      
  • 它在分片/节点发生故障时提供高可用性。因此,重要的是要注意,副本分片永远不会与从其复制原始/主分片的同一节点上分配。
  •   
  • 由于可以在所有副本上并行执行搜索,因此可以扩展搜索量
  •   

答案 7 :(得分:1)

在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?

答案 8 :(得分:0)

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

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

增加容错复制品进入图片。通过deault elastic search创建每个分片的单个副本。始终在主分片未驻留的其他节点上创建这些副本。因此,要使系统容错,您可能必须增加群集中的节点数量,并且还取决于索引的分片数量。计算基于副本和分片所需节点数的通用公式是&#34;节点数=分片数*(副本数+ 1)&#34;。标准做法是至少有一个副本用于容错。

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

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

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

答案 9 :(得分:0)

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

在这种情况下,如果索引的大小超过单个节点的硬件限制,则可以使用Sharding。分片通过将索引分成较小的碎片来解决此问题,这些碎片称为碎片。

相关问题