Elasticsearch中的分片和副本


303

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

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



但是问题仍然没有得到答案。
LuckyLuke

我认为您得到的答案和上面链接的答案应该使事情变得清晰。那还不清楚吗?
javanna

我不了解什么是碎片和副本。我不明白为什么一个节点上有许多分片和副本。
LuckyLuke

1
每个索引都可以拆分为碎片,以便能够分发数据。分片是索引的原子部分,如果添加更多节点,则可以在整个群集中分布。
javanna

Answers:


965

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

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

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

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

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

每次您为文档建立索引时,elasticsearch都会决定应该使用哪个主碎片来保存该文档并将其在那里索引。主分片不是数据的副本,而是数据!拥有多个分片确实有助于在一台机器上利用并行处理,但是要点是,如果我们在同一集群上启动另一个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个未分配的分片,副本和集群状态YELLOWGREEN。没有数据丢失,但是由于不能分配某些分片,因此可能会更好。

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

希望这可以为您澄清一切。


57
很棒的解释,谢谢您抽出宝贵的时间来整理!:)
LuckyLuke

6
到目前为止,这是对分片/副本概念的最好解释。非常感谢:)
弗兰克·福斯特(FrankFörster)

1
@javanna很棒的解释,可以谈谈多集群及其工作原理吗?
拉菲安

3
我是否可以建议进一步解释,当发生故障的节点再次恢复正常时,会发生什么情况?
c0dem4gnetic

1
你教书吗 因为你完全应该。你摇滚 但是正如@Animesh Pandey所问的那样,我也很好奇知道两个副本或一个具有3个节点的副本会发生什么。
frostymarvelous 2015年

24

索引被分解成碎片以进行分配和扩展。

副本是碎片的副本,如果节点丢失,副本将提供可靠性。由于副本数== 1意味着群集必须具有可用于绿色状态的分片的主副本和复制副本,因此该数字通常会造成混乱。

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

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

最好的问候,保罗


这就是每个文档所说的-索引被分解成碎片,但是索引实际上包含什么?
亚历克斯·普里亚姆卡

@AlexPryiomka,索引包含数据
Gaurav

因此,它与kafka世界中的分区复制基本相同吗?
Beatrice

19

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

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

请注意,您只能在本地开发箱中执行此操作。


10

碎片:

  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. A replica shard只是主碎片的副本。

复制品:

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

6

索引被分解成碎片以进行分配和扩展。

副本是分片的副本。

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

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


我有三个AWS ec2实例,每个实例上都安装了elasticsearch。就是说我们这里有三个节点?如果所有这些节点都具有相同的cluster.name: test属性集,它是否将形成一个test具有三个节点的群集名称?
TheCoder

5

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

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

为了提高容错能力,副本中出现了副本。通过deault弹性搜索,为每个分片创建单个副本。这些副本始终在不存在主分片的其他节点上创建。因此,要使系统具有容错能力,您可能必须增加集群中的节点数量,并且这还取决于索引的分片数量。基于副本和分片计算所需节点数的通用公式为“节点数=分片数*(副本数+ 1)”。标准做法是至少具有一个副本以实现容错。

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

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

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

3

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

碎片

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

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

分片很重要,主要有两个原因:

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

复制品

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

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

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

1

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

请留意说明ES核心的视频 https://www.youtube.com/watch?v=PpX7J-G2PEo

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


1

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

在像这样的,其中的索引的大小超过单个节点的硬件限制的情况下,分片来救援。分片通过将索引分成较小的碎片来解决此问题,这些碎片称为碎片。


0

用最简单的话来说,shard仅仅是存储在磁盘上一个单独文件夹中的索引的一部分:

Elasticsearch分片

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

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

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

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

Elasticsearch分片

pri意见碎片总数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.