Elasticsearch UNASSIGNED索引分片问题分析

in 互联网技术 with 0 comment  访问: 5,280 次

No.1 问题状态

线上突然有一台服务器宕机重启了,从而导致Elastisearch集群有些索引的分片出现UNASSIGNED的状态,情况如下:

[root@mes1 ~]# curl -s -XGET 'http://127.0.0.1:9200/_cat/shards?h=index,shard,prirep,state,unassigned.reason' |grep UNASS
osagent_20180422 6  p UNASSIGNED NODE_LEFT 
osagent_20180423 9  p UNASSIGNED NODE_LEFT 
osagent_20180424 9  p UNASSIGNED NODE_LEFT 

每行都列出了索引的名称,分片号,它是主分片还是副本分片,以及未分配的原因。从字段NODE_LEFT可以看出是因为集群中有节点脱离集群导致的。

No.2 分析问题

当节点离开集群时,主节点会暂时延迟碎片重新分配以避免在重新平衡碎片中不必要地浪费资源,原因是原始节点能够在特定时间段内(默认情况下为一分钟)恢复。

所以这种情况可以查看日志是不是因为碎片分配延迟问题,查看日志如下:

[root@des1 logs]# grep -i --color 'unassigned shards, next check in' ./* -r
./DES.log.2018-04-22:[2017-12-23 14:49:51,211][INFO ][cluster.routing          ] [des1] delaying allocation for [6] unassigned shards, next check in [59.9s]
./DES.log.2018-04-23:[2017-12-25 12:03:52,018][INFO ][cluster.routing          ] [des1] delaying allocation for [9] unassigned shards, next check in [59.9s]
./DES.log.2018-04-24:[2017-12-28 12:04:15,912][INFO ][cluster.routing          ] [des1] delaying allocation for [9] unassigned shards, next check in [59.9s]

所以正式由于分片延迟分配超出1min,导致主分片不可用。

No.3 问题解决

如果你认为未分配的分片的所属索引是你不需要的,那可以删除索引,让集群恢复Green状态。

当一个节点脱离集群后,然后在重新加入后,索引分片恢复的时候中间会进行大量的网络I/O,所以遇到较大的索引的时候,可能有些索引分配恢复超出1min,所以我们可以设置延时分配时间参数index.unassigned.node_left.delayed_timeout 来加大延时分配时间,设置如下:

PUT /_all/_settings
{
  "settings": {
    "index.unassigned.node_left.delayed_timeout": "3m"
  }
}

上述设置将分片重新分配延迟到3分钟之后,这样就可以等节点完全起来。

临时解决,让集群快速恢复的话,如果你不在意不能分配分片数据的话,设置如下:

curl -XPOST 'localhost:9200/_cluster/reroute' -d 
'{ "commands" :
      [ { "allocate" : 
          { "index" : "osagent", "shard" : 6, "node": "<NODE_ID>", "allow_primary": "true" }
      }]
}'

强制分配主分片后你将得到的是一个“空的”分片。

节点id你可以通过如下API获取:

curl 'localhost:9200/_nodes/process?pretty'
WeZan