当前位置: 首页 > article >正文

Elasticsearch 中,分片(Shards)数量上限?副本的数量?

概念

ElasticSearch高可用集群架构实战

在这里插入图片描述

在这里插入图片描述

分片数量

在 Elasticsearch 中,分片(Shards)是数据存储和索引的基本单位。创建分片时需要考虑多个因素,包括集群的配置、硬件资源(如磁盘空间、内存等)以及性能要求。

Elasticsearch 并没有一个硬性限制来限制单个索引的分片数量,但有一些建议和最佳实践需要遵循,避免过多分片对集群性能产生负面影响。

1. 默认分片数量

在 Elasticsearch 中,每个索引默认会被创建为 5 个主分片(Primary Shards),这个值在创建索引时可以配置。

  • 默认情况下,每个索引有 5 个主分片。
  • 可以通过 number_of_shards 设置来修改默认分片数。
PUT /my-index-000001
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  }
}

2. 分片数的限制

虽然 Elasticsearch 没有明确的最大分片数限制,但以下是一些影响分片数和集群性能的因素:

  • 每个节点的分片限制:Elasticsearch 集群会限制每个节点上可以容纳的最大分片数。每个节点上有太多分片会导致性能问题,因为每个分片都需要内存、CPU 和磁盘空间来进行管理和操作。

  • 内存和硬盘限制:每个分片都消耗一定的内存和磁盘空间。过多的分片会导致资源耗尽,进而影响集群的稳定性和性能。

  • 文件句柄限制:每个分片在操作系统中都会占用文件句柄,如果分片数过多,操作系统的文件句柄数量可能会达到限制,导致 Elasticsearch 无法继续创建分片。

3. 过多分片的影响

如果一个索引的分片数量过多,会带来以下负面影响:

  • 内存压力:每个分片都会消耗一部分内存。分片数过多会导致 JVM 堆内存不足,可能会引发 GC(垃圾回收)压力,从而影响集群的性能。

  • 磁盘碎片:每个分片都有一个固定的文件系统开销,太多的分片会导致磁盘碎片化,降低磁盘的使用效率。

  • 文件句柄限制:每个分片都可能会使用多个文件,操作系统的文件句柄数量是有限的,太多分片可能会触及系统文件句柄限制。

  • 集群管理复杂度:分片过多会增加集群的管理和协调成本。例如,节点间的数据重新分配、集群状态更新和查询都需要更多的资源。

4. 分片数量最佳实践

为了避免上述问题,以下是一些最佳实践来管理分片数量:

  • 合理设置每个索引的分片数:根据数据量、预期的查询负载和硬件资源合理设置分片数量。通常,每个分片的大小应该在 10GB 到 50GB 之间。如果数据量过大,可以考虑使用多个索引而不是一个大索引。

  • 使用索引生命周期管理(ILM):Elasticsearch 提供了索引生命周期管理(ILM)功能,可以帮助自动调整索引的分片数和复制数,适应数据增长和查询模式变化。

  • 使用跨多个节点的分片设计:根据集群节点数和硬件资源,将分片分配到不同的节点上,确保数据均匀分布,避免某些节点过载。

  • 避免过多小分片:过多的小分片会导致管理和查询开销增加。尽量避免创建大量小的索引和分片。可以通过设置合理的分片数和数据量来避免过多的小分片。

5. 分片数量的调优

在创建索引时,你可以根据数据量来调整分片的数量。以下是一些常见的策略:

  • 小数据量:如果每个索引的数据量较小,可以使用较少的分片,例如 12 个主分片。

  • 大数据量:如果数据量较大,可以使用更多的分片。为了确保性能,通常每个分片的大小最好保持在 10GB 到 50GB 之间。

  • 动态索引创建:对于动态索引(例如时间序列数据),可以使用模板来控制分片的数量。可以使用 Elasticserach 的索引模板(Index Templates)来设置默认的分片数。

6. 查询性能和分片

查询性能也受分片数量的影响。过多的分片可能会导致查询时产生更多的协调工作,增加延迟。因此,分片数量需要与查询需求、节点数量以及数据量相匹配。

7. 如何查看当前集群的分片情况

可以使用 _cat/shards API 查看当前集群中所有索引的分片分布情况:

