问题

在使用ES时,有时候在服务器突然挂掉后重启时,会导致有Shard的状态变成 了UNASSIGEND,此时,本身集群的数据是不准确的,因为这一个Shard的数据丢失了。这个时候,就需要手动去处理了。

解决方法

1. 直接强制分配一个空的shard

ES可以直接强制分配一个空的主shard,此时原本的数据就会丢失了。

请求:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
POST _cluster/reroute
{
  "commands": [
    {
      "allocate_empty_primary": {
        "index": "{{index_name}}",
        "shard": {{shard_num}},
        "node": "{{target_node}}",
        "accept_data_loss" : true
      }
    }
  ]
}

这种适合于不需要保留数据的情况。

2. 从旧数据强制分配一个shard

当某一个shard状态为unassigned时,并不一定表示它的数据丢失了,我们可以通过索引的uuid来进行查找,看是否还有保留在某一台机器上。

1
find data -name {{uuid}} | xargs ls

通过这个命令,就可以找到对应的目录下是否有响应shard的数据。

注意: 这个命令需要在当前集群的所有机器上执行,才能确保能够找到

当我们找到数据之后,只需要调用响应的API即可强制分配到当前机器,使得数据得以恢复过来:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
POST _cluster/reroute
{
  "commands": [
    {
      "allocate_stale_primary": {
        "index": "{{index_name}}",
        "shard": {{shard_num}},
        "node": "{{target_node}}",
        "accept_data_loss" : true
      }
    }
  ]
}