Elasticsearch 核心参数调优指南

Elasticsearch 核心参数调优指南

本文档整理了 ES 集群中最重要的配置参数,帮助运维人员快速理解和优化集群性能。

目录

  1. 配置优先级
  2. 分片路由与恢复参数
  3. 磁盘水位线
  4. [Segment Merge 段合并](#Segment Merge 段合并)
  5. 索引级别核心参数
  6. 线程池配置
  7. 内存与熔断器
  8. 搜索相关配置
  9. 集群发现与故障检测
  10. 常用调参命令

配置优先级

ES 配置生效优先级(从高到低):

复制代码
transient(临时) > persistent(持久化) > defaults(默认值)
类型 说明 重启后
transient 临时配置,用于紧急调整 丢失
persistent 持久化配置,推荐使用 保留
defaults 系统默认值,由版本决定 不变

分片路由与恢复参数

🔥 核心参数一览

参数 默认值 推荐值 说明
node_concurrent_recoveries 2 8-16 单节点同时恢复分片数
node_initial_primaries_recoveries 4 32 初始主分片恢复并发数
node_concurrent_incoming_recoveries 2 2-4 入向恢复并发数
node_concurrent_outgoing_recoveries 2 2-4 出向恢复并发数
cluster_concurrent_rebalance 2 2-4 集群同时 rebalance 分片数
max_bytes_per_sec 40mb 100-200mb 恢复时最大传输速率

详细说明

1. node_concurrent_recoveries
复制代码
cluster.routing.allocation.node_concurrent_recoveries
  • 作用:控制单个节点同时恢复的分片数量
  • 影响:值越大恢复越快,但占用更多 CPU/网络/磁盘资源
  • 场景
    • 小集群/资源紧张:2-4
    • 大集群/快速恢复:16-32
    • 紧急恢复:可临时调高
2. node_initial_primaries_recoveries
复制代码
cluster.routing.allocation.node_initial_primaries_recoveries
  • 作用:节点启动时,本地主分片的恢复并发数
  • 特点:只涉及本地磁盘读取,不消耗网络
  • 推荐:可以设置较高值(32+),加速节点启动
3. cluster_concurrent_rebalance
复制代码
cluster.routing.allocation.cluster_concurrent_rebalance
  • 作用:整个集群同时进行 rebalance 的分片数
  • 场景
    • 日常运维:2(保守)
    • 扩缩容时:4-8(加速)
    • 业务高峰:0(禁止 rebalance)
4. max_bytes_per_sec
复制代码
indices.recovery.max_bytes_per_sec
  • 作用:限制恢复时的网络传输速率
  • 注意:设置过高可能影响业务查询
  • 推荐:根据网络带宽调整,通常 100-200mb

调参示例

bash 复制代码
# 加速分片恢复(适合扩容/故障恢复场景)
PUT /_cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.node_concurrent_recoveries": 16,
    "cluster.routing.allocation.cluster_concurrent_rebalance": 4,
    "indices.recovery.max_bytes_per_sec": "200mb"
  }
}

# 恢复完成后调回保守值
PUT /_cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.node_concurrent_recoveries": 8,
    "cluster.routing.allocation.cluster_concurrent_rebalance": 2,
    "indices.recovery.max_bytes_per_sec": "40mb"
  }
}

磁盘水位线

🔥 核心参数

参数 默认值 说明
watermark.low 85% 停止分配新分片到该节点
watermark.high 90% 开始迁移分片离开该节点
watermark.flood_stage 95% 索引变为只读(危险!)

详细说明

复制代码
cluster.routing.allocation.disk.watermark.low      # 低水位
cluster.routing.allocation.disk.watermark.high     # 高水位
cluster.routing.allocation.disk.watermark.flood_stage  # 洪水位
水位触发行为
复制代码
磁盘使用率
    │
    │   ┌─────────────────────────────────────┐
95% ├───┤ flood_stage: 索引变只读,无法写入! │ ⚠️ 危险
    │   └─────────────────────────────────────┘
    │   ┌─────────────────────────────────────┐
90% ├───┤ high: 开始迁移分片到其他节点        │ ⚠️ 警告
    │   └─────────────────────────────────────┘
    │   ┌─────────────────────────────────────┐
