Elasticsearch集群最大分片数设置详解:从问题到解决方案

news2025/7/28 2:19:34

目录

前言

1 问题背景:重启后设置失效

2 核心概念解析

2.1 什么是分片(Shard)?

2.2 cluster.max_shards_per_node的作用

2.3 默认值是多少?

3 参数设置的两种方式

3.2 持久性设置(persistent)

3.2 临时设置(transient)

4 问题解决方案

5 深入理解设置存储机制

6 生产环境最佳实践

7 常见问题解答

8 总结


前言

作为Elasticsearch运维人员,我们经常需要调整集群参数以适应业务需求。其中cluster.max_shards_per_node是一个关键配置,它控制着每个节点可以承载的最大分片数量。本文将深入探讨这个参数的设置方式、持久性问题以及最佳实践,特别是解决" 设置后集群重启恢复默认值"的问题。

1 问题背景:重启后设置失效

最近有用户反馈了一个典型问题:
"通过curl命令行方式成功设置了cluster.max_shards_per_node参数,但是当集群重启后,这个值又恢复成了默认值,这是为什么?"
# 用户使用的设置命令
curl -X PUT "192.168.10.33:9200/_cluster/settings" -H "Content-Type: application/json" -d'
{
  "transient": {
    "cluster.max_shards_per_node": 8000
  }
}
'
这个问题实际上涉及Elasticsearch集群设置的持久性机制,让我们先了解一些基础概念。

2 核心概念解析

2.1 什么是分片(Shard)?

分片是Elasticsearch中数据存储的基本单元,每个索引由一个或多个分片组成。分片分为:
  • 主分片(Primary Shard):负责数据写入和读取
  • 副本分片(Replica Shard):提供高可用和读取负载均衡

2.2 cluster.max_shards_per_node的作用

这个参数限制单个数据节点可以承载的分片总数(主分片+副本分片),主要作用包括:
  • 防止单个节点过载
  • 平衡集群资源使用
  • 避免分片过多导致的性能下降

2.3 默认值是多少?

不同版本默认值可能不同:
  • Elasticsearch 6.x及之前:无硬性限制
  • Elasticsearch 7.0+:默认1000
  • 可以通过API查询当前默认值:
curl -X GET "192.168.10.33:9200/_cluster/settings?include_defaults=true&pretty" | grep max_shards_per_node

3 参数设置的两种方式

  • Elasticsearch提供了两种设置集群参数的方式,它们的持久性完全不同:

3.2 持久性设置(persistent)

特点
  • 写入集群状态
  • 重启后仍然有效
  • 适合生产环境
  • 设置命令
curl -X PUT "192.168.10.33:9200/_cluster/settings" -H "Content-Type: application/json" -d'
{
  "persistent": {
    "cluster.max_shards_per_node": 8000
  }
}
'

3.2 临时设置(transient)

特点
  • 仅在内存中生效
  • 重启后恢复默认值
  • 适合临时测试
  • 设置命令
curl -X PUT "192.168.10.33:9200/_cluster/settings" -H "Content-Type: application/json" -d'
{
  "transient": {
    "cluster.max_shards_per_node": 8000
  }
}
'

4 问题解决方案

  • 针对开头提出的问题,解决方案很简单:使用persistent替代transient设置
  • 完整解决方案步骤:
  • 检查当前设置
curl -X GET "192.168.10.33:9200/_cluster/settings?pretty"
  • 使用persistent方式设置
curl -X PUT "192.168.10.33:9200/_cluster/settings" -H "Content-Type: application/json" -d'
{
  "persistent": {
    "cluster.max_shards_per_node": 8000
  }
}
'
  • 验证设置
curl -X GET "192.168.10.33:9200/_cluster/settings?pretty"
  • 重启测试:重启集群后再次检查设置是否保留

5 深入理解设置存储机制

  • 为了更深入理解为什么transient设置会丢失,我们需要了解Elasticsearch的配置存储架构:
  • 静态配置:通过elasticsearch.yml文件配置,需要重启生效
  • 动态配置:通过API实时修改
    • transient:仅保存在内存中的集群状态
    • persistent:持久化到磁盘的集群状态

6 生产环境最佳实践

  • 合理设置分片数
  • 不是越大越好,需考虑节点资源
  • 一般建议:总分片数 ≤ 节点数 × max_shards_per_node × 0.8
  • 监控分片数量
# 查看当前分片分布
curl -X GET "192.168.10.33:9200/_cat/shards?v"
# 查看节点分片负载
curl -X GET "192.168.10.33:9200/_cat/nodes?v&h=name,shards"
  • 结合ILM管理索引生命周期
  • 自动滚动创建新索引
  • 自动删除过期索引
  • 控制历史数据保留时间
  • 设置恢复建议
