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

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

评论

在这里看看:stackoverflow.com/questions/12409438/…

但是问题仍然没有得到解决。

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

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

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

#1 楼

我会尝试用一个真实的例子来解释,因为您得到的答案和答复似乎对您没有帮助。加入现有集群(如果可用)或创建一个新集群。假设您用一个节点(刚启动的一个节点)创建了自己的新集群。我们没有数据,因此我们需要创建索引。

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

这意味着Elasticsearch将创建5个包含您的数据的主碎片:应该由哪个主要分片来保存该文档并在其中建立索引。主碎片不是数据的副本,而是数据!拥有多个分片确实有助于在一台机器上利用并行处理,但是要点是,如果我们在同一集群上启动另一个Elasticsearch实例,这些分片将在集群上均匀分布。则br节点1将仅保留例如三个分片: br />
 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|


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

每个elasticsearch索引都至少包含一个主分片,因为这是数据所在被储存了。但是,每个分片都是有代价的,因此,如果您只有一个节点且没有可预见的增长,则只需坚持使用一个主分片。

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

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


第二个节点相同,它将在第一个节点上包含主分片的副本:

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

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

它们永远不会在其主节点所在的同一节点上分配。这就是为什么您将拥有5个未分配的分片,副本和集群状态为"number_of_replicas":1而不是YELLOW的原因。不会丢失数据,但是由于不能分配某些分片,因此会更好。 。可以加载第二个节点上的现有分片,但它们需要与其他分片同步,因为写操作最有可能在节点关闭时发生。在此操作结束时,群集状态将变为GREEN

希望这对您有所帮助。

评论


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

–LuckyLuke
13年3月29日在17:58

到目前为止,这是对分片/副本概念的最好解释。非常感谢 :)

–弗兰克·福斯特(FrankFörster)
13年5月6日在12:13

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

–拉菲
13年7月2日在20:03

@DoronYaacoby在该句之前有一个if。如果您的数据放在单个碎片中,并且您不打算增长,就属于这种情况。但是您的文档是否适合取决于数据,查询,负载以及性能可接受的范围。也可以看看这篇文章:blog.trifork.com/2013/09/26/maximum-shard-size-in-elasticsearch

– javanna
2013年9月27日在7:59

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

–c0dem4gnetic
13年11月4日在18:31

#2 楼

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

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

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

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

最好的问候,
保罗

评论


这就是每个文档所说的-索引被分解成碎片,但是索引实际上包含什么?

– Alex Pryiomka
17-10-29在18:06

@AlexPryiomka,索引包含数据

–加拉夫
18年7月25日在17:49

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

– Beatrice
20-04-22在10:11

#3 楼

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

评论


对于多节点群集,这是不好的做法。对于2个或更多节点,永远不要推荐使用该选项。

–金娜·巴鲁(Jinna Balu)
20-10-20在16:10

#4 楼

碎片:


作为分布式搜索服务器,ElasticSearch使用名为
Shard的概念在所有节点上分发索引文档。
index可能存储大量数据可能会超出single node的硬件限制

例如,十亿个文档的单个索引占用了1TB的磁盘空间
可能不适合单个磁盘的磁盘节点,或者可能太慢
不能单独满足来自单个节点的搜索请求。
为解决此问题,Elasticsearch提供了将索引细分为shards的功能。
创建索引时,只需定义所需的shards
数。

Documents存储在shards中,并且将碎片分配给
nodes

随着cluster的增长或收缩,cluster将自动
Elasticsearch之间迁移碎片,以使nodes保持平衡。
分片可以是clusterprimary shard
索引中的每个文档都属于replica shard,因此
您拥有的主分片的数量决定了您的最大数据量。索引可以容纳
single primary shard只是主碎片的副本。

副本:




replica shardReplica shard的副本,以防止在硬件故障的情况下丢失数据。

primary Shard允许您将索引的
分片的一个或多个副本复制到所谓的副本分片中,或者short。
Elasticsearch也可以被复制零(表示没有副本)或更多

replicas和副本可以在创建索引的每个索引时定义

创建索引后,您可以随时动态更改副本数,但您事后会自动更改副本数。
默认情况下,为index中的每个索引分配5个主碎片和number of shards,这意味着如果集群中至少有两个节点
,则索引将具有5个主碎片和另外5个
副本碎片(1完整副本),每个
索引总共10个分片。


#5 楼

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

副本是碎片的副本。群集。

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

评论


我有三个AWS ec2实例,每个实例都安装了Elasticsearch。就是说我们这里有三个节点?如果所有这些节点都具有相同的cluster.name:test属性集,是否将对具有三个节点的集群名称进行测试?

–TheCoder
19年7月20日在15:42

#6 楼

不是答案,而是关于ElasticSearch核心概念的另一参考,我认为它们很明显是对@javanna答案的补充。可能超过单个节点的硬件限制。例如,十亿个文档的单个索引占用了1TB的磁盘空间,可能无法容纳在单个节点的磁盘上,或者可能太慢而无法单独满足来自单个节点的搜索请求。 Elasticsearch提供了将索引细分为多个碎片的功能。创建索引时,只需定义所需的分片数量即可。每个分片本身就是一个功能齐全且独立的“索引”,可以托管在群集中的任何节点上。
共享很重要,主要有两个原因:拆分/缩放内容量。
它允许您跨碎片(可能在多个节点上)分布和并行化操作,从而提高性能/吞吐量。


副本副本
在随时可能发生故障的网络/云环境中,非常有用,强烈建议您使用故障转移机制,以防碎片/节点因某种原因脱机或消失。为此,Elasticsearch允许您将索引分片的一个或多个副本制作为所谓的副本分片或简称副本。
复制很重要,主要有两个原因:在分片/节点发生故障时提供高可用性。因此,请务必注意,副本碎片永远不会与从其复制原始/原始碎片的节点分配在同一节点上。
由于您可以进行搜索,因此可以扩展搜索量/吞吐量。在所有副本上并行执行。



#7 楼

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


#8 楼

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

此屏幕快照显示了整个Elasticsearch目录。
您可以看到,所有数据都进入data目录。
通过检查索引C-mAfLltQzuas72iMiIXNw,我们发现它具有五个分片(文件夹04)。文件夹)。

JH_A8PgCRj-GK0GeQ0limw显示分片的总数。

#9 楼

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

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

有关多个索引或多个分片的文章
弹性搜索,多个索引与一个索引以及不同数据集的类型?
/>

#10 楼

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

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