curl -X GET "localhost:9200/_cat/shards?v"

这会列出每个索引的分片、主分片和副本分片的分布情况,帮助你了解当前集群中分片的实际数量和状态。

总结

虽然 Elasticsearch 没有一个硬性限制分片数量的上限,但过多的分片会影响集群的性能和稳定性。合理设置每个索引的分片数量,避免创建过多小分片,确保分片大小和集群规模匹配,是保证集群高效运行的关键。

副本数量

上限

在 Elasticsearch 中,副本数量number_of_replicas)并没有明确的硬性上限,但有一些与资源、性能和集群规模相关的实际限制。以下是影响副本数量上限的一些因素:

1. 硬件和资源限制

副本数量增加会导致更多的存储空间和计算资源需求。每增加一个副本,Elasticsearch 就会为每个分片创建一个副本分片,这会占用额外的磁盘空间。由于副本分片是数据的完整副本,因此集群的存储能力会直接影响你可以配置的副本数量。

  • 磁盘空间:每增加一个副本,集群的存储需求就会翻倍。因此,集群的存储容量是副本数量的一个主要限制因素。
  • 网络带宽:更多的副本可能导致更多的网络流量,特别是在分片重新分配或集群健康恢复期间。

2. 性能和负载

副本分片不仅占用存储空间,还会影响集群的性能:

  • 查询性能:增加副本数量有助于提高查询性能,因为查询可以并行地在多个副本分片上执行。但如果副本数量过多,可能会对系统造成额外的负载,特别是在查询负载较高的情况下。
  • 写入性能:增加副本数量会影响写入操作的性能,因为每次写入数据都需要同步到所有副本分片。随着副本数量的增加,写入延迟可能会增加。

3. 集群节点数量

副本的数量与集群中可用的节点数量密切相关。如果副本数量过多,而集群节点数不足以容纳这些副本分片,就会导致分片分配失败或集群健康状况变差。

例如:

  • 每个主分片都会有 number_of_replicas 个副本。每个副本分片都会被分配到集群中的节点上。如果副本数量过多,而可用节点数不足,那么副本分片可能无法分配,从而导致集群处于 yellowred 状态。

4. Elasticsearch 内部限制

虽然没有明确的副本数量上限,Elasticsearch 仍然存在一些关于资源分配和性能的限制。随着副本数量的增加,集群的管理复杂度和性能瓶颈可能会变得更加明显。

5. 理想副本数

对于大多数情况,建议副本数量设置为 1 或 2。通常情况下:

  • 副本数量为 1:提供一个冗余副本,确保数据的可靠性,在一个节点故障时不会丢失数据。
  • 副本数量为 2:提供更高的冗余,适用于关键业务场景。

增加副本数量超过 2 并不一定会带来显著的性能提升,尤其是在集群规模较大时,可能会导致过度的资源消耗。

6. 实际部署中副本数量的建议

  • 副本数量为 0:适用于开发或测试环境,或者如果数据没有严格的可靠性要求。
  • 副本数量为 1:适用于大多数生产环境,提供适度的可靠性和性能。
  • 副本数量为 2 或更高:适用于高可用性要求较高的环境,但需确保集群有足够的资源来处理增加的副本分片。

总结

  • 副本数量没有明确的最大限制,但实际可配置的副本数量取决于集群的存储容量、计算资源、节点数量、性能需求和写入/读取负载等因素。
  • 增加副本数量会提高数据冗余性和查询性能,但会增加存储需求和对集群资源的消耗,因此应根据实际需求合理配置副本数量。

副本数量修改

在 Elasticsearch 中,修改索引副本的数量会影响集群的分片分配和重新平衡。副本是原始数据分片的复制品,增加副本数量会提高数据的可靠性和读取性能,但也会增加存储需求。减少副本数量可以节省存储,但会影响数据的冗余和容错能力。

要修改索引的副本数量并触发分片的重新平衡,通常有以下步骤:

1. 查看当前索引的副本数量

首先,你可以使用以下命令查看当前索引的副本数量:

curl -X GET "localhost:9200/_settings?pretty"

该命令将返回当前所有索引的设置,其中包括副本数量。你可以查看返回的 JSON 数据中的 number_of_replicas 配置。

例如:

