一、为什么需要关注集群健康?

就像人体需要定期体检,Elasticsearch集群也会通过"健康报告"告诉我们它的运行状态。最近某电商平台在大促期间,由于未及时监控集群状态,导致搜索服务瘫痪2小时——这个案例告诉我们,掌握集群健康监控就像掌握汽车的仪表盘,关键时刻能救命!

二、必须掌握的四大健康指标

2.1 集群状态三原色

# 使用CURL查看集群健康状态(技术栈:Elasticsearch REST API)
curl -XGET "http://localhost:9200/_cluster/health?pretty"

# 返回示例:
{
  "cluster_name" : "my-cluster",
  "status" : "yellow",   # 核心指标:green/yellow/red
  "timed_out" : false,    # 是否超时
  "number_of_nodes" : 3,  # 节点总数
  "active_shards" : 95    # 活跃分片数
}

绿色代表完全健康,黄色说明存在副本分片未分配,红色则是主分片缺失的紧急状态

2.2 节点存活监控

# Python监控脚本示例(技术栈:Python+Elasticsearch库)
from elasticsearch import Elasticsearch

es = Elasticsearch(["http://localhost:9200"])

def check_nodes():
    nodes = es.nodes.stats()["nodes"]
    online_nodes = len(nodes)
    for node_id, info in nodes.items():
        print(f"节点 {info['name']} 的JVM内存使用:{info['jvm']['mem']['heap_used_percent']}%")
    
    if online_nodes < 3:
        send_alert("节点数量异常!当前在线:{}".format(online_nodes))

# 定时执行该函数(建议间隔5分钟)

2.3 索引性能指标

# 查看索引写入性能(技术栈:Elasticsearch _nodes/hot_threads API)
curl -XGET "http://localhost:9200/_nodes/hot_threads?type=wait&interval=30s"

2.4 磁盘空间预警

// 在Kibana Dev Tools控制台执行(技术栈:Kibana Console)
PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.disk.watermark.low": "85%",
    "cluster.routing.allocation.disk.watermark.high": "90%",
    "cluster.routing.allocation.disk.watermark.flood_stage": "95%"
  }
}

三、构建监控系统的三种姿势

3.1 原生API监控方案

# 综合健康检查脚本(技术栈:Shell脚本)
#!/bin/bash
RESPONSE=$(curl -s "http://localhost:9200/_cluster/health")
STATUS=$(echo $RESPONSE | jq -r '.status')

if [ "$STATUS" = "red" ]; then
    echo "紧急状态!立即检查主分片!" | mail -s "ES集群告警" admin@example.com
elif [ "$STATUS" = "yellow" ]; then
    echo "副本分片未完全分配" >> /var/log/es_monitor.log
fi

3.2 Prometheus+Grafana可视化方案

# Prometheus配置示例(技术栈:Prometheus)
scrape_configs:
  - job_name: 'elasticsearch'
    metrics_path: "/_prometheus/metrics"
    static_configs:
      - targets: ['es-node1:9200', 'es-node2:9200']

3.3 Kibana内置监控模块

通过Stack Monitoring模块可直接查看:

  • 查询吞吐量(Queries per second)
  • 索引延迟(Indexing latency)
  • 线程池队列情况

四、典型故障排查案例

4.1 分片分配异常

# 查看未分配分片详情(技术栈:Elasticsearch CAT API)
curl -XGET "http://localhost:9200/_cat/shards?v&h=index,shard,prirep,state,unassigned.reason"

4.2 内存泄漏排查

// 分析内存使用(技术栈:Elasticsearch Nodes Stats API)
GET _nodes/stats/jvm,process?filter_path=nodes.*.jvm.mem,nodes.*.process.cpu

五、进阶监控技巧

5.1 自动扩容策略

# 根据负载自动扩展(技术栈:Kubernetes+HPA)
kubectl autoscale deployment es-data-node --cpu-percent=70 --min=3 --max=10

5.2 慢查询监控

PUT /_index_template/slowlog_template
{
  "index_patterns": ["*"],
  "template": {
    "settings": {
      "index.search.slowlog.threshold.query.warn": "10s",
      "index.search.slowlog.threshold.fetch.debug": "500ms"
    }
  }
}

六、应用场景深度解析

6.1 电商搜索场景

双十一期间需要实时监控:

  • 查询QPS突增
  • 缓存命中率下降
  • 节点负载均衡

6.2 日志分析场景

ELK架构中的典型需求:

  • 索引滚动速度
  • 磁盘写入吞吐量
  • 老化索引自动归档

七、技术方案对比分析

监控方式 优点 缺点
原生API 响应快、数据精准 需自行开发告警逻辑
Prometheus 可视化好、生态完善 需要额外维护监控系统
商业监控方案 开箱即用、功能全面 成本较高

八、必须收藏的注意事项

  1. 监控间隔不宜小于30秒,避免影响集群性能
  2. 生产环境务必设置磁盘水位线
  3. 不同版本API可能有差异(特别注意7.x与8.x的区别)
  4. 安全集群需要配置证书和权限

九、总结与展望

通过本文的"望闻问切",我们已经掌握了Elasticsearch集群健康监控的整套方法论。随着ES 8.x版本推出机器学习监控功能,未来可以期待更智能的异常预测能力。记住,好的监控不是简单的数据展示,而是能提前发现问题的预警系统。