Docker化Elasticsearch实例损坏Translog的修复方案问询
问题:Docker化Elasticsearch中修复损坏Translog的可行方案
核心疑问:在Docker化的Elasticsearch实例中无法运行elasticsearch-shard工具,该如何修复导致ES崩溃的偶发损坏Translog错误?
背景
本地通过docker-compose运行Elasticsearch集群已有一段时间,今日启动时崩溃,报错:
TranslogCorruptedException[translog from source [/usr/share/elasticsearch/data/nodes/0/indices/0eNM-3niSvS0BUwAHf9M0w/0/translog/translog-175.tlog] is corrupted
集群健康状态为red,存在2个未分配分片,Kibana无法正常加载。
已尝试的方法及问题
直接在ES容器内运行修复工具
运行bin/elasticsearch-shard remove-corrupted-data需先关闭ES,但ES容器依赖ES进程存活,停止ES后容器立即退出,无法执行修复命令:## 进入Docker容器 docker exec -it 43146ff2a50c bash ## 终止elasticsearch进程 pkill -f elasticsearch执行后容器直接终止,无法继续操作。
使用Ubuntu容器挂载相同数据卷运行修复工具
在docker-compose中新增基于Ubuntu的容器,挂载ES数据卷并安装Elasticsearch,尝试运行修复命令,但工具报错:#6 1.265 WARNING: Elasticsearch MUST be stopped before running this tool. #6 1.265 #6 1.360 Exception in thread "main" ElasticsearchException[no node folder is found in data folder(s), node has not been started yet?] ...工具无法识别数据卷中的ES节点数据。
解决方案
方案1:使用官方ES镜像直接运行修复工具
官方ES镜像自带elasticsearch-shard工具,只需修改启动命令,让容器启动时不运行ES,直接执行修复操作:
- 停止所有ES容器:
docker-compose down - 临时修改目标节点的docker-compose配置,替换启动命令:
es01: image: docker.elastic.co/elasticsearch/elasticsearch:7.x # 保留原有的environment、volumes、ulimits等配置 command: ["/usr/share/elasticsearch/bin/elasticsearch-shard", "remove-corrupted-data", "--path.data", "/usr/share/elasticsearch/data"] - 启动临时容器执行修复:
容器执行完修复命令后会自动退出。docker-compose up es01 - 恢复原docker-compose配置,重新启动集群:
docker-compose up -d
方案2:手动删除损坏的Translog文件(风险中等)
若修复工具无法运行,可直接删除损坏的Translog文件:
- 停止ES集群:
docker-compose down - 查看数据卷的宿主机路径:
docker volume inspect ${ES_01_DATA_VOLUME} - 进入损坏的Translog目录,删除报错中提及的损坏文件及对应checkpoint文件:
cd /宿主机路径/nodes/0/indices/0eNM-3niSvS0BUwAHf9M0w/0/translog/ rm translog-175.tlog translog-175.ckp - 重新启动集群,ES会自动重建Translog,可能丢失最后未提交的少量数据。
方案3:强制分片重新初始化(数据丢失风险高)
若上述方法均无效,可强制ES放弃损坏分片并重新初始化:
- 启动集群(即使状态为red):
docker-compose up -d - 执行API命令强制初始化未分配的主分片:
需替换curl -XPUT "http://localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d' { "persistent": { "cluster.routing.allocation.enable": "all" } } ' curl -XPOST "http://localhost:9200/_cluster/reroute?pretty" -H 'Content-Type: application/json' -d' { "commands": [ { "allocate_stale_primary": { "index": "plant_pod_application_log", "shard": 0, "node": "es01", "accept_data_loss": true } } ] } 'index、shard、node为实际值,此操作会丢失该分片上未同步的数据。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

