断电遇到的elasticsearch6.3问题:重启es集群后索引的部分分片无法正常加载(UNASSIGNED状态)。
https://github.com/memoryFuhao/elasticsearch_client (打个广告 以上链接是本人开发的一个es客户端工具,支持es大部分 CRUD操作 分页、分组、嵌套分组、and or ···,有需要的朋友可以pull代码直接使用)
问题现象:
Elasticsearch head页面点击未加载的分片出现如下错误信息:
{
"index": "objext_result",
"primary": true,
"recovery_source": {
"type": "EXISTING_STORE"
},
"shard": 0,
"state": "UNASSIGNED",
"unassigned_info": {
"allocation_status": "deciders_no",
"at": "2019-07-22T09:31:40.520Z",
"delayed": false,
"details": "failed shard on node [mHMs3pH8S_GfT6IHxu1SqA]: failed recovery, failure RecoveryFailedException[[objext_result][0]: Recovery failed on {mHMs3pH}{mHMs3pH8S_GfT6IHxu1SqA}{kkSvTMjKSkaZUTh56hBahQ}{172.17.250.36}{172.17.250.36:9300}{ml.machine_memory=135071264768, xpack.installed=true, ml.max_open_jobs=20, ml.enabled=true}];nested: IndexShardRecoveryException[failed to recover from gateway]; nested: EngineException[failed to recover from translog]; nested: TranslogCorruptedException[operation size must be at least 4 but was: 0]; ",
"failed_attempts": 5,
"reason": "ALLOCATION_FAILED"
}
}
排查问题步骤:
a)通过异常信息可以判断问题大致产生的原因:es试图通过Translog日志文件恢复数据失败(由于断电导致translog文件损坏)。
b)知道问题产生的原因后,大致有了解决问题的思路,只要将损坏的translog文件排除则可以正常启动es集群。
c)尝试方法一:找到UNASSIGNED状态shard的translog路径并清空( eg:$es安装路径/data/nodes/0/indices/cen1VhqmSRWIzXFWAaLUQw/0/translog/ ),
重启es集群查看日志,依然会报错(找不到translog文件)。该暴力方法宣布无效。
d)尝试方法二:使用es提供的translog工具清空UNASSIGNED状态shard的translog路径。( eg:$es安装路径/elasticsearch-translog truncate -d $es安装路径/data/nodes/0/indices/cen1VhqmSRWIzXFWAaLUQw/0/translog/ ),
重启es集群问题解决(注意如果用root账号操作的话,会出现translog文件权限问题,改为es用户权限即可)。
总结:
a)问题解决过程中参考的博客(es源码解析--translog):http://www.pianshen.com/article/1659213693/
b)es遇到UNASSIGNED类似的问题时,仔细查看日志信息,通过日志信息先分析问题产生原因。