85% ├───┤ low: 停止分配新分片到该节点         │ 注意
    │   └─────────────────────────────────────┘
    │
    │   正常运行
    │

调参示例

bash 复制代码
# 调整水位线(适合大磁盘场景)
PUT /_cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.disk.watermark.low": "80%",
    "cluster.routing.allocation.disk.watermark.high": "85%",
    "cluster.routing.allocation.disk.watermark.flood_stage": "90%"
  }
}

# 也可以用绝对值
PUT /_cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.disk.watermark.low": "100gb",
    "cluster.routing.allocation.disk.watermark.high": "50gb",
    "cluster.routing.allocation.disk.watermark.flood_stage": "20gb"
  }
}

⚠️ 紧急处理:索引变只读

当触发 flood_stage 后,需要手动解除只读:

bash 复制代码
# 解除所有索引的只读状态
PUT /_all/_settings
{
  "index.blocks.read_only_allow_delete": null
}

# 解除单个索引
PUT /your_index/_settings
{
  "index.blocks.read_only_allow_delete": null
}

Segment Merge 段合并

📚 什么是 Segment?

Elasticsearch 底层使用 Lucene,数据存储在 Segment(段) 中。

复制代码
Index (索引)
  └── Shard (分片)
       └── Segment (段) ← 不可变的数据块
            └── Document (文档)
Segment 的特点
特点 说明
不可变 一旦写入,Segment 不可修改
只增不改 更新 = 标记删除旧文档 + 写入新文档
定期合并 多个小 Segment 合并成大 Segment

🔄 为什么需要 Segment Merge?

随着数据写入,会产生大量小 Segment:

复制代码
写入过程:
┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐
│ S1│ │ S2│ │ S3│ │ S4│ │ S5│ │ S6│  ← 6个小 Segment
└───┘ └───┘ └───┘ └───┘ └───┘ └───┘

Merge 后:
┌─────────────────────────────────┐
│           Merged Segment         │  ← 1个大 Segment
└─────────────────────────────────┘
Merge 的好处
好处 说明
🗑️ 清理删除 真正删除标记为 deleted 的文档
📉 减少文件 减少文件句柄和系统开销
🚀 加速查询 查询需要遍历的 Segment 更少
💾 节省空间 合并后去除冗余,压缩存储

⚙️ Merge 相关参数(索引级别)

重要 :Segment Merge 参数主要是索引级别配置,不在集群配置中!

核心参数
参数 默认值 说明
index.merge.scheduler.max_thread_count 自动 Merge 线程数(SSD:max(1,min(4,cores/2)), HDD:1)
index.merge.policy.expunge_deletes_allowed 10 允许的删除文档百分比
index.merge.policy.floor_segment 2mb 最小 Segment 大小
index.merge.policy.max_merge_at_once 10 一次 Merge 最多合并的 Segment 数
index.merge.policy.max_merged_segment 5gb 单个 Segment 最大大小(不参与普通 Merge)
index.merge.policy.segments_per_tier 10 每层允许的 Segment 数
配置示例
bash 复制代码
# 创建索引时设置 Merge 参数
PUT /my_index
{
  "settings": {
    "index.merge.scheduler.max_thread_count": 2,
    "index.merge.policy.max_merged_segment": "2gb"
  }
}

# 修改已有索引的 Merge 参数
PUT /my_index/_settings
{
  "index.merge.scheduler.max_thread_count": 4
}

🔧 手动触发 Force Merge

什么时候使用 Force Merge?
场景 说明
✅ 只读索引 历史数据、归档数据,不再写入
✅ 清理删除 大量删除后,回收磁盘空间
❌ 活跃写入索引 不推荐,会消耗大量资源
Force Merge 命令
bash 复制代码
# 合并单个索引到指定 Segment 数
POST /my_index/_forcemerge?max_num_segments=1

# 合并多个索引
POST /index1,index2/_forcemerge?max_num_segments=1

# 只清理删除的文档(不强制合并到指定数量)
POST /my_index/_forcemerge?only_expunge_deletes=true

# 异步执行(推荐大索引使用)
POST /my_index/_forcemerge?max_num_segments=1&wait_for_completion=false
Force Merge 参数说明
参数 说明
max_num_segments 目标 Segment 数量,通常设为 1
only_expunge_deletes 仅清理删除文档,不强制合并
wait_for_completion 是否等待完成,大索引建议 false

