关于ES分片设置的6个建议

ElasticSearch并没有对分片数量和大小做硬性限制,但分片的设置对ES后期的顺畅使用又至关重要,那么最常见的2个问题:

纯干货

  • “我应该设置多少个分片?答:最大20个分片/GB内存”
  • “我应该设置多大的分片?答:小于50GB,但最好大于1GB。”

分片是 Elasticsearch 在集群内分发数据的单位。Elasticsearch 在对数据进行再平衡(例如发生故障后)时移动分片的速度取决于分片的大小和数量,以及网络和磁盘性能。

分片背后的机制:

  1. 数据写到分片上之后,会定期发布到磁盘上不可更改的新 Lucene 段中,此时,数据便可用于查询了。这称为刷新。
  2. 随着段数越来越多,这些段会定期合并为更大的段。这一过程称为合并。合并是一项极其耗费资源的任务,尤其耗费磁盘 I/O。
  3. 已删除文档仍将继续占用磁盘空间和系统资源,直至将它们合并,而合并过程也会消耗大量系统资源。

Tips 1:避免分片过大,因为这样会对集群从故障中恢复造成不利影响。尽管并没有关于分片大小的固定限值,但是人们通常将 50GB 作为分片上限,而且这一限值在各种用例中都已得到验证。

Tips 2: 但凡可能,尽量使用时序型索引来管理数据保留期。根据保留期限对数据分组,将它们存储到索引中。通过时序型索引,用户还能随着时间推移轻松调整主分片和副本分片的数量,这是因为用户可针对要生成的下个索引进行这方面的更改。这样便能简化对不断变化的数据量和数据要求的适应过程。

从集群角度来说,索引和分片都不是免费的,因为每个索引和分片都会产生一定的资源开销。

Tips 3: 分片过小会导致段过小,进而致使开销增加。您要尽量将分片的平均大小控制在至少几 GB 到几十 GB 之间。对时序型数据用例而言,分片大小通常介于 20GB 至 40GB 之间。

Tips 4: 由于单个分片的开销取决于段数量和段大小,所以通过forcemerge操作强制将较小的段合并为较大的段能够减少开销并改善查询性能。理想状况下,应当在索引内再无数据写入时完成此操作。请注意:这是一个极其耗费资源的操作,所以应该在非高峰时段进行。

Tips 5: 每个节点上可以存储的分片数量与可用的堆内存大小成正比关系,但是 Elasticsearch 并未强制规定固定限值。这里有一个很好的经验法则:确保对于节点上已配置的每个 GB,将分片数量保持在 20 以下。如果某个节点拥有 30GB 的堆内存,那其最多可有 600 个分片,但是在此限值范围内,您设置的分片数量越少,效果就越好。一般而言,这可以帮助集群保持良好的运行状态。

以“每GB堆内存配置20个以下分片为目标”的经验法则在ES 8.3 版中已被弃用。

Tips 6: 对于高效搜索(热数据),建议“内存-磁盘”比率在1:30为佳,也就是60GB内存可以支撑的检索数据量约1.8TB。对于温数据或冷数据则不受此限制,甚至可以拓展到1:180。

最佳实践扩展

在Elasticsearch中,分片的设置是一个关键的决策点,它直接影响到集群的性能和可扩展性。以下是一些关于分片设置的最佳实践和建议:

  1. 分片数量:通常建议每个分片的大小不超过50GB,但最好大于1GB。分片过大或过小都不利于集群的性能和可扩展性。过大的分片会增加恢复时间,而过小的分片则会导致资源开销增加。

  2. 分片与内存的关系:每个节点上可以存储的分片数量与可用的堆内存大小成正比关系。一个经验法则是,确保对于节点上已配置的每个GB,将分片数量保持在20以下。例如,如果节点有30GB的堆内存,那么最多可以有600个分片。

  3. 分片分配策略:Elasticsearch的ShardsAllocator组件负责分片的分配和迁移。分配策略的目标是使集群所有节点负载一致,确保流量均匀分布。

  4. 分片分配的触发时机:创建索引、节点加入或离开集群、分片分配相关配置修改、索引副本数增加或减少等情况都会触发分片分配。

  5. 副本分片:副本分片的数量可以随时更改,而不会中断索引或查询操作。通常,副本分片用于提供高可用性和读取容量。

  6. 集群扩展:随着数据量的增加,可以通过增加分片数和机器数来扩展集群。Elasticsearch会自动迁移分片以重新平衡集群。

  7. 索引和分片的资源开销:每个索引和分片都会产生一定的资源开销。因此,合理规划分片数量和大小对于集群的性能至关重要。

  8. 时序型索引:对于时序型数据,使用时序型索引来管理数据保留期是一个好方法。这样可以随着时间推移轻松调整主分片和副本分片的数量。

  9. 分片合并:通过forcemerge操作强制将较小的段合并为较大的段,可以减少开销并改善查询性能。但这是一个耗费资源的操作,应该在非高峰时段进行。

  10. 内存-磁盘比率:对于高效搜索(热数据),建议“内存-磁盘”比率在1:30为佳,也就是60GB内存可以支撑的检索数据量约1.8TB。对于温数据或冷数据则不受此限制,甚至可以拓展到1:180。

### Elasticsearch 索引分片的概念 在Elasticsearch中,索引可以被分割成多个部分称为分片(shards),这些分片可以在集群中的不同节点间分布。这种设计不仅有助于水平扩展存储能力,还提高了查询性能因为请求会被并行处理[^1]。 当文档被存入某个特定的索引时,它实际上会被写入该索引的一个或几个主分片之中;而为了提高可用性和容错性,每一个主分片还可以拥有零个或多个副本(replicas)[^2]。这意味着即使某些硬件发生故障,只要还有其他健康的副本来保存相同的数据集,则整个系统的正常运作不会受到影响。 对于大规模应用而言,考虑到单一分片所能承载的数据量有限以及潜在的增长需求,在规划之初就应当谨慎考虑如何设置合适的初始分片数目及其大小上限。通常情况下,官方建议将每个分片的最大容量控制在大约30GB左右,并据此推算出合理的总分片数以适应预期的数据规模[^3]。 另外值得注意的是,虽然理论上增加更多的分片似乎总是有利无弊——毕竟这能带来更好的并发度和支持更大的总体数据体量——但实际上过多的小型分片反而会对系统造成额外负担,因此还需要综合考量实际场景下的资源状况与访问模式等因素来做出最佳决策[^4]。 ### 创建及管理方式 #### 创建索引 创建一个新的带有指定配置参数(比如分片数量)的索引可以通过RESTful API轻松实现: ```json PUT /my_index?pretty { "settings": { "number_of_shards": 5, "number_of_replicas": 1 } } ``` 上述命令定义了一个名为`my_index`的新索引,其中包含了五个主分片和一个完整的复制链路用于冗余保护。 #### 动态调整分片数量 一旦索引建立完成之后,默认情况下其内部结构如分片数量便不可更改。然而,针对已存在的索引仍可通过重新索引来间接达到改变目的的效果,即先构建另一个具有新设定值的目标索引并将源数据迁移过去再删除旧版本。 此外,尽管无法直接修改现有索引内的分片总数,但允许随时增减副本的数量从而灵活应对不同的负载情况或是维护期间的需求变化: ```json POST /my_index/_settings { "index" : { "number_of_replicas" : 2 } } ``` 此段脚本展示了怎样把先前例子中提到的那个索引对象(`my_index`)所拥有的备份份数提升至两份[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1024点线面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值