Elasticsearch 集群管理与监控 是保障系统高可用、性能稳定、数据安全的核心能力。本文将为你提供一份 全面、可落地的集群管理与监控详解,涵盖节点角色分配、健康状态解读、监控方案与备份恢复机制。
一、节点角色分配(Node Roles)
Elasticsearch 从 7.0 开始采用 显式角色划分,避免“全能节点”带来的资源竞争和故障风险。
1. 核心节点角色
| 角色 | 配置项 | 说明 |
|---|---|---|
| Master-Eligible | node.roles: [master] | 参与主节点选举,管理集群状态 |
| Data Node | node.roles: [data] | 存储分片,执行 CRUD、聚合等操作 |
| Ingest Node | node.roles: [ingest] | 执行 pipeline 预处理数据(如 grok 解析) |
| Coordinating Only | 无角色(默认) | 仅协调请求,不存储数据 |
| Remote Client | node.roles: [remote_cluster_client] | 用于跨集群搜索 |
✅ 一个节点可拥有多个角色,但生产环境建议 角色分离。
2. 推荐部署架构(生产环境)
| 节点类型 | 数量 | 配置建议 | 说明 |
|---|---|---|---|
| Master-Eligible | 3 | 16GB RAM, 4CPU, SSD | 奇数个,避免脑裂 |
| Data Node | N | 64GB+ RAM, 多核 CPU, 大容量磁盘 | 存储主/副本分片 |
| Ingest Node | K | 32GB RAM, 高 CPU | 执行日志解析等预处理 |
| Coordinating Only | M | 16GB RAM, 低磁盘 | 接收客户端请求,负载均衡 |
✅ 示例:
es-master-01:node.roles: [master]es-data-01:node.roles: [data]es-ingest-01:node.roles: [ingest]
3. 配置示例(elasticsearch.yml)
# es-master-01
node.name: es-master-01
node.roles: [ master ]
discovery.seed_hosts: ["es-master-01", "es-master-02", "es-master-03"]
cluster.initial_master_nodes: ["es-master-01", "es-master-02", "es-master-03"]
# es-data-01
node.name: es-data-01
node.roles: [ data ]
discovery.seed_hosts: ["es-master-01", "es-master-02", "es-master-03"]
二、集群健康状态解读(GET _cluster/health)
通过 GET /_cluster/health 查看集群整体状态。
1. 返回示例
{
"cluster_name": "my-cluster",
"status": "green",
"timed_out": false,
"number_of_nodes": 5,
"number_of_data_nodes": 3,
"active_primary_shards": 10,
"active_shards": 20,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0
}
2. 关键字段说明
| 字段 | 说明 |
|---|---|
status | 集群健康状态(green/yellow/red) |
number_of_nodes | 在线节点数 |
number_of_data_nodes | 数据节点数 |
active_primary_shards | 主分片正常分配数量 |
active_shards | 主 + 副本分片总数 |
unassigned_shards | 未分配分片数(>0 表示异常) |
relocating_shards | 正在迁移的分片数 |
initializing_shards | 正在初始化的分片数 |
3. 健康状态含义
| 状态 | 说明 | 是否可用 |
|---|---|---|
🟢 green | 所有主分片和副本都正常分配 | ✅ 完全正常 |
🟡 yellow | 主分片正常,副本未全部分配 | ⚠️ 可用,但无高可用 |
🔴 red | 有主分片未分配,部分数据不可用 | ❌ 部分数据不可访问 |
✅ 生产环境应尽量保持
green。
三、集群监控方案
方案 1:Kibana Monitoring(推荐用于快速上手)
Kibana 内置的 Stack Monitoring 模块,可直接监控:
- 集群健康、节点负载、索引性能;
- JVM 内存、GC、线程池;
- 分片分布、磁盘使用率。
启用方式
# kibana.yml
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.hosts: ["http://es-node1:9200"]
访问 Kibana → Stack Monitoring → 查看图表。
方案 2:Prometheus + Grafana(推荐用于生产)
使用 Elasticsearch Exporter 将指标暴露给 Prometheus。
1. 部署 Exporter
docker run -d \
-p 9114:9114 \
quay.io/justwatch/elasticsearch_exporter:latest \
--es.uri=http://es-node1:9200
2. Prometheus 配置
scrape_configs:
- job_name: 'elasticsearch'
static_configs:
- targets: ['localhost:9114']
3. Grafana 看板
导入官方看板:
- Elasticsearch Dashboard(ID: 2322)
- 关键面板:
- 集群健康状态
- 节点 CPU / 内存 / 磁盘
- 索引吞吐(indexing rate)
- 查询延迟(query latency)
- 分片未分配告警
4. 关键监控指标
| 指标 | 说明 |
|---|---|
elasticsearch_cluster_health_status | 0=red, 1=yellow, 2=green |
elasticsearch_nodes_jvm_memory_used_percent | JVM 内存使用率 |
elasticsearch_thread_pool_write_rejected | 写入拒绝数 |
elasticsearch_indices_search_query_time_seconds | 查询延迟 |
elasticsearch_indices_store_size_bytes | 索引大小 |
elasticsearch_shard_state{state="UNASSIGNED"} | 未分配分片 |
四、备份与恢复:Snapshot & Restore API
1. 创建快照仓库(Snapshot Repository)
快照存储在共享文件系统或云存储中。
示例:S3 仓库
PUT /_snapshot/my_backup
{
"type": "s3",
"settings": {
"bucket": "es-snapshots-prod",
"region": "us-west-1",
"access_key": "AKIA...",
"secret_key": "..."
}
}
其他类型:
fs:本地共享存储(NFS)gcs:Google Cloud Storageazure:Azure Blob Storage
✅ 仓库只需创建一次。
2. 创建快照(Backup)
全量备份
PUT /_snapshot/my_backup/snapshot-2024-06-01?wait_for_completion=true
指定索引备份
PUT /_snapshot/my_backup/snapshot-logs
{
"indices": "logs-*",
"include_global_state": false
}
wait_for_completion=true表示同步等待完成。
3. 查看快照状态
GET /_snapshot/my_backup/_all
GET /_snapshot/my_backup/snapshot-2024-06-01
4. 恢复快照(Restore)
恢复全部索引
POST /_snapshot/my_backup/snapshot-2024-06-01/_restore
恢复指定索引并重命名
POST /_snapshot/my_backup/snapshot-2024-06-01/_restore
{
"indices": "logs-2024-05-*",
"rename_pattern": "logs-(.+)",
"rename_replacement": "restored-logs-$1"
}
⚠️ 恢复前确保目标索引不存在或已关闭。
5. 自动化备份(ILM + Scheduled Job)
使用 Curator 或定时脚本:
# 每天凌晨备份
0 2 * * * curl -X PUT "http://localhost:9200/_snapshot/my_backup/daily-$(date +\%Y-\%m-\%d)"
或使用 Elastic Agent + Fleet 实现自动化运维。
五、最佳实践 checklist ✅
| 项目 | 建议 |
|---|---|
| 节点角色 | 生产环境分离 master/data/ingest |
| 主节点数 | 3 或 5,奇数 |
| 集群健康 | 监控 unassigned_shards |
| 监控方案 | Prometheus + Grafana(生产) |
| 快照仓库 | 使用 S3/OSS 等持久化存储 |
| 备份频率 | 每日一次,保留 7~30 天 |
| 恢复演练 | 每季度执行一次灾备恢复测试 |
859

被折叠的 条评论
为什么被折叠?