# 推荐设置公式
建议值 = min(5000, 节点内存GB * 20)

# 示例:64GB内存节点
curl -X PUT "192.168.10.33:9200/_cluster/settings" -H "Content-Type: application/json" -d'
{
  "persistent": {
    "cluster.max_shards_per_node": 2000
  }
}
'

7 常见问题解答

Q1:为什么需要限制最大分片数?
A:每个分片都会消耗内存、CPU和文件描述符资源。过多的分片会导致:
  • 性能下降
  • 集群不稳定
  • 恢复时间变长
Q2:如何判断当前分片数是否合理?
# 计算当前分片使用率
总分数=$(curl -s -X GET "192.168.10.33:9200/_cat/shards?h=index,shard,prirep" | wc -l)
节点数=$(curl -s -X GET "192.168.10.33:9200/_cat/nodes?h=ip" | wc -l)
max_shards=$(curl -s -X GET "192.168.10.33:9200/_cluster/settings?include_defaults=true" | jq '.defaults.cluster.max_shards_per_node')
使用率=$((总分数 * 100 / (节点数 * max_shards)))
echo "当前分片使用率: ${使用率}%"
Q3:设置过大有什么风险?
  • 可能导致节点OOM
  • 影响查询性能
  • 延长故障恢复时间

8 总结

通过本文,我们深入理解了:
  • cluster.max_shards_per_node参数的重要性
  • persistent和transient设置的区别
  • 解决重启后设置恢复默认值的问题
  • 生产环境的最佳实践
希望这篇文章能帮助您更好地管理Elasticsearch集群分片数量,避免因设置不当导致的性能问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2403356.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DVWA全靶场

目录 暴破 Low - 万能密码 Medium - 转义 High - Token Impossible 命令注入 CSRF跨站请求伪造 - 抓包 Low Medium - 域名限制 High - 域名限制xss 文件包含 - 页面点点点 Low Medium - 过滤http:// High - file Impossible - 写死 文件上传 Low Medium - 文件…

【反无人机检测】C2FDrone:基于视觉Transformer网络的无人机间由粗到细检测

C2FDrone:基于视觉Transformer网络的无人机间由粗到细检测 C2FDrone: Coarse-to-Fine Drone-to-Drone Detection using Vision Transformer Networks 论文链接 摘要 摘要——基于视觉的无人机间检测系统在碰撞规避、反制敌对无人机和搜救行动等应用中至关重要。然…

Android 本地存储路径说明

一、背景 作为一个开发者,我们经常需要通过缓存一些文件到SD卡中,常见的方式就是,通过: File sdCard Environment.getExternalStorageDirectory(); 获取SD卡根目录,然后自定义文件/文件名进行文件存储.这样做法的结果就是,当手机安装了大量的app时,SD卡根目录会…

国产pcie switch 8748+飞腾/龙芯/昇腾高速存储方案设计

方案概述 本设计以国微PCIe Switch 8748为核心交换芯片,通过多端口PCIe 4.0/5.0通道连接飞腾ARM架构处理器、龙芯LoongArch处理器及昇腾AI加速卡,构建支持NVMe协议的高速存储集群,目标实现6.5GB/s以上的可持续带宽。 硬件架构 处理器选型 飞…

如何使用插件和子主题添加WordPress自定义CSS(附:常见错误)

您是否曾经想更改网站外观的某些方面,但不知道怎么做?有一个解决方案——您可以将自定义 CSS(层叠样式表)添加到您的WordPress网站! 在本文中,我们将讨论您需要了解的有关CSS的所有知识以及如何使用它来修…

开始在本地部署自己的 Gitea 服务器

0.简介 在软件开发和团队协作中,代码管理是至关重要的环节。笔者一直使用gitblit管理自己的仓库。然鹅,这个软件已经很久没有更新了。经过多方考察,发现Gitea 是一款轻量级的开源代码托管平台,具有易于部署、资源占用少、功能丰富…

7.2.1_顺序查找

知识总览: 顺序查找: 算法思想: 从头到脚挨个找或者从脚到头挨个找适用于线性表(顺序存储和链式存储都适用),又叫线性查找 实现: 1个数组elem指向数组的起始位置,索引从0开始遍历数组直到找到目标值返回…

智能制造数字孪生全要素交付一张网:智造中枢,孪生领航,共建智造生态共同体

在制造业转型升级的浪潮中,数字孪生技术正成为推动行业变革的核心引擎。从特斯拉通过数字孪生体实现车辆全生命周期优化,到海尔卡奥斯工业互联网平台赋能千行百业,数字孪生技术已从概念验证走向规模化落地。通过构建覆盖全国的交付网络&#…

