Elasticsearch 集群红色状态
Elasticsearch集群的健康状态通常分为三种:绿色(Green)、黄色(Yellow)和红色(Red)。其中,红色状态表示集群中存在严重问题,可能导致数据丢失或不可用。本文将详细介绍红色状态的原因、排查方法以及如何恢复集群健康状态。
什么是Elasticsearch集群红色状态?
Elasticsearch集群的健康状态反映了集群中分片的分配情况。红色状态意味着至少有一个主分片(Primary Shard)未分配或丢失。这通常是由于节点故障、磁盘空间不足、配置错误等原因引起的。红色状态需要立即处理,因为它可能导致数据不可用或丢失。
红色状态表示集群中存在严重问题,必须立即处理以避免数据丢失。
红色状态的常见原因
- 节点故障:集群中的某个节点宕机或无法访问。
- 磁盘空间不足:节点的磁盘空间不足,导致分片无法分配。
- 配置错误:错误的配置可能导致分片无法正确分配。
- 网络问题:节点之间的网络连接问题可能导致分片无法同步。
- 索引损坏:索引文件损坏可能导致分片无法加载。
如何排查红色状态
1. 检查集群健康状态
首先,使用以下命令检查集群的健康状态:
GET /_cluster/health
输出示例:
{
"cluster_name": "my_cluster",
"status": "red",
"timed_out": false,
"number_of_nodes": 3,
"number_of_data_nodes": 2,
"active_primary_shards": 10,
"active_shards": 20,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 5,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 80.0
}
status
字段显示集群的健康状态。unassigned_shards
字段显示未分配的分片数量。
2. 查看未分配的分片
使用以下命令查看未分配的分片:
GET /_cluster/allocation/explain
输出示例:
{
"index": "my_index",
"shard": 0,
"primary": true,
"current_state": "unassigned",
"unassigned_info": {
"reason": "NODE_LEFT",
"at": "2023-10-01T12:00:00Z",
"details": "node_left[my_node]",
"last_allocation_status": "no_attempt"
},
"can_allocate": "no",
"allocate_explanation": "cannot allocate because allocation is not permitted to any of the nodes"
}
reason
字段显示分片未分配的原因。常见原因包括 NODE_LEFT
、DISK_USAGE
等。
3. 检查节点状态
使用以下命令检查节点的状态:
GET /_cat/nodes?v
输出示例:
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.1.1 45 95 5 0.15 0.10 0.05 di - node-1
192.168.1.2 60 90 7 0.20 0.15 0.10 di * node-2
192.168.1.3 - - - - - - - - node-3
如果某个节点的状态为 -
,表示该节点不可用。
4. 检查磁盘空间
使用以下命令检查节点的磁盘空间:
GET /_cat/allocation?v
输出示例:
shards disk.indices disk.used disk.avail disk.total disk.percent host ip node
5 10gb 50gb 50gb 100gb 50 192.168.1.1 192.168.1.1 node-1
5 20gb 70gb 30gb 100gb 70 192.168.1.2 192.168.1.2 node-2
0 0gb 0gb 0gb 0gb 0 192.168.1.3 192.168.1.3 node-3
如果某个节点的 disk.percent
接近 100%,表示磁盘空间不足。
恢复集群健康状态
1. 重启故障节点
如果某个节点故障,尝试重启该节点:
sudo systemctl restart elasticsearch
2. 清理磁盘空间
如果磁盘空间不足,清理不必要的文件或增加磁盘空间。
3. 重新分配分片
如果分片未分配,可以手动重新分配分片:
POST /_cluster/reroute
{
"commands": [
{
"allocate_stale_primary": {
"index": "my_index",
"shard": 0,
"node": "node-1",
"accept_data_loss": true
}
}
]
}
accept_data_loss
参数表示允许数据丢失,仅在必要时使用。
实际案例
假设一个三节点的Elasticsearch集群,其中一个节点(node-3)由于磁盘空间不足而宕机,导致部分分片未分配。通过检查集群健康状态和节点状态,发现 node-3
不可用。清理磁盘空间并重启 node-3
后,集群恢复绿色状态。
总结
Elasticsearch集群红色状态表示集群中存在严重问题,必须立即处理。通过检查集群健康状态、未分配的分片、节点状态和磁盘空间,可以快速定位问题并采取相应的恢复措施。
附加资源
练习
- 使用
GET /_cluster/health
命令检查你的Elasticsearch集群健康状态。 - 模拟一个节点故障,观察集群状态变化,并尝试恢复集群健康状态。