📊 查看 Segment 信息

bash 复制代码
# 查看索引的 Segment 信息
GET /my_index/_segments

# 查看分片的 Segment 详情
GET /_cat/segments/my_index?v

# 输出示例:
# index    shard prirep segment generation docs.count docs.deleted size
# my_index 0     p      _0      0          1000       50           1mb
# my_index 0     p      _1      1          500        10           512kb
Segment 信息字段说明
字段 说明
segment Segment 名称(_0, _1, _2...)
generation 生成序号
docs.count 有效文档数
docs.deleted 已删除文档数(标记删除,未真正清理)
size Segment 大小

⚡ Refresh vs Flush vs Merge

这三个操作容易混淆,这里做个对比:

操作 触发时机 作用 数据持久化
Refresh 默认 1s 使新文档可搜索 ❌ 否
Flush 默认 5s 或达到阈值 将 translog 写入磁盘 ✅ 是
Merge 后台自动 合并 Segment,清理删除 ✅ 是
复制代码
写入流程:
Document → Memory Buffer → [Refresh] → Segment (in memory)
                               ↓
                          [Flush] → Segment (on disk)
                               ↓
                          [Merge] → Merged Segment

🔍 Merge 监控

bash 复制代码
# 查看正在进行的 Merge
GET /_cat/nodes?v&h=name,merges.current,merges.total

# 查看详细的 Merge 统计
GET /_nodes/stats/indices/merges

# 返回示例
{
  "merges": {
    "current": 0,           # 当前进行的 Merge 数
    "current_docs": 0,      # 当前 Merge 涉及的文档数
    "current_size_in_bytes": 0,
    "total": 10,            # 累计 Merge 次数
    "total_time_in_millis": 5000,
    "total_docs": 100000,
    "total_size_in_bytes": 104857600
  }
}

⚠️ Merge 注意事项

  1. 不要对活跃写入索引执行 Force Merge

    • 会占用大量 I/O 和 CPU
    • 可能影响正常写入性能
  2. Force Merge 到 1 个 Segment

    • 适合只读索引
    • 单个 Segment 可能很大,影响恢复速度
  3. 监控 docs.deleted

    • 如果删除文档占比高,考虑触发 Merge
    • 使用 only_expunge_deletes=true 仅清理删除
  4. SSD vs HDD

    • SSD 可以用更多 Merge 线程
    • HDD 建议限制为 1 个线程

索引级别核心参数

重要:索引级别参数可以在创建索引时设置,也可以动态修改。部分参数需要关闭索引后才能修改。

📋 参数分类概览

分类 说明 配置方式
静态参数 创建时设置,后续只能 close 后修改 创建时 / close-update-open
动态参数 可随时修改,立即生效 PUT /_settings

🔥 分片与副本配置

参数 默认值 动态 说明
number_of_shards 1 主分片数量(创建后不可变!)
number_of_replicas 1 副本数量
routing_partition_size 1 自定义路由分区大小
codec default 压缩算法(default/best_compression)
分片数量规划原则
复制代码
📌 经验公式:
单个分片大小 = 10GB ~ 50GB(推荐 30GB 左右)
主分片数 ≈ 预估数据量 / 30GB

📌 示例:
- 预估 300GB 数据 → 10 个主分片
- 预估 1TB 数据 → 30-35 个主分片
配置示例
bash 复制代码
# 创建索引时设置分片数
PUT /my_index
{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 1
  }
}

# 动态调整副本数(线上常用!)
PUT /my_index/_settings
{
  "index": {
    "number_of_replicas": 2
  }
}

# 临时关闭副本(批量导入时加速)
PUT /my_index/_settings
{
  "index": {
    "number_of_replicas": 0
  }
}

⚡ Refresh 刷新配置

参数 默认值 说明
index.refresh_interval 1s 刷新间隔(使新文档可搜索)
刷新机制原理
复制代码
文档写入 → Memory Buffer → [Refresh] → Segment(可搜索)
                              ↑
                         每 1 秒执行一次
调优场景
场景 推荐值 说明
实时搜索 1s(默认) 新数据 1 秒内可搜索
近实时搜索 5s-30s 降低刷新频率,提升写入性能
批量导入 -1(禁用) 导入完成后手动刷新
日志场景 30s-60s 日志通常不需要实时搜索
配置示例
bash 复制代码
# 延长刷新间隔(提升写入性能)
PUT /my_index/_settings
{
  "index": {
    "refresh_interval": "30s"
  }
}