stylus - 新生代CSS预处理框架

stylus是什么 Stylus 是一种 CSS 预处理器,它扩展了 CSS 的功能,使得编写样式变得更简洁和高效。Stylus 允许使用嵌套、变量、混入等编程功能,这些功能可以极大地提高开发效率和代码的可维护性。 stylus中文文档 https://stylus.uihtm.co…

BugKu Web渗透之网站被hei(仅仅是ctf题目名称)

启动场景,打开网页,显示如下: 目前没有看出任何异常。 步骤一: 右键查看源代码。源代码较多,也没发现异常。 步骤二: 用dirsearch扫描网站目录。 如图: 看起来shell.php很可疑。 步骤三&…

关于华为仓颉编程语言

文章目录 一、基本概况二、技术特点1. 多范式编程2. 原生智能化3. 高性能与安全4. 全场景兼容 三、编译器与开发工具四、语言相似性对比五、行业应用实例总结 最近经常看到这个东西,于是搜了一下,整理了一些内容,水一篇,以后慢慢研…

解决el-select选择框右侧下拉箭头遮挡文字问题

如图所示&#xff1a; el-select长度较短的时候&#xff0c;选择框右侧下拉箭头会遮挡选中的数据 选中数据被遮挡 解决办法&#xff1a; 组件如下&#xff1a; <td class"fmtd" :colspan"col.ptproCupNum" v-for"col in row" :key"…

20250603在荣品的PRO-RK3566开发板的Android13下的使用命令行来查看RK3566的温度【显示优化版本】

20250603在荣品的PRO-RK3566开发板的Android13下的使用命令行来查看RK3566的温度【显示优化版本】 2025/6/3 11:58 RK3566的cpu运行效率 top busybox top rk3566_t:/ # rk3566_t:/ # rk3566_t:/ # cd /sys/class/thermal/ rk3566_t:/sys/class/thermal # ls -l rk3566_t:/sys/c…

C语言字符数组初始化的5种方法(附带实例)

所谓初始化&#xff0c;就是在定义的同时进行赋值。 C语言中&#xff0c;初始化字符数组的方式多样&#xff0c;每种方式都有其特定的用途和优势。 1、使用字符串字面量初始化 最常见和简洁的初始化方式是使用字符串字面量。在这种方法中&#xff0c;我们直接将一个用双引号…

npm run dev 报错:Error: error:0308010C:digital envelope routines::unsupported

npm run dev时报错如下 原因&#xff1a;更换node版本导致 解决&#xff1a; 修改package.json文件&#xff0c;在相关构建命令之前加入 SET NODE_OPTIONS–openssl-legacy-provider 运行成功

基于LLaMA-Factory和Easy Dataset的Qwen3微调实战:从数据准备到LoRA微调推理评估的全流程指南

随着开源大模型如 LLaMA、Qwen 和 Baichuan 的广泛应用&#xff0c;其基于通用数据的训练方式在特定下游任务和垂直领域中的表现仍存在提升空间&#xff0c;因此衍生出针对具体场景的微调训练需求。这些训练涵盖预训练&#xff08;PT&#xff09;、指令微调&#xff08;SFT&…

idea中 maven 本地仓库有jar包,但还是找不到,解决打包失败和无法引用的问题

1、删除本地仓库中的文件 进入本地仓库对应jar包文件目录中删除_remote.repositories文件和结尾为.lastUpdated的文件 2、回到IDEA刷新Maven 3、查看之前引用不了的jar是否引入成功

(33)课54--??:3 张表的 join-on 连接举例,多表查询总结。

&#xff08;112&#xff09;3 张表的 join-on 连接举例 &#xff1a; &#xff08;113&#xff09; 多表查询总结 &#xff1a; &#xff08;114&#xff09;事务 &#xff1a; &#xff08;115&#xff09; &#xff08;116&#xff09; &#xff08;117&#xff09; …

SpringCloud学习笔记-3

声明&#xff1a;笔记来源于网络&#xff0c;如有侵权联系删除 1 openfeign 1&#xff09;openfeign远程调用声明式实现 1.启动类中添加注解 EnableFeignClients EnableFeignClients SpringBootApplication public class OrderMainApplication {public static void main(St…

BugKu Web渗透之eval

启动场景&#xff0c;打开网页&#xff0c;显示的是一段代码。 步骤一&#xff1a; 分析代码。 代码大概意思是&#xff1a; <?php//包含"flag.php"的文件include "flag.php"; //获取网页请求的hello数据$a $_REQUEST[hello]; //显示变量a的详…