docker下迁移elasticsearch问题以及解决方案

 更新时间:2024年11月12日 11:05:33   作者:一只牛博  
文章描述了如何将Elasticsearch数据从一个服务器迁移到另一个服务器,包括数据挂载、版本一致性、启动命令的匹配以及可能遇到的权限和节点故障问题的解决方法

docker下迁移elasticsearch问题及解决

直接上图,大致就是这样的操作

数据挂载

对于服务器A下的es如果你没有在启动容器的时候将数据挂载出来,就需要先进行docker cp,将容器中的数据拷贝到服务器中,/usr/share/elasticsearch/data

将取出的数据,或者说挂载的数据,传输到另外一个服务器中,执行启动命令

警告:这里最好版本不要变动,以及启动时候的命令也和原服务器一致

至此迁移差不多就完成了。

报错解决

权限问题

java.lang.IllegalStateException: failed to obtain node locks, tried [[/usr/share/elasticsearch/data]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])?
Likely root cause: java.nio.file.NoSuchFileException: /usr/share/elasticsearch/data/nodes/0/node.lock
        at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92)
        at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)
        at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
        at java.base/sun.nio.fs.UnixPath.toRealPath(UnixPath.java:825)
        at org.apache.lucene.store.NativeFSLockFactory.obtainFSLock(NativeFSLockFactory.java:108)
        at org.apache.lucene.store.FSLockFactory.obtainLock(FSLockFactory.java:41)
        at org.apache.lucene.store.BaseDirectory.obtainLock(BaseDirectory.java:45)
        at org.elasticsearch.env.NodeEnvironment$NodeLock.<init>(NodeEnvironment.java:229)
        at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:298)
        at org.elasticsearch.node.Node.<init>(Node.java:427)
        at org.elasticsearch.node.Node.<init>(Node.java:309)
        at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:234)
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:234)
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:434)
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:166)
        at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:157)
        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:77)
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:112)
        at org.elasticsearch.cli.Command.main(Command.java:77)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:122)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:80)
For complete error details, refer to the log at /usr/share/elasticsearch/logs/docker-cluster.log

1. 节点锁文件丢失:/usr/share/elasticsearch/data/nodes/0/node.lock 文件不存在。可能是因为文件未被正确创建,或者数据目录的权限不足,导致 Elasticsearch 无法写入。

2.  **目录或文件权限问题**:Elasticsearch 容器可能没有足够的权限访问或修改 /usr/share/elasticsearch/data 目录下的文件。

解决如下:

执行以下命令,重新启动即可

sudo chown -R 1000:1000 /acowbo/es   # 假设你将 /acowbo/es 挂载到 /usr/share/elasticsearch/data
sudo chmod -R 775 /acowbo/es

节点故障

2024-10-29 02:15:31.912 ERROR 1 --- [io-11919-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is ElasticsearchStatusException[Elasticsearch exception [type=search_phase_execution_exception, reason=all shards failed]]] with root cause

根据错误日志中的信息,Elasticsearch 报告了 all shards failed 和 no_shard_available_action_exception 错误。

这通常表示 Elasticsearch 集群中有一个或多个分片不可用

1.执行

curl -X GET "http://127.0.0.1:9200/_cluster/health?pretty"

这里你换为自己的ip和端口

{
  "cluster_name" : "docker-cluster",
  "status" : "red",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 17,
  "active_shards" : 17,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 2,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 89.47368421052632
}

Elasticsearch 集群的 status 为 red,这表示集群中有一些分片处于未分配状态,导致集群不能正常工作。

特别是,你的集群中有 2 个未分配的分片(unassigned shards),这可能导致你遇到的 all shards failed 错误。

2.执行

curl -X GET "http://156.224.28.178:9200/_cat/shards?v&pretty"

获取详细信息

3.查看分片未分配的原因

curl -X GET "http://156.224.28.178:9200/_cluster/allocation/explain?pretty" -H 'Content-Type: application/json' -d '{
  "index": "acowbo_new",
  "shard": 0,
  "primary": true
}'

4.结果如下