# 禁用自动刷新(批量导入时)
PUT /my_index/_settings
{
  "index": {
    "refresh_interval": "-1"
  }
}

# 导入完成后手动刷新
POST /my_index/_refresh

# 恢复默认刷新间隔
PUT /my_index/_settings
{
  "index": {
    "refresh_interval": "1s"
  }
}

📝 Translog 事务日志配置

参数 默认值 说明
index.translog.durability request 持久化策略
index.translog.sync_interval 5s 异步刷盘间隔
index.translog.flush_threshold_size 512mb 触发 flush 的 translog 大小
持久化策略对比
策略 说明 性能 可靠性
request 每次请求后刷盘 高(不丢数据)
async 按 sync_interval 异步刷盘 中(可能丢失 5s 数据)
配置示例
bash 复制代码
# 高性能模式(允许少量数据丢失)
PUT /my_index/_settings
{
  "index": {
    "translog.durability": "async",
    "translog.sync_interval": "10s"
  }
}

# 高可靠模式(默认)
PUT /my_index/_settings
{
  "index": {
    "translog.durability": "request"
  }
}

# 调整 flush 阈值
PUT /my_index/_settings
{
  "index": {
    "translog.flush_threshold_size": "1gb"
  }
}

🔍 搜索相关配置

参数 默认值 说明
index.max_result_window 10000 from + size 最大值
index.max_inner_result_window 100 内层查询最大结果数
index.max_rescore_window 10000 rescore 窗口最大值
index.max_docvalue_fields_search 100 单次查询最大 docvalue 字段数
index.max_script_fields 32 单次查询最大脚本字段数
index.max_terms_count 65536 terms 查询最大项数
index.max_regex_length 1000 正则表达式最大长度
max_result_window 详解
复制代码
📌 分页限制:from + size 不能超过 max_result_window

示例:
- from=0, size=100    ✅ 0+100=100 < 10000
- from=9990, size=10  ✅ 9990+10=10000 = 10000
- from=9990, size=100 ❌ 9990+100=10090 > 10000 报错!
深度分页解决方案
方案 适用场景 说明
scroll 批量导出全部数据 保持快照,适合一次性遍历
search_after 实时深度分页 推荐!使用上一页最后一条的排序值
调大 max_result_window 临时方案 ⚠️ 不推荐,消耗内存
配置示例
bash 复制代码
# 调整分页限制(慎用!)
PUT /my_index/_settings
{
  "index": {
    "max_result_window": 50000
  }
}

# 调整 terms 查询最大项数
PUT /my_index/_settings
{
  "index": {
    "max_terms_count": 100000
  }
}

💾 存储与压缩配置

参数 默认值 说明
index.codec default 压缩算法
index.store.type fs 存储类型
index.store.preload [] 预加载文件扩展名
压缩算法对比
算法 压缩率 速度 适用场景
default (LZ4) 中等 大多数场景
best_compression (DEFLATE) 冷数据、归档索引
配置示例
bash 复制代码
# 创建高压缩索引(只能创建时设置)
PUT /archive_index
{
  "settings": {
    "index.codec": "best_compression"
  }
}

# 预加载特定文件类型到内存
PUT /my_index/_settings
{
  "index": {
    "store.preload": ["nvd", "dvd"]
  }
}

🔒 索引块(Blocks)配置

参数 默认值 说明
index.blocks.read_only false 完全只读(包括元数据)
index.blocks.read_only_allow_delete false 只读但允许删除
index.blocks.read false 禁止读取
index.blocks.write false 禁止写入
index.blocks.metadata false 禁止元数据修改
常用场景
bash 复制代码
# 手动设置索引只读(保护重要数据)
PUT /my_index/_settings
{
  "index": {
    "blocks.write": true
  }
}

# 解除只读(磁盘满自动触发后)
PUT /my_index/_settings
{
  "index": {
    "blocks.read_only_allow_delete": null
  }
}

# 批量解除所有索引只读
PUT /_all/_settings
{
  "index.blocks.read_only_allow_delete": null
}

📊 慢日志配置

