【问题标题】:Troubles with docker compose + image elasticsearch:6.8.0docker compose + image elasticsearch的问题:6.8.0
【发布时间】:2020-06-13 00:42:14
【问题描述】:

我试图将版本从我的弹性映像从 5.6 升级到 6.8.0,但是当我运行 ddev start 时,ES 容器没有启动。

来自 elasticsearch 服务的 DDEV 日志

OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
OpenJDK 64-Bit Server VM warning: UseAVX=2 is not supported on this CPU, setting it to UseAVX=1
[2020-02-28T21:32:29,269][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [unknown] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: 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])?
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:163) ~[elasticsearch-6.8.0.jar:6.8.0]
    at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[elasticsearch-6.8.0.jar:6.8.0]
    at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-6.8.0.jar:6.8.0]
    at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-6.8.0.jar:6.8.0]
    at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-6.8.0.jar:6.8.0]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:116) ~[elasticsearch-6.8.0.jar:6.8.0]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93) ~[elasticsearch-6.8.0.jar:6.8.0]
Caused by: 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])?

此外,我无法使用mem_limit 参数,因为我使用的是最新版本 3.0。

docker-compose.elasticsearch.yaml:

version: '3.6'
services:
  elasticsearch:
    container_name: ddev-${DDEV_SITENAME}-elasticsearch
    hostname: ${DDEV_SITENAME}-elasticsearch
    image: elasticsearch:6.8.0
    ports:
      - "9200"
      - "9300"
    environment:
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - VIRTUAL_HOST=$DDEV_HOSTNAME
      - HTTP_EXPOSE=9200
    ulimits:
      memlock:
        soft: -1
        hard: -1
    labels:
      com.ddev.site-name: ${DDEV_SITENAME}
      com.ddev.approot: $DDEV_APPROOT
    volumes:
      - elasticsearch:/usr/share/elasticsearch/data
      - ".:/mnt/ddev_config"
  web:
    links:
      - elasticsearch:elasticsearch

volumes:
  elasticsearch:
    name: "${DDEV_SITENAME}-elasticsearch"

我做错了什么还是缺少什​​么?

更新

我根据此处发布的解决方案尝试了以下解决方案

 version: '3.6'
services:
  elasticsearch:
    container_name: ddev-${DDEV_SITENAME}-elasticsearch
    hostname: ${DDEV_SITENAME}-elasticsearch
    image: elasticsearch:6.8.0
    ports:
      - "9200"
      - "9300"
    environment:
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xmx1024m -Xms1024m"
      - VIRTUAL_HOST=$DDEV_HOSTNAME
      - HTTP_EXPOSE=9200
      - node.max_local_storage_nodes=3
    ulimits:
      memlock:
        soft: -1
        hard: -1
    labels:
      com.ddev.site-name: ${DDEV_SITENAME}
      com.ddev.approot: $DDEV_APPROOT
    volumes:
      - elasticsearch:/usr/share/elasticsearch/data
      - ".:/mnt/ddev_config"
  web:
    links:
      - elasticsearch:elasticsearch

volumes:
  elasticsearch:
    name: "${DDEV_SITENAME}-elasticsearch"

但是现在,给我抛出以下错误:

【问题讨论】:

  • 嗨,你有机会看看我的回答吗?
  • 除非您使用 Docker Swarm,否则没有真正需要 Docker Compose 3。您可以只使用 2 就可以了。否则请关注stackoverflow.com/questions/42345235/… 以获取 3 中的等效功能。

标签: docker elasticsearch docker-compose ddev


【解决方案1】:

我在我的 ubuntu AWS 实例上安装 ES 7.6 时遇到了同样的问题,该实例已经安装了另一个 ES 版本。如果您仔细查看错误消息的末尾,它会提到:

原因:java.lang.IllegalStateException:获取节点失败 锁,用锁 ID [0] 尝试了 [[/usr/share/elasticsearch/data]];可能是 这些位置不可写或启动了多个节点 不增加 [node.max_local_storage_nodes](原为 [1])?

有关此设置的更多详细信息,请参阅官方 ES 文档。

要解决此问题,您需要在 elasticsearch.yml 文件中将 node.max_local_storage_nodes 设置为大于 1。

有关该错误的更多信息,请参阅 Elasticsearch 源代码中的 org.elasticsearch.env.NodeEnvironment#NodeEnvironment 方法。

if (nodeLock == null) {
    final String message = String.format(
        Locale.ROOT,
        "failed to obtain node locks, tried [%s] with lock id%s;" +
            " maybe these locations are not writable or multiple nodes were started without increasing [%s] (was [%d])?",
        Arrays.toString(environment.dataFiles()),
        maxLocalStorageNodes == 1 ? " [0]" : "s [0--" + (maxLocalStorageNodes - 1) + "]",
        MAX_LOCAL_STORAGE_NODES_SETTING.getKey(),
        maxLocalStorageNodes);
    throw new IllegalStateException(message, lastException);
}

【讨论】:

  • 虽然这将解决您的直接问题,但它更多的是对抗症状而不是找到解决方案。真正的问题是为什么您仍然对数据目录进行锁定? 5.x 节点还在运行吗?您是否终止了该进程并且它无法删除锁定?此设置通常不是必需的,也很少见——默认限制是有原因的,我认为您不想为您的场景更改它。
  • @xeraa,你是对的,但这可以被视为一种快速解决方案,根据上述问题的回复,我们可以提供更多信息。
  • @OpsterElasticsearchNinja 我已经尝试过您的解决方案,但现在我面临以下问题ElasticsearchUncaughtExceptionHandler] [unknown] uncaught exception in thread [main] org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: Failed to create node environment
  • @AndresGuerrero 请提供整个堆栈跟踪
  • @请将图片添加到您的问题中,不要粘贴链接:)
【解决方案2】:

我遇到了同样的问题,对我有用的解决方案是完全删除托管弹性搜索数据的卷。它将删除 node.lock 和整个索引,但您可以重新创建它。

【讨论】:

  • 删除数据节点并不总是可行的,我们不应该这样做,因为如果没有进行适当的备份,您将丢失数据,顺便说一句,Elasticsearch 最新版本(7.X)已更改数据文件夹结构,所以你不会遇到最新版本的问题。
  • 删除卷也对我有用。要非常小心,记住,它会删除一切。在这里你去删除图像docker rmi $(docker images -a -q)和删除卷docker volume rm $(docker volume ls -q)祝你好运!
猜你喜欢
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 2020-07-11
  • 2023-03-17
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2020-12-23
相关资源
最近更新 更多