在生产环境中,Elasticsearch 副本的健康状态 直接关系到集群的高可用性、数据安全和查询性能。一个完善的 副本健康监控看板(Replica Health Dashboard) 能够帮助运维和开发团队:
实时发现副本未分配、同步延迟等问题; 快速定位故障节点或索引; 预防数据丢失风险; 优化副本配置与资源分配。
本文将为你设计一套 完整、可落地的 Elasticsearch 副本健康监控看板方案 ,涵盖数据采集、指标设计、告警规则、可视化展示与自动化建议。
一、目标与核心功能
✅ 核心目标
全面监控主/副本分片状态; 实时识别异常副本(UNASSIGNED、DELAYED、OUT_OF_SYNC); 提供根因分析与修复建议; 支持多集群管理; 可视化 + 告警 + 自动化联动。
🧩 功能清单
模块 功能 🔹 数据采集 从 ES 集群获取分片、节点、索引级指标 🔹 健康分析 计算副本健康度、同步延迟、分配状态 🔹 根因诊断 关联磁盘、CPU、网络等资源指标 🔹 可视化看板 Grafana / Kibana 展示关键指标 🔹 告警系统 支持邮件、钉钉、企业微信通知 🔹 修复建议 自动生成恢复命令或工单 🔹 API 接口 供外部系统集成
二、系统架构设计
+---------------------+
| Elasticsearch Cluster |
+----------+----------+
|
v
+------------------------+
| 数据采集器(Collector) | ← 定时调用 _cat/shards, _cluster/health, _nodes/stats
+----------+-------------+
|
v
+------------------------+
| 时间序列数据库(TSDB) | → Prometheus / InfluxDB / Elasticsearch 自身
+----------+-------------+
|
v
+------------------------+
| 分析引擎(Analyzer) | → 计算健康分、延迟、趋势
+----------+-------------+
|
v
+------------------------+
| 告警引擎 & Dashboard | → Grafana / Kibana / 自研前端
+------------------------+
|
v
+------------------------+
| 通知中心 & 自动化工具 | → 钉钉机器人 / 工单系统 / 脚本执行
+------------------------+
✅ 可部署为独立服务,也可作为 Kibana 插件。
三、关键监控指标设计
1. 分片级指标(核心)
指标 来源 说明 shard.state_cat/shardsSTARTED, INITIALIZING, UNASSIGNED shard.type_cat/shardsp (primary), r (replica) shard.node_cat/shards所在节点 shard.unassigned.reason_cluster/allocation/explain未分配原因 shard.sync_id_cat/shards同步标识(用于判断是否一致)
2. 集群与节点级指标
指标 来源 说明 cluster.status_cluster/healthgreen, yellow, red node.disk.used_percent_nodes/stats/fs磁盘使用率 >85% 可能导致副本无法分配 node.cpu.percent_nodes/stats/osCPU 过高影响同步 node.jvm.mem.heap_used_percent_nodes/stats/jvm内存压力 recovery.current_recovery正在恢复的副本数
3. 自定义健康度指标(计算得出)
指标 计算方式 说明 replica_health_score(healthy_replicas / total_replicas) * 100副本健康百分比 unassigned_replica_countcount(shard.state=UNASSIGNED AND shard.type=r)未分配副本数 replica_lag_seconds主副本 translog.generation 差值估算 同步延迟(间接) replica_distribution_balance副本在节点间的标准差 分布是否均匀
四、数据采集实现
1. 采集频率
2. 采集 API 列表
GET /_cat/shards?format= json& h = index,shard,prirep,state,docs,store,node
GET /_cluster/health?level= shards& format = json
GET /_nodes/stats/fs,os,jvm,thread_pool?format= json
GET /_recovery?active_only= true& format = json
GET /_cluster/allocation/explain
五、健康分析与根因诊断
1. 副本状态分类
状态 严重性 可能原因 建议操作 ✅ STARTED 正常 - 无 ⚠️ INITIALIZING 警告 正在恢复 监控进度 ❌ UNASSIGNED 严重 磁盘满、节点离线、手动禁用 排查原因并修复 ⚠️ RELOCATING 警告 正在迁移 正常操作
2. 常见 UNASSIGNED 原因分析
通过 allocation/explain 获取:
reason说明 修复建议 ALLOCATION_FAILED上次分配失败 查看日志 CLUSTER_RECOVERED集群恢复中 等待自动恢复 INDEX_REOPENED索引重新打开 通常自动恢复 DANGLING_INDEX_IMPORTED悬空索引导入 手动确认 NODE_LEFT节点离线 恢复节点或迁移分片 NO可分配但未分配 检查 cluster.routing.allocation.enable
3. 同步延迟判断(间接)
虽然 ES 不直接暴露“副本延迟秒数”,但可通过以下方式估算:
比较主副本的 translog.generation; 监控 indexing_pressure 写入压力; 观察 recovery 进度。
六、可视化看板设计(Grafana 示例)
1. 主要面板
面板 内容 图表类型 🟢 集群整体健康 green/yellow/red 状态趋势 Gauge + Time series 📊 副本健康度 replica_health_score 趋势Time series 🚫 未分配副本 TOP 10 按索引/节点统计 Bar chart 🔁 正在恢复的副本 recovery.current 实时数量Singlestat 💾 磁盘使用率热力图 各节点磁盘使用率 Heatmap 🧩 分片分布矩阵 主副本是否同节点 Table with color coding 📈 同步延迟估算 translog 差值趋势 Time series
2. 示例 PromQL 查询(Prometheus + ES Exporter)
# 未分配副本数
sum(elasticsearch_shard_status{state="UNASSIGNED", prirep="r"}) by (index, node)
# 副本健康率
(
sum(elasticsearch_shard_status{state="STARTED", prirep="r"})
/
sum(elasticsearch_shard_status{prirep="r"})
) * 100
# 节点磁盘使用率
elasticsearch_node_fs_used_percent{job="elasticsearch"}
✅ 使用 Elasticsearch Exporter for Prometheus
七、告警规则设计
1. 告警规则(YAML 格式)
- name : "Replica Unassigned"
expr : |
sum(elasticsearch_shard_status{state="UNASSIGNED", prirep="r"}) by (index) > 0
for : 5m
labels :
severity : critical
annotations :
summary : "副本分片未分配"
description : "索引 {{ $labels.index }} 有副本未分配,请检查节点状态或磁盘空间"
- name : "Cluster Status Red"
expr : elasticsearch_cluster_health_status == 0
for : 2m
labels :
severity : critical
- name : "High Disk Usage"
expr : elasticsearch_node_fs_used_percent > 85
for : 10m
labels :
severity : warning
2. 通知渠道
邮件 钉钉机器人 企业微信 Slack 自研工单系统(如 Jira)
八、自动化修复建议引擎
当检测到异常时,自动生成可执行建议:
问题 建议 磁盘满导致 UNASSIGNED “清理节点磁盘或迁移分片” cluster.routing.allocation 被禁用 PUT /_cluster/settings { "cluster.routing.allocation.enable": "all" }节点离线 “检查节点是否宕机” 副本数 > 节点数 “减少副本数或扩容节点”
可集成到看板中,提供“一键修复”按钮(需权限控制)。
九、部署方式
方案一:Prometheus + Grafana(推荐)
使用 elasticsearch_exporter 采集指标; 存储到 Prometheus; Grafana 展示 + Alertmanager 告警。
方案二:Kibana + Beats
使用 Metricbeat 监控 ES; 数据写入 ES 自身; Kibana 可视化。
方案三:自研服务 + Elasticsearch 存储
采集器将指标写入专用索引(如 monitoring-replica-*); 提供 REST API 和前端。
十、最佳实践 checklist ✅
项目 建议 采集频率 10~30s 数据保留 30~90 天 告警去重 使用 labels 分组 权限控制 限制“修复操作”权限 多集群支持 支持监控多个 ES 集群 压力测试 模拟节点宕机验证告警有效性
十一、扩展建议
场景 建议 自动修复 对可操作问题(如启用 allocation)提供自动化脚本 历史对比 对比“修复前后”的健康状态 容量预测 预测未来副本增长与资源需求 与 CI/CD 集成 新索引上线前检查副本策略 AI 异常检测 使用 LSTM 模型预测副本故障