{
  "my_index": {
    "settings": {
      "index": {
        "number_of_replicas": "1",  # 这是副本数量
        "number_of_shards": "5"
      }
    }
  }
}

2. 修改副本数量

要修改副本数量,可以使用 PUT 请求更新索引的设置。假设你要将索引 my_index 的副本数从 1 修改为 2,可以执行以下命令:

curl -X PUT "localhost:9200/my_index/_settings" -H 'Content-Type: application/json' -d '{
  "settings": {
    "index": {
      "number_of_replicas": 2
    }
  }
}'

如果你想将副本数减少为 0,执行如下命令:

curl -X PUT "localhost:9200/my_index/_settings" -H 'Content-Type: application/json' -d '{
  "settings": {
    "index": {
      "number_of_replicas": 0
    }
  }
}'

3. 分片重新平衡

修改副本数量后,Elasticsearch 会开始执行分片的重新分配和重新平衡。这意味着 Elasticsearch 将尝试将副本分片分配到不同的节点上,以满足新的副本数量要求。你可以查看集群的健康状态,以观察分片是否已成功分配并且集群是否平衡。

查看集群的健康状态:

curl -X GET "localhost:9200/_cluster/health?pretty"

集群的健康状态可以是:

  • green:所有分片(包括副本分片)都已分配,并且集群健康。
  • yellow:副本分片未完全分配,集群可用,但有冗余副本缺失。
  • red:主分片未分配,集群不可用。

4. 查看分片分配

为了确认分片是否已平衡并且副本分片被正确分配,你可以使用以下命令查看分片的详细状态:

curl -X GET "localhost:9200/_cat/shards?v"

该命令将返回当前所有索引的分片分配信息,你可以查看副本分片是否已被分配到不同的节点上。

5. 集群重新平衡

如果你发现集群在修改副本数量后没有自动平衡,可以手动触发分片的重新平衡。可以使用以下命令来执行集群的重新分配:

curl -X POST "localhost:9200/_cluster/reroute?pretty"

如果需要特定的分配策略或规则,可以在 reroute 请求中指定。

总结

  • 你可以通过修改索引的设置来调整副本数量,使用 PUT 请求来更新 number_of_replicas
  • 修改副本数量后,Elasticsearch 会自动重新平衡分片,确保副本分片按照新的设置分配。
  • 使用 _cluster/health_cat/shards API 来监控集群的健康状态和分片分配情况。
  • 如果集群没有自动重新平衡,你可以手动触发重新分配分片。

修改副本数量时,确保集群有足够的节点和资源来容纳新的副本分片,以避免出现 yellowred 健康状态。
在这里插入图片描述
在这里插入图片描述


http://www.kler.cn/a/513380.html

相关文章:

  • 分布式多卡训练(DDP)踩坑
  • 第12章:Python TDD完善货币加法运算(一)
  • 人工智能领域单词:英文解释
  • Ubuntu22.04安装paddle GPU版本
  • Scade 表达式 - 迭代器
  • 【神经网络基础】
  • PPT大纲:如何用python实现gitlab和jira的集成
  • 芝士AI(paperzz):最新AI论文、AI降重、AI降重工具,解决论文写作低效和AI率
  • axios的使用总结
  • Python的泛型(Generic)与协变(Covariant)
  • 总结研究ChatGPT提示词分享
  • 【人工智能】Python常用库-Keras:高阶深度学习 API
  • LabVIEW智能胎压监测
  • ARM-V9 CCA/RME QEMU环境搭建
  • 【leetcode 26】28.找出字符串中第一个匹配项的下标 | 实现 strStr()==❗不会❗==
  • Java数据结构——优先队列
  • 2025牛客寒假训练营1【代码】 A B D E G H J M
  • 线性回归笔记1-4
  • java依赖问题
  • VBA语言的区块链
  • 人工智能技术在冷链物流行业的应用前景
  • Java Web开发高级——单元测试与集成测试
  • Yearning开源MySQL SQL审核平台
  • 稳定的通信桥梁,CCLINKIE转ModbusTCP网关实现AGV运输的光速效应
  • 基于Python的多元医疗知识图谱构建与应用研究(上)
  • 基于Hadoop MapReduce的WordCount任务实现与部署