参数 默认值 说明
index.search.slowlog.threshold.query.warn -1 查询慢日志 WARN 阈值
index.search.slowlog.threshold.query.info -1 查询慢日志 INFO 阈值
index.search.slowlog.threshold.fetch.warn -1 Fetch 慢日志 WARN 阈值
index.indexing.slowlog.threshold.index.warn -1 索引慢日志 WARN 阈值
配置示例
bash 复制代码
# 配置查询慢日志
PUT /my_index/_settings
{
  "index": {
    "search.slowlog.threshold.query.warn": "10s",
    "search.slowlog.threshold.query.info": "5s",
    "search.slowlog.threshold.query.debug": "2s",
    "search.slowlog.threshold.query.trace": "500ms"
  }
}

# 配置写入慢日志
PUT /my_index/_settings
{
  "index": {
    "indexing.slowlog.threshold.index.warn": "10s",
    "indexing.slowlog.threshold.index.info": "5s"
  }
}

# 设置慢日志记录级别
PUT /my_index/_settings
{
  "index": {
    "search.slowlog.level": "info"
  }
}

⚙️ 分片分配控制

参数 默认值 说明
index.routing.allocation.enable all 分片分配策略
index.routing.allocation.total_shards_per_node -1 每节点最大分片数
index.routing.allocation.include.* - 分配到包含指定属性的节点
index.routing.allocation.exclude.* - 不分配到包含指定属性的节点
index.routing.allocation.require.* - 必须分配到包含指定属性的节点
allocation.enable 选项
说明
all 允许所有分片分配(默认)
primaries 只允许主分片分配
new_primaries 只允许新索引的主分片分配
none 禁止分片分配
配置示例
bash 复制代码
# 限制每个节点最多分配该索引的 2 个分片
PUT /my_index/_settings
{
  "index": {
    "routing.allocation.total_shards_per_node": 2
  }
}

# 将索引迁移到热节点
PUT /my_index/_settings
{
  "index": {
    "routing.allocation.require.box_type": "hot"
  }
}

# 将索引迁移到冷节点(归档)
PUT /my_index/_settings
{
  "index": {
    "routing.allocation.require.box_type": "cold"
  }
}

# 从特定节点排除
PUT /my_index/_settings
{
  "index": {
    "routing.allocation.exclude._name": "node-1"
  }
}

🎯 索引生命周期(ILM)相关

参数 默认值 说明
index.lifecycle.name - 关联的 ILM 策略名称
index.lifecycle.rollover_alias - rollover 使用的别名
index.lifecycle.indexing_complete false 标记索引已完成写入
配置示例
bash 复制代码
# 关联 ILM 策略
PUT /my_index/_settings
{
  "index": {
    "lifecycle.name": "my_policy"
  }
}

# 取消 ILM 策略关联
PUT /my_index/_settings
{
  "index": {
    "lifecycle.name": null
  }
}

📋 索引参数快速参考表

写入优化
场景 参数调整
批量导入 refresh_interval: -1, number_of_replicas: 0
日志场景 refresh_interval: 30s, translog.durability: async
高吞吐写入 translog.flush_threshold_size: 1gb
查询优化
场景 参数调整
深度分页 使用 search_after,不要调大 max_result_window
大量 terms 查询 max_terms_count: 100000
开启慢日志 配置 slowlog 阈值
存储优化
场景 参数调整
冷数据/归档 codec: best_compression, 迁移到冷节点
热数据 codec: default, 放在 SSD 节点
批量导入最佳实践
bash 复制代码
# 1. 导入前调整设置
PUT /my_index/_settings
{
  "index": {
    "refresh_interval": "-1",
    "number_of_replicas": 0,
    "translog.durability": "async"
  }
}

# 2. 执行批量导入...

# 3. 导入后恢复设置
PUT /my_index/_settings
{
  "index": {
    "refresh_interval": "1s",
    "number_of_replicas": 1,
    "translog.durability": "request"
  }
}

# 4. 手动刷新并 force merge
POST /my_index/_refresh
POST /my_index/_forcemerge?max_num_segments=5

线程池配置

🔥 核心线程池

线程池 用途 关键参数
search 搜索查询 size=25, queue=1000
write 写入/更新/删除 size=16, queue=10000
get GET 请求 size=16, queue=1000
analyze 分析请求 size=1, queue=16
refresh 刷新操作 动态调整
flush flush 操作 动态调整

