背景
es版本:6.4
因为一次集群异常,重启es集群后显示unassigned shareds。以下是解决办法
注意:如果网上其他博客的方法执行curl命令总报错的时候,一定要去官网,选择自己的版本,查看cluster reroute的文档。很可能是字段错了!!!
文档链接给大家留在最后的参考文档了,可点进去自行选择版本。
1.获取unassigned shareds信息
curl elasticsearch_ip:9400/_cat/shards > UNASSIGNED.txt
进行筛选用于脚本处理(此命令主要筛选出unassigned状态的分片的index和shard两列)
cat UNASSIGNED.txt | grep UNASSIGNED | awk '{print $1,$2}' | uniq > UNASSIGNED-2.txt
2.使用脚本重新分配主分片路由
由于是6.4版本使用其他博客中的"allocate"都无效。
查阅官网,此版本要使用"allocate_replica"。
但是由于主分片也有问题,所以要使用这个"allocate_stale_primary",将主分片分配给保存过时副本的节点。官网文档说明了,这个要慎用,可能造成数据丢失。还是先尝试"allocate_replica"。
cat /root/UNASSIGNED-2.txt | while read line;do
index_name=`echo $line | awk '{print $1}'`
shard_name=`echo $line | awk '{print $2}'`
curl -H 'Content-type: application/json' -XPOST 'http://172.24.27.124:9400/_cluster/reroute' -d '{
"commands": [
{
"allocate_stale_primary": {
"index": "'$index_name'",
"shard": '$shard_name',
"node": "g83t-f8sRHS88r_mwVn76Q",
"accept_data_loss": true
}
}
]
}'
done
index:填写索引名称
shard:填写分片id
node:观察UNASSIGNED.txt文件,看分片不在哪个节点上,就填写哪个节点。
node值查看方式
curl elasticsearch:9400/_nodes/process?pretty