关于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。

相关推荐
LSL666_11 小时前
1 elasticSearch 和 IK分词器的本地下载
大数据·elasticsearch·jenkins
lpfasd12312 小时前
git-进阶技巧与最佳实践
大数据·git·elasticsearch
KANGBboy13 小时前
ES 总结
hive·elasticsearch
Elasticsearch15 小时前
Elasticsearch:如何为 Elastic Stack 部署 E5 模型 - 下载及隔离环境
elasticsearch
huisheng_qaq17 小时前
【ElasticSearch实用篇-05】基于脚本script打分
大数据·elasticsearch·script·匹配·社交·脚本打分
极客学术工坊17 小时前
2023年第十五届 “电工杯” 大学生数学建模竞赛-B题 人工智能对大学生学习影响的评价-人工智能对大学生学习影响的评价
搜索引擎
青鱼入云18 小时前
ES脚本语言Painless介绍
大数据·elasticsearch·搜索引擎
Jonathan Star19 小时前
嵌套 Git 仓库(Submodule/子模块)
大数据·git·elasticsearch
liuyunshengsir20 小时前
让 Elasticsearch Delete By Query 请求立即生效
大数据·elasticsearch·jenkins
努力的小郑1 天前
Elasticsearch 避坑指南:我在项目中总结的 14 条实用经验
后端·elasticsearch·性能优化