线程池类型

类型 说明
fixed 固定大小,超出进队列
scaling 动态伸缩(core → max)

查看线程池状态

bash 复制代码
# 查看所有线程池
GET /_cat/thread_pool?v

# 查看详细信息
GET /_cat/thread_pool?v&h=name,active,queue,rejected,size,type

# 查看 search 线程池
GET /_cat/thread_pool/search?v

关键指标

  • active:正在执行的线程数
  • queue:等待队列中的任务数
  • rejected:被拒绝的请求数(⚠️ 重要!)

⚠️ rejected 不为 0 怎么办?

  1. search rejected:查询压力大

    • 增加节点
    • 优化查询语句
    • 增加 queue_size(临时)
  2. write rejected:写入压力大

    • 降低写入速率
    • 增加节点
    • 检查是否有慢写入

内存与熔断器

🔥 熔断器参数

熔断器 默认限制 说明
total 95% 总内存限制
fielddata 40% fielddata 缓存
request 60% 单个请求内存
inflight_requests 100% 传输中请求

详细说明

复制代码
indices.breaker.total.limit          # 总熔断器
indices.breaker.fielddata.limit      # fielddata 熔断器
indices.breaker.request.limit        # 请求熔断器
network.breaker.inflight_requests.limit  # 传输熔断器

熔断器触发表现

bash 复制代码
# 查询报错示例
{
  "error": {
    "type": "circuit_breaking_exception",
    "reason": "[parent] Data too large..."
  }
}

调参建议

bash 复制代码
# 查看熔断器状态
GET /_nodes/stats/breaker

# 调整熔断器限制(谨慎操作)
PUT /_cluster/settings
{
  "persistent": {
    "indices.breaker.total.limit": "90%",
    "indices.breaker.fielddata.limit": "30%",
    "indices.breaker.request.limit": "50%"
  }
}

内存相关参数

参数 说明
indices.memory.index_buffer_size 索引缓冲区大小(默认10%)
indices.fielddata.cache.size fielddata 缓存大小
indices.queries.cache.size 查询缓存大小(默认10%)
indices.requests.cache.size 请求缓存大小(默认1%)

搜索相关配置

🔥 核心参数

参数 默认值 说明
max_buckets 65535 聚合桶最大数量
max_open_scroll_context 500 最大 scroll 上下文数
default_search_timeout -1 默认搜索超时(-1=无限)
max_keep_alive 24h scroll 最大保持时间

调参示例

bash 复制代码
# 增加聚合桶限制
PUT /_cluster/settings
{
  "persistent": {
    "search.max_buckets": 100000
  }
}

# 设置默认搜索超时
PUT /_cluster/settings
{
  "persistent": {
    "search.default_search_timeout": "30s"
  }
}

Scroll 相关

bash 复制代码
# 查看当前 scroll 上下文
GET /_nodes/stats/indices/search

# 清除所有 scroll
DELETE /_search/scroll/_all

集群发现与故障检测

🔥 核心参数

参数 默认值 说明
leader_check.interval 1000ms leader 检查间隔
leader_check.timeout 10000ms leader 检查超时
leader_check.retry_count 3 leader 检查重试次数
follower_check.interval 1000ms follower 检查间隔
follower_check.timeout 10000ms follower 检查超时
follower_check.retry_count 3 follower 检查重试次数

故障检测逻辑

复制代码
故障判定时间 = interval × retry_count + timeout
默认 = 1s × 3 + 10s = 13秒

调参场景

bash 复制代码
# 更快检测故障(适合稳定网络)
PUT /_cluster/settings
{
  "persistent": {
    "cluster.fault_detection.leader_check.timeout": "5000ms",
    "cluster.fault_detection.follower_check.timeout": "5000ms"
  }
}

# 更宽容的故障检测(适合不稳定网络)
PUT /_cluster/settings
{
  "persistent": {
    "cluster.fault_detection.leader_check.timeout": "30000ms",
    "cluster.fault_detection.leader_check.retry_count": 5
  }
}

常用调参命令

查看当前配置

bash 复制代码
# 查看所有集群配置
GET /_cluster/settings?include_defaults=true

# 只看 persistent 和 transient
GET /_cluster/settings

# 查看特定配置
GET /_cluster/settings?flat_settings=true&filter_path=**.recovery*

