Elasticsearch中的碎片和副本

Luc*_*uke 270 full-text-search elasticsearch

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

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

jav*_*nna 878

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

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

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

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

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|
Run Code Online (Sandbox Code Playgroud)

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

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

 ____    ____    ____ 
| 1  |  | 2  |  | 3  |
|____|  |____|  |____|
Run Code Online (Sandbox Code Playgroud)

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

 ____    ____
| 4  |  | 5  |
|____|  |____|
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4R |  | 5R |
|____|  |____|  |____|  |____|  |____|
Run Code Online (Sandbox Code Playgroud)

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

 ____    ____    ____    ____    ____
| 1R |  | 2R |  | 3R |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|
Run Code Online (Sandbox Code Playgroud)

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

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|
Run Code Online (Sandbox Code Playgroud)

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

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

希望这能为您澄清一些事情.

  • 很棒的解释,感谢你花时间把它拼凑起来!:) (44认同)
  • 到目前为止,这是碎片/复制品概念的最佳解释.非常感谢 :) (4认同)
  • Elasticsearch v7 有更新 https://www.elastic.co/guide/en/elasticsearch/reference/current/release-highlights-7.0.0.html#_default_to_one_shard 从这个版本开始,每个索引将始终有一个分片,并且可以更改设置中的分片数量 (3认同)
  • @javanna 很好的解释,可以谈谈多集群以及它们如何工作吗? (2认同)
  • 我可以建议进一步解释一下,当发生故障的节点再次恢复正常时,会发生什么情况? (2认同)

Vin*_*ino 27

碎片:

  1. 作为分布式搜索服务器,ElasticSearch使用称为Shard跨所有节点分发索引文档的概念 。
  2. 一个index可以潜在地存储大量数据的可以超过一个的硬件限制single node
  3. 例如,占用 1TB 磁盘空间的 10 亿个文档的单个索引可能不适合单个节点的磁盘,或者可能太慢而无法单独处理来自单个节点的搜索请求。
  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 个分片指数。


ppe*_*rcy 20

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

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

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

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

最诚挚的问候,保罗

  • @AlexPryiomka,索引包含数据 (3认同)

jyu*_*jyu 19

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

curl -XPUT 'localhost:9200/_settings' -d '
{
    "index" : {
        "number_of_replicas" : 0
    }
}
'
Run Code Online (Sandbox Code Playgroud)

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

  • 对于多节点集群来说,这是不好的做法。对于 2 个或更多节点,绝不推荐选择。 (3认同)

Kee*_*ary 8

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

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

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

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

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

curl -XPUT 'localhost:9200/sampleindex?pretty' -H 'Content-Type: application/json' -d '
{
  "settings":{
    "number_of_shards":2,
    "number_of_replicas":1
  }
}'
Run Code Online (Sandbox Code Playgroud)


Ahm*_*mad 8

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

Elasticsearch 分片

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

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

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

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

Elasticsearch 分片

pri节目碎片总数。


Hea*_*ren 6

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

碎片

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

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

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

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

复制品

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

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

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


Pru*_*mar 5

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

副本是分片的副本。

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

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


归档时间:

查看次数:

67703 次

最近记录:

6 年,4 月 前