ES分片考量与可扩展策略

文章目录

前言

博主介绍:✌目前全网粉丝4W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。

涵盖技术内容:Java后端、大数据、算法、分布式微服务、中间件、前端、运维等。

博主所有博客文件目录索引:博客目录索引(持续更新)

CSDN搜索:长路

视频平台:b站-Coder长路

资料

es分为单机、集群部署模式

es中文站点:https://elastic.ac.cn/

分片容量计算:https://blog.csdn.net/hekuinumberone/article/details/145828769

阿里云资源规划:https://help.aliyun.com/zh/es/user-guide/evaluate-specifications-and-storage-capacity

磁盘容量

参考来源:https://jelinet.com/es/2020/06/01/ES容量预估最佳实践.html

影响ES磁盘空间的因素有以下几点:

  • 副本数量。至少1个副本。
  • 索引开销。通常比源数据大10%_all等未计算)。
  • 操作系统预留。操作系统默认会保留**5%**的文件系统供用户处理关键流程、系统恢复以及磁盘碎片等。
  • ES内部开销。段合并、日志等内部操作,预留20%
  • 安全阈值。通常至少预留**15%**的安全阈值。

根据以上因素得到:最小磁盘总大小 = 源数据大小 * 3.4

磁盘总大小 = 源数据 * (1 + 副本数量) * (1 + 索引开销) / (1 - 操作系统预留空间) / (1 - ES内部开销) / (1 - 安全阈值) = 源数据 * (1 + 副本数量) * 1.7 = 源数据 * 3.4

注意点:磁盘空间一般要预留15%,也就是磁盘空间不能>85%。

分片

官网:https://elastic.ac.cn/guide/en/elasticsearch/reference/current/size-your-shards.html

每个索引和每个分片都需要一些内存和 CPU 资源。在大多数情况下,一小组大分片使用的资源比许多小分片少。

市面方案:

分片容量

参考来源:https://blog.csdn.net/hekuinumberone/article/details/145828769

单分片建议容量:20-50GB(SSD场景)

· 小规格节点:不超过30GB

· 高规格节点:可扩展至50GB

· 超过80GB时聚合查询性能下降40%

推荐场景情况:

场景 节点规格 最优分片大小 性能表现
日志分析 16核/32GB 30GB 查询延迟50ms
电商搜索 8核/16GB 20-40GB 聚合性能提升30%

分片数量

参考来源:https://blog.csdn.net/hekuinumberone/article/details/145828769

官方文档:https://elastic.ac.cn/guide/en/elasticsearch/reference/current/size-your-shards.html#use-ds-ilm-for-time-series

精炼:

1、分片数尽量为数据节点数或者其整数倍。如 6 节点集群可设 6/12/18 分片【扩展分片,一般是原始分片的整数倍】

2、每个分片大小尽量在10-50GB左右。

3、官方建议一个GB jvm内存空间 <=20分片

5、在规划Elasticsearch分片时,必须基于主分片占用空间进行计算。副本分片仅作为冗余备份,不增加数据总量。

根据 Elastic 官方博客和阿里云文档的权威解释:

  • 分片数无硬性限制 :Elasticsearch 允许任意整数作为分片数(如 3、5、7 等),无需满足整数倍关系。
  • 扩容场景建议:为保持节点间数据均衡,建议分片数等于数据节点数或其整数倍(如 6 节点集群可设 6/12/18 分片)。
  • Split API 例外 :使用 _split API 扩容时,新分片数必须是原分片数的整数倍(如原 3 分片只能扩为 6、9 等)。

参考:

目前在索引社区在扩展性配置主要是:

1、Aim for shard sizes between 10GB and 50GB 【每一个分片大小10-50GB】

2、Aim for 20 shards or fewer per GB of heap memory【每分配一个GB jvm内存空间 <= 20个分片】

3、cluster.max_shards_per_node default 1000【单节点最大分片1000个】

4、集群合理的shard数控制在3K以内【集群总分片数尽量在3000内】

关于分片数量的权衡,不一定越大分片越好,当数据量小时,合理的少量分片数量(单分片20-50GB)规划效果会更啊后:

可扩展策略

滚动索引(Rollover) & 别名(Alias)

这是处理时序数据(如日志、搜索记录)的黄金标准。通过设置索引别名和滚动条件(如大小或

时间),当达到阈值时,系统会自动创建新索引,并将写入流量切换到新索引,而旧索引则变为只读。

冷热数据分层优化

该架构根据数据的访问频率,将其存储在不同性能和成本的硬件上,实现资源的最优利用。

•热数据(Hot):最新、最常被查询的数据。应部署在高性能的SSD磁盘上,配置较多的主分片

以支持高并发写入和查询。

• 温数据(Warm):较旧但仍有一定查询需求的数据。可迁移到成本较低的SAS磁盘,并通过

Shrink API压缩分片数量,减少资源占用。

• 冷数据(Cold):很少被查询的归档数据。可进一步迁移到更低成本的存储,如SATA硬盘或对象

存储,并使用Force Merge合并段,提升查询效率。

索引生命周期ILM

ILM是实现冷热分层自动化的关键。通过预设策略,可以自动将索引从"热"阶段滚动到"温"、"冷"阶段,并最终在达到保留期限后自动删除。这极大地简化了运维工作。

类似logback的滚动策略:

  • 当前索引满足定义的 max_primary_shard_sizemax_agemax_docsmax_size 阈值时,它会创建一个新的写入索引。当不再需要索引时,您可以使用 ILM 自动删除它并释放资源。

避免踩坑

关闭动态映射

参考文档:https://blog.csdn.net/hekuinumberone/article/details/145828769

某社交平台因未关闭动态映射,用户输入的特殊符号导致字段爆炸式增长,最终引发集群元数据内存溢出。解决方案:

  • 生产环境必须设置dynamic: strict
  • 通过ingest pipeline进行字段清洗和类型校验
json 复制代码
PUT /financial_transactions {
  "mappings": {
    "dynamic": false,  // 关闭动态映射
    "properties": {
      "txn_id": {"type": "keyword"},
      "amount": {"type": "scaled_float", "scaling_factor": 100},  // 精确到分
      "timestamp": {"type": "date", "format": "epoch_millis"}
    }
  }
}

优化参考文档

1\]. Elasticsearch索引设计与分片策略深度优化-手记:https://blog.csdn.net/hekuinumberone/article/details/145828769 ## 资料获取 大家点赞、收藏、关注、评论啦\~ 精彩专栏推荐订阅:在下方专栏👇🏻 * [长路-文章目录汇总(算法、后端Java、前端、运维技术导航)](https://blog.csdn.net/cl939974883/category_11568291.html?spm=1001.2014.3001.5482):博主所有博客导航索引汇总 * [开源项目Studio-Vue---校园工作室管理系统(含前后台,SpringBoot+Vue)](https://changlu.blog.csdn.net/article/details/125295334):博主个人独立项目,包含详细部署上线视频,已开源 * [学习与生活-专栏](https://blog.csdn.net/cl939974883/category_10700595.html):可以了解博主的学习历程 * [算法专栏](https://blog.csdn.net/cl939974883/category_11403550.html?spm=1001.2014.3001.5482):算法收录 更多博客与资料可查看👇🏻获取联系方式👇🏻,🍅文末获取开发资源及更多资源博客获取🍅