修改配置

bash 复制代码
# 持久化修改(推荐)
PUT /_cluster/settings
{
  "persistent": {
    "参数名": "参数值"
  }
}

# 临时修改
PUT /_cluster/settings
{
  "transient": {
    "参数名": "参数值"
  }
}

# 重置为默认值(设为 null)
PUT /_cluster/settings
{
  "persistent": {
    "参数名": null
  }
}

常用监控命令

bash 复制代码
# 集群健康
GET /_cluster/health

# 节点状态
GET /_cat/nodes?v

# 分片状态
GET /_cat/shards?v

# 恢复进度
GET /_cat/recovery?v&active_only=true

# 未分配分片原因
GET /_cluster/allocation/explain

调参最佳实践

✅ 推荐做法

  1. 先测试后生产:在测试环境验证参数效果
  2. 使用 persistent:避免重启后配置丢失
  3. 记录变更:记录每次调参的原因和效果
  4. 监控指标:调参后观察相关监控指标
  5. 逐步调整:不要一次改太多参数

❌ 避免做法

  1. 直接修改 elasticsearch.yml(需要重启)
  2. 在业务高峰期调参
  3. 一次性调整多个参数
  4. 不了解参数含义就调整
  5. 忽略调参后的监控

快速参考卡片

扩容/恢复加速

bash 复制代码
PUT /_cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.node_concurrent_recoveries": 16,
    "cluster.routing.allocation.cluster_concurrent_rebalance": 4,
    "indices.recovery.max_bytes_per_sec": "200mb"
  }
}

禁止分片移动(维护时)

bash 复制代码
PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.enable": "none"
  }
}

恢复分片分配

bash 复制代码
PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.enable": "all"
  }
}

解除索引只读

bash 复制代码
PUT /_all/_settings
{
  "index.blocks.read_only_allow_delete": null
}

索引参数查看命令

查看索引设置

bash 复制代码
# 查看单个索引的所有设置
GET /my_index/_settings

# 查看包括默认值在内的所有设置
GET /my_index/_settings?include_defaults=true

# 查看多个索引设置
GET /index1,index2/_settings

# 查看所有索引设置
GET /_all/_settings

# 使用通配符
GET /log-*/_settings

查看索引 Mapping

bash 复制代码
# 查看索引 mapping
GET /my_index/_mapping

# 查看特定字段 mapping
GET /my_index/_mapping/field/field_name

查看索引统计

bash 复制代码
# 查看索引统计信息
GET /my_index/_stats

# 查看特定统计项
GET /my_index/_stats/docs,store,indexing,search

# 查看所有索引统计
GET /_stats

查看索引健康状态

bash 复制代码
# 查看索引列表
GET /_cat/indices?v

# 查看特定索引
GET /_cat/indices/my_index?v

# 按磁盘使用排序
GET /_cat/indices?v&s=store.size:desc

# 只看红色/黄色索引
GET /_cat/indices?v&health=red
GET /_cat/indices?v&health=yellow

相关推荐
OpenCSG2 小时前
AgenticOps 如何重构企业 AI 的全生命周期管理体系
大数据·人工智能·深度学习
阿里云大数据AI技术2 小时前
漫画说:为什么你的“增量计算”越跑越慢?——90%的实时数仓团队都踩过的坑,藏在这几格漫画里
大数据·人工智能
电商API_180079052472 小时前
批量获取电商商品数据的主流技术方法全解析
大数据·数据库·人工智能·数据分析·网络爬虫
Zoey的笔记本3 小时前
敏捷与稳定并行:Scrum看板+BPM工具选型指南
大数据·前端·数据库·python·低代码
俊哥大数据4 小时前
【项目7】 基于Flink新闻资讯大数据推荐系统
大数据·flink
Coder_Boy_4 小时前
基于SpringAI的在线考试系统-企业级软件研发工程应用规范实现细节
大数据·开发语言·人工智能·spring boot
Hello.Reader4 小时前
Flink State Processor API 读写/修复 Savepoint,把“状态”当成可查询的数据
大数据·flink
木风小助理5 小时前
Elasticsearch生产环境最佳实践指南
大数据·elasticsearch·搜索引擎
hg01185 小时前
筑梦非洲:中国电建以实干绘就中非合作新图景
大数据