Docker部署Elasticsearch OSS 7.9.3多节点集群失败及java.nio.file.NoSuchFileException异常排查求助
你现在遇到了两个核心问题:cgroup文件读取报错和集群仅识别单个节点,咱们一步步来解决:
1. 修复cgroup路径读取错误(解决日志中的NoSuchFileException)
日志里的NoSuchFileException是因为你配置的cgroup参数名写错了。你用的es.cgroups.hierarchy.override=/不符合ES的配置规范,正确的参数应该是node.cgroups.hierarchy.override,对应的环境变量写法如下:
- node.cgroups.hierarchy.override=/
这个参数会让ES跳过Docker的容器级cgroup,直接读取根cgroup的统计信息,避免找不到特定容器cgroup文件的问题。
2. 修复多节点集群发现问题(解决单节点集群)
你的docker-compose.yml里有几个配置错误,导致节点之间无法互相发现:
(1)修正网络绑定参数
你写的es_network_host是错误的,ES的官方配置项是network.host,对应的环境变量要改成:
- network.host=0.0.0.0
设置为0.0.0.0可以让ES监听容器内所有网卡地址,这样其他节点才能通过Docker服务名(es01/es02)访问到它。之前指定es01或es02作为绑定地址,会导致节点只能监听容器内hostname对应的本地地址,跨节点通信自然会失败。
(2)检查数据卷权限
Elasticsearch容器内的进程默认用elasticsearch用户(UID/GID 1000)运行,你挂载的本地数据卷目录需要确保权限正确,否则节点无法写入数据,也会影响集群初始化。提前执行以下命令修正权限:
sudo chown -R 1000:1000 /home/centos/dev/dockerdata/es01 /home/centos/dev/dockerdata/es02
(3)确认节点发现配置
你写的discovery.seed_hosts=es01,es02和cluster.initial_master_nodes=es01,es02是正确的,Docker Compose默认会创建内部网络,服务名可以直接解析,只要network.host配置正确,节点就能互相找到对方。
修正后的docker-compose.yml示例
version: '3.7' services: es01: image: es-oss:latest container_name: es01 environment: - jvm_args_memory=512m - node.name=es01 - cluster.name=es-docker-cluster - discovery.seed_hosts=es01,es02 - cluster.initial_master_nodes=es01,es02 - network.host=0.0.0.0 - node.cgroups.hierarchy.override=/ - bootstrap.memory_lock=true - log_level_root=debug - log_level_sample=debug ulimits: memlock: soft: -1 hard: -1 nofile: soft: 65536 hard: 65536 volumes: - /home/centos/dev/dockerdata/es01:/var/lib/esdata ports: - "9200:9200" - "9300:9300" es02: image: es-oss:latest container_name: es02 environment: - jvm_args_memory=512m - node.name=es02 - cluster.name=es-docker-cluster - discovery.seed_hosts=es01,es02 - cluster.initial_master_nodes=es01,es02 - network.host=0.0.0.0 - node.cgroups.hierarchy.override=/ - bootstrap.memory_lock=true - log_level_root=debug - log_level_sample=debug ulimits: memlock: soft: -1 hard: -1 nofile: soft: 65536 hard: 65536 volumes: - /home/centos/dev/dockerdata/es02:/var/lib/esdata
验证步骤
- 先清理原有容器和错误数据:
docker-compose down -v
- 修正数据卷权限(如果还没做):
sudo chown -R 1000:1000 /home/centos/dev/dockerdata/es01 /home/centos/dev/dockerdata/es02
- 重新启动集群:
docker-compose up -d
- 访问
http://localhost:9200/_cat/nodes?v查看节点列表,正常情况下应该能看到es01和es02两个节点。
内容的提问来源于stack exchange,提问作者SST