{
  "index" : "acowbo_new",
  "shard" : 0,
  "primary" : true,
  "current_state" : "unassigned",
  "unassigned_info" : {
    "reason" : "ALLOCATION_FAILED",
    "at" : "2024-10-29T02:26:16.215Z",
    "failed_allocation_attempts" : 5,
    "details" : "failed shard on node [GoDPmTuqSBavpUAHkq6yHQ]: failed to create index, failure IllegalArgumentException[Custom Analyzer [ik_analyzer] failed to find tokenizer under name [ik_smart]]",
    "last_allocation_status" : "no"
  },
  "can_allocate" : "yes",
  "allocate_explanation" : "can allocate the shard",
  "target_node" : {
    "id" : "GoDPmTuqSBavpUAHkq6yHQ",
    "name" : "47d6ff15662f",
    "transport_address" : "172.20.0.8:9300",
    "attributes" : {
      "ml.machine_memory" : "3973206016",
      "xpack.installed" : "true",
      "transform.node" : "true",
      "ml.max_open_jobs" : "512",
      "ml.max_jvm_size" : "268435456"
    }
  },
  "allocation_id" : "kGCNR2E2SjuOTRow7OtUEA",
  "node_allocation_decisions" : [
    {
      "node_id" : "GoDPmTuqSBavpUAHkq6yHQ",
      "node_name" : "47d6ff15662f",
      "transport_address" : "172.20.0.8:9300",
      "node_attributes" : {
        "ml.machine_memory" : "3973206016",
        "xpack.installed" : "true",
        "transform.node" : "true",
        "ml.max_open_jobs" : "512",
        "ml.max_jvm_size" : "268435456"
      },
      "node_decision" : "yes",
      "store" : {
        "in_sync" : true,
        "allocation_id" : "kGCNR2E2SjuOTRow7OtUEA"
      }
    }
  ]
}

从错误信息来看,分片未能分配的原因是由于自定义分析器 ik_analyzer 未能找到名为 ik_smart 的分词器。

这通常意味着在 Elasticsearch 的设置中配置的 ik_analyzer 依赖于一个未安装或未正确配置的分词器。

解决如下:

  • 进入容器
docker exec -it 容器名/容器id /bin/bash
  • 执行
bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.16.2/elasticsearch-analysis-ik-7.16.2.zip

这里需要看你的es是什么版本的,就安装什么版本的插件

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Docker部署的gitlab升级的详细步骤(升级到17.6.1版本)

    Docker部署的gitlab升级的详细步骤(升级到17.6.1版本)

    本文详细介绍了如何从GitLab 17.1.2版本升级到17.6.1版本,包括备份数据、确定升级路线、分步骤升级以及最终验证新版本的步骤,需要的朋友可以参考下
    2025-02-02
  • docker nginx 配置文件要点及注意事项

    docker nginx 配置文件要点及注意事项

    本文介绍了Nginx的配置要点及注意事项,包括访问静态资源、负载均衡等,在访问静态资源时,可以使用root或alias指令指定路径,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-02-02
  • docker image tag为什么出现none的原因及解决

    docker image tag为什么出现none的原因及解决

    当我们使用docker加载新的镜像时,有时候会发现Repository和Tag名称都为none的情况,这通常是由于没有指定正确的标签名称或者仓库名称所导致的,本文主要介绍了docker image tag为什么出现none的原因及解决,感兴趣的可以了解一下
    2023-10-10
  • Docker多容器连接(以Tomcat+Mysql为例)

    Docker多容器连接(以Tomcat+Mysql为例)

    这篇文章主要介绍了Docker多容器连接(以Tomcat+Mysql为例),Docker提供了多个容器直接访问的方法,可以使多个容器直接通过网络端口进行访问
    2017-03-03
  • 深入解析docker三种网络模式

    深入解析docker三种网络模式

    这篇文章主要介绍了docker三种网络模式,分别是bridge桥接模式,host主机模式,none无网络模式,每种模式给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • Docker安装Maven私服Nexus3的实现步骤

    Docker安装Maven私服Nexus3的实现步骤

    本文主要介绍了Docker安装Maven私服Nexus3的实现步骤,可以帮助开发者搭建高效的依赖管理和分发环境,具有一定的参考价值,感兴趣的可以了解一下
    2025-12-12
  • 如何查看docker容器运行进程信息

    如何查看docker容器运行进程信息

    这篇文章主要介绍了如何查看docker容器运行进程信息问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • docker无法搜索和拉取镜像的解决办法

    docker无法搜索和拉取镜像的解决办法

    这篇文章主要给大家介绍了关于docker无法搜索和拉取镜像的解决办法,通过更换可用的镜像加速器地址可以解决这个问题,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-12-12
  • docker-compose安装yml文件配置方式

    docker-compose安装yml文件配置方式

    这篇文章主要介绍了docker-compose安装,yml文件配置,离线安装及在线安装的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • 基于Docker镜像部署go项目的方法步骤

    基于Docker镜像部署go项目的方法步骤

    这篇文章主要介绍了基于Docker镜像部署go项目的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04

最新评论