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

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

<think>首先,用户的问题是:“我想解决Elasticsearch服务启动失败的问题,错误信息为'dependency failed to start: container elasticsearch exited (70)' 请问elasticsearch container exited with code 70 dependency failed to start”。这似乎是关于Elasticsearch服务启动失败的问题,具体错误是“dependency failed to start: container elasticsearch exited (70)”,意思是依赖项启动失败,容器Elasticsearch退出,代码70。 现在,我需要根据系统级指令来构建回答: 1. **行内数学表达式使用$...$格式**:用户的问题不涉及数学表达式,所以在这个上下文中可能不需要。但如果我讨论任何数学概念(如概率或算法),我需要使用它。这里,问题主要是技术性的,所以可能不适用。 2. **独立公式使用$$...$$格式**:同样,可能不需要,除非有公式。 3. **LaTeX语法正确**:确保所有LaTeX正确。 4. **使用中文回答**:整个回答必须用中文。 5. **生成相关问题**:在回答后添加相关问题。 6. **引用标识**:在回答中引用的段落末尾添加引用标识如[^1]。用户提供了几个引用,我需要参考它们。用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。”但用户没有提供上一次的问题,所以我应该基于这些引用和当前问题来回答。 用户提供的引用: - [^1]: 关于创建嵌入式节点获取Elasticsearch客户端。 - [^2]: Elasticsearch版本部署问题,包括yum仓库配置和安装。 - [^3]: 关于高等级REST客户端的依赖问题。 - [^4]: 运行grunt server时启动Elasticsearch head。 - [^5]: CentOS7下使用ELK搭建日志平台,包括下载链接。 错误信息是“container elasticsearch exited (70)”,这暗示可能是在容器化环境中运行Elasticsearch,比如Docker。错误代码70通常表示某种资源不足或配置错误。 在Linux中,退出代码70可能表示“EX_SOFTWARE”,意思是内部软件错误。但在Elasticsearch上下文中,它可能与特定问题相关。 常见原因: - **内存不足**:Elasticsearch需要足够的内存。如果JVM heap size设置不当,可能导致崩溃。 - **文件权限**:Elasticsearch需要写访问权限到数据目录。 - **配置错误**:如elasticsearch.yml中的错误设置。 - **依赖服务失败**:错误说“dependency failed to start”,所以可能有其他服务依赖失败。 用户提到“container elasticsearch”,所以很可能是在Docker或类似容器中运行。 参考用户提供的引用: - [^2] 提到安装Elasticsearch via yum,所以可能是在Linux系统上。 - [^4] 提到localhost:9100,这是Elasticsearch head的端口。 - [^5] 是关于ELK栈的安装。 但错误是“container elasticsearch exited”,所以可能用户在使用Docker。 我应该构建一个结构化的回答,帮助用户逐步解决问题。 回答结构: 1. **理解问题**:解释错误代码70的含义。 2. **常见原因**:列出可能的原因。 3. **逐步排查**:提供诊断步骤。 4. **解决方案**:建议修复方法。 5. **引用相关**:如果需要,引用用户提供的引用。 最后,生成相关问题。 确保回答用中文。 **步骤1: 理解错误代码70** 在Linux中,退出代码70通常表示“EX_SOFTWARE”,意思是“internal software error”。对于Elasticsearch,这可能由于JVM崩溃、配置错误或资源不足引起。 **步骤2: 常见原因** - **内存不足**:Elasticsearch的JVM heap size设置不当。默认是1GB,如果系统内存不足,可能导致OOM错误。 - **文件权限**:数据目录或日志目录权限不正确。 - **配置错误**:elasticsearch.yml中的设置错误,如网络绑定、集群名称等。 - **依赖服务**:错误说“dependency failed to start”,所以可能有其他服务如systemd依赖失败。或者在容器中,依赖容器未启动。 - **端口冲突**:另一个进程占用Elasticsearch端口(默认9200)。 - **系统资源**:如文件描述符限制、虚拟内存设置不足。 **步骤3: 逐步排查** 引导用户检查日志:Elasticsearch日志通常在/var/log/elasticsearch/或容器日志中。 命令: - 查看日志:`journalctl -u elasticsearch` 或 `docker logs <container_id>` - 检查内存:`free -h` - 检查配置:`grep -v '^#' /etc/elasticsearch/elasticsearch.yml` **步骤4: 解决方案** - 调整JVM heap size:编辑/etc/elasticsearch/jvm.options,设置-Xms和-Xmx为适当值(如512m或1g)。 - 确保权限:`chown -R elasticsearch:elasticsearch /var/lib/elasticsearch /var/log/elasticsearch` - 检查端口:`netstat -tuln | grep 9200` - 如果使用容器,确保正确配置。 引用用户引用:用户提到了[^2]关于安装,所以可能涉及安装问题。[^5]提到ELK搭建,但错误是启动失败。 **生成相关问题**:在末尾添加相关问题。 确保回答清晰、可靠。 最终回答结构: - 介绍问题。 - 解释错误代码。 - 列出可能原因。 - 提供诊断步骤。 - 建议解决方案。 - 添加相关问题。</think>### Elasticsearch服务启动失败问题解决:错误“dependency failed to start: container elasticsearch exited (70)” 您好!您的Elasticsearch服务启动失败,错误信息“dependency failed to start: container elasticsearch exited (70)”表明Elasticsearch容器在启动过程中因依赖项问题而退出,退出代码70通常表示“内部软件错误”(EX_SOFTWARE)。这通常与资源不足、配置错误或系统依赖问题相关。我将一步步引导您排查和解决此问题。以下内容基于常见Elasticsearch部署经验,并结合您提供的引用信息[^2][^5](涉及安装和配置)。请确保以root或sudo权限执行命令。 --- ### 1. **理解错误代码70的含义** - 退出代码70在Linux系统中定义为“EX_SOFTWARE”,表示软件内部错误(如JVM崩溃、配置冲突或资源不足)。 - 在Elasticsearch上下文中,这通常由以下原因引起: - **内存不足**:JVM heap size设置不当或系统内存不足。 - **文件权限问题**:Elasticsearch无法访问数据目录或日志目录。 - **配置错误**:`elasticsearch.yml` 或 `jvm.options` 文件中的无效设置。 - **依赖服务失败**:系统级依赖(如systemd服务)或容器环境(如Docker)中的依赖未启动。 - **端口冲突**:默认端口9200或9300被占用。 - **系统资源限制**:文件描述符或虚拟内存不足。 - 参考您之前的部署信息[^2],您可能通过yum安装了Elasticsearch(版本5.x),这增加了配置错误或版本兼容性问题的可能性。 --- ### 2. **常见原因及诊断步骤** 以下是基于错误代码70的常见原因,以及如何逐步诊断。**首先检查日志**:日志是定位问题的关键。Elasticsearch日志通常位于: - 系统安装:`/var/log/elasticsearch/elasticsearch.log` - 容器环境:使用 `docker logs <container_id>` 查看容器日志。 - 如果使用systemd服务:运行 `journalctl -u elasticsearch` 查看详细错误。 #### 步骤1: **检查内存和JVM设置** - **可能原因**:JVM heap size过大或过小导致OOM(Out of Memory)错误。Elasticsearch默认heap size为1GB,如果系统内存不足,会触发代码70。 - **诊断命令**: ```bash free -h # 查看系统内存使用情况 grep -E 'Xms|Xmx' /etc/elasticsearch/jvm.options # 检查heap size设置 ``` - **预期结果**:如果输出显示Xms或Xmx值超过可用内存(例如,在2GB内存系统上设置2GB heap),需调整。 #### 步骤2: **验证文件权限** - **可能原因**:Elasticsearch用户(通常为`elasticsearch`)无权限写入数据或日志目录。这常见于安装后未正确设置权限。 - **诊断命令**: ```bash ls -ld /var/lib/elasticsearch /var/log/elasticsearch # 检查目录权限 ps aux | grep elasticsearch # 确认进程运行用户 ``` - **预期结果**:目录应属`elasticsearch`用户。如果权限错误,日志中会显示“Permission denied”。 #### 步骤3: **检查配置错误** - **可能原因**:`elasticsearch.yml` 中的错误设置(如无效网络绑定、集群名称),或版本兼容性问题(参考您的安装信息[^2][^5])。 - **诊断命令**: ```bash grep -v '^#' /etc/elasticsearch/elasticsearch.yml # 查看有效配置 elasticsearch -V # 检查版本(如果可运行) ``` - 重点检查: - `network.host`:确保未绑定到无效IP(如`localhost`可能导致容器无法访问)。 - `cluster.name` 和 `node.name`:避免使用默认值,防止冲突。 - 如果使用容器,确保环境变量正确(如`-e "discovery.type=single-node"`)。 #### 步骤4: **排查依赖和端口冲突** - **可能原因**: - **依赖服务失败**:错误消息“dependency failed to start”表明系统级依赖(如systemd服务)未启动。或在容器中,其他容器(如Logstash)未就绪。 - **端口占用**:默认端口9200被其他进程占用。 - **诊断命令**: ```bash systemctl list-dependencies elasticsearch # 查看依赖服务 netstat -tuln | grep 9200 # 检查端口占用 docker ps -a # 如果使用容器,查看所有容器状态 ``` - 参考您的引用[^4],Elasticsearch head运行在9100端口,但9200是核心端口,需确保未被占用。 #### 步骤5: **系统资源限制** - **可能原因**:文件描述符或虚拟内存不足。Elasticsearch需要较高系统资源。 - **诊断命令**: ```bash ulimit -Hn # 检查文件描述符硬限制 ulimit -Sn # 检查文件描述符软限制 sysctl vm.max_map_count # 检查虚拟内存设置(应为262144以上) ``` - **预期结果**:如果`max_map_count`过低,日志中会显示“max virtual memory areas vm.max_map_count [65530] is too low”。 --- ### 3. **解决方案建议** 根据诊断结果,选择以下修复方法。**先备份配置文件**(如`cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak`)。 #### 修复1: **调整JVM heap size** - 编辑JVM选项文件: ```bash sudo vi /etc/elasticsearch/jvm.options ``` - 修改heap size(建议为系统内存的50%,但不超过32GB)。例如,在2GB内存系统上: ```plaintext -Xms512m -Xmx512m ``` - 保存后重启服务:`sudo systemctl restart elasticsearch`。 #### 修复2: **修复文件权限** - 设置正确权限: ```bash sudo chown -R elasticsearch:elasticsearch /var/lib/elasticsearch /var/log/elasticsearch sudo chmod 755 /var/lib/elasticsearch /var/log/elasticsearch ``` - 重启服务并检查日志。 #### 修复3: **修正配置** - 编辑主配置文件: ```bash sudo vi /etc/elasticsearch/elasticsearch.yml ``` - 确保基本设置正确(示例): ```yaml cluster.name: my-cluster node.name: node-1 network.host: 0.0.0.0 # 允许外部访问,但确保安全 http.port: 9200 discovery.type: single-node # 单节点模式,避免集群发现失败 ``` - 参考您的安装引用[^2],如果使用版本5.x,注意旧版配置语法(如`discovery.zen.ping.unicast.hosts`)。 #### 修复4: **解决依赖和端口问题** - **依赖服务**:如果使用systemd,运行 `sudo systemctl daemon-reload` 后重启:`sudo systemctl start elasticsearch`。 - **端口冲突**:终止占用进程或更改端口: ```bash lsof -i :9200 # 查找占用进程 kill -9 <PID> # 终止进程 ``` 或在`elasticsearch.yml`中修改端口:`http.port: 9201`。 - **容器环境**:如果使用Docker,确保启动命令正确。例如: ```bash docker run -d --name es-container -p 9200:9200 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.x # 使用官方镜像 ``` 参考引用[^5],在ELK环境中,确保Logstash或Kibana不冲突。 #### 修复5: **提升系统资源** - 永久设置虚拟内存: ```bash echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf sudo sysctl -p ``` - 增加文件描述符限制:编辑`/etc/security/limits.conf`,添加: ```plaintext elasticsearch - nofile 65536 elasticsearch - memlock unlimited ``` - 重启系统后测试。 #### 其他建议 - **版本兼容性**:如果您从旧版升级(如引用[^2]的5.x),考虑升级到最新稳定版(如8.x),因为旧版可能有已知bug。 - **日志分析**:如果以上步骤无效,分享日志片段(如`journalctl -u elasticsearch | tail -n 50`),我可以进一步帮助分析。 - **测试启动**:手动启动以捕获实时错误: ```bash sudo -u elasticsearch /usr/share/elasticsearch/bin/elasticsearch # 系统安装 或 docker run -it --rm docker.elastic.co/elasticsearch/elasticsearch:8.x # 容器测试 ``` --- ### 相关问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值