跳到主要内容

Elasticsearch 集群红色状态

Elasticsearch集群的健康状态通常分为三种:绿色(Green)、黄色(Yellow)和红色(Red)。其中,红色状态表示集群中存在严重问题,可能导致数据丢失或不可用。本文将详细介绍红色状态的原因、排查方法以及如何恢复集群健康状态。

什么是Elasticsearch集群红色状态?

Elasticsearch集群的健康状态反映了集群中分片的分配情况。红色状态意味着至少有一个主分片(Primary Shard)未分配或丢失。这通常是由于节点故障、磁盘空间不足、配置错误等原因引起的。红色状态需要立即处理,因为它可能导致数据不可用或丢失。

警告

红色状态表示集群中存在严重问题,必须立即处理以避免数据丢失。

红色状态的常见原因

  1. 节点故障:集群中的某个节点宕机或无法访问。
  2. 磁盘空间不足:节点的磁盘空间不足,导致分片无法分配。
  3. 配置错误:错误的配置可能导致分片无法正确分配。
  4. 网络问题:节点之间的网络连接问题可能导致分片无法同步。
  5. 索引损坏:索引文件损坏可能导致分片无法加载。

如何排查红色状态

1. 检查集群健康状态

首先,使用以下命令检查集群的健康状态:

bash
GET /_cluster/health

输出示例:

json
{
"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. 查看未分配的分片

使用以下命令查看未分配的分片:

bash
GET /_cluster/allocation/explain

输出示例:

json
{
"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_LEFTDISK_USAGE 等。

3. 检查节点状态

使用以下命令检查节点的状态:

bash
GET /_cat/nodes?v

输出示例:

plaintext
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. 检查磁盘空间

使用以下命令检查节点的磁盘空间:

bash
GET /_cat/allocation?v

输出示例:

plaintext
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. 重启故障节点

如果某个节点故障,尝试重启该节点:

bash
sudo systemctl restart elasticsearch

2. 清理磁盘空间

如果磁盘空间不足,清理不必要的文件或增加磁盘空间。

3. 重新分配分片

如果分片未分配,可以手动重新分配分片:

bash
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集群红色状态表示集群中存在严重问题,必须立即处理。通过检查集群健康状态、未分配的分片、节点状态和磁盘空间,可以快速定位问题并采取相应的恢复措施。

附加资源

练习

  1. 使用 GET /_cluster/health 命令检查你的Elasticsearch集群健康状态。
  2. 模拟一个节点故障,观察集群状态变化,并尝试恢复集群健康状态。