Elasticsearch断电后启动异常(failed recovery, failure RecoveryFailedException)

断电遇到的elasticsearch6.3问题:重启es集群后索引的部分分片无法正常加载(UNASSIGNED状态)。


问题现象:

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类似的问题时,仔细查看日志信息,通过日志信息先分析问题产生原因。

你可能感兴趣的:(elasticsearch)