Docker创建ElasticSearch集群以及常见问题
本篇文章演示在WSL2中通过DockerCompose搭建ES集群,解决其中遇到的问题。
虚拟内存最大映射数#
第一个问题是几乎所有机器上搭建ES集群都会遇到的,即虚拟内存最大映射数默认为65535
,而ES需要更大,最少是262144
,所以你需要设置这个参数
sudo vim /etc/sysctl.conf
添加下面这句
vm.max_map_count=262144
执行以下命令
➜ ~ sudo sysctl -p
vm.max_map_count=262144
内存不足#
第二个问题,三个ES节点总是有一个莫名其妙的自动退出,如果你docker start
重启它,会导致更多的节点退出,这是由于内存不足所致。
从WSL2的层面,你可以通过在%UserProfile%
路径下创建一个.wslconfig
文件,并写入如下内容来限制WSL的内存大小,但我觉得问题不在于此,因为WSL2的内存好像本身就是动态且没有限制的,不过如果尝试了所有的办法都不行,也可以试试。
[wsl2]
memory=4GB
swap=4GB
localhostForwarding=true
从Docker层面,可以(在DockerCompose中)通过使用下面代码来限制一个容器的内存用量:
services:
es01:
image: "elasticsearch:7.12.1"
container_name: "es01"
deploy:
resources:
limits:
memory: 1G
reservations:
memory: 512M
其它奇怪问题#
Caused by:java.lang.IllegalStateException: failure when sending a validation request to node
可能是你的data
目录不干净了,删除里面的所有文件即可
java.lang.IllegalStateException: failed to obtain node locks, tried [[/var/lib/elasticsearch/sunaw-cluster]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])?
先查看是否有其它已经启动的es实例:
ps aux | grep elasticsearch
如果有,使用kill -9 <pid>
杀掉它
否则,有可能是你yaml文件写错了,仔细检查下,比如每一个实例对应的data
的volume
对不对,我真的就是这个文件复制时有个地方忘改了。
最终效果:
最终yaml:
version: '2.2'
services:
es01:
image: "elasticsearch:7.12.1"
container_name: "es01"
ulimits:
memlock:
soft: -1
hard: -1
deploy:
resources:
limits:
memory: 1G
reservations:
memory: 512M
privileged: true
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- "ES_JAVA_OPS=-Xms512m -Xmx512m"
volumes:
- "./es-data01:/usr/share/elasticsearch/data"
- "./es-plugins:/usr/share/elasticsearch/plugins"
ports:
- 9201:9200
networks:
- elastic
es02:
image: "elasticsearch:7.12.1"
container_name: "es02"
ulimits:
memlock:
soft: -1
hard: -1
deploy:
resources:
limits:
memory: 1G
reservations:
memory: 512M
privileged: true
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- "ES_JAVA_OPS=-Xms512m -Xmx512m"
volumes:
- "./es-data02:/usr/share/elasticsearch/data"
- "./es-plugins:/usr/share/elasticsearch/plugins"
ports:
- 9202:9200
networks:
- elastic
es03:
image: "elasticsearch:7.12.1"
container_name: "es03"
ulimits:
memlock:
soft: -1
hard: -1
deploy:
resources:
limits:
memory: 1G
reservations:
memory: 512M
privileged: true
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- "ES_JAVA_OPS=-Xms512m -Xmx512m"
volumes:
- "./es-data03:/usr/share/elasticsearch/data"
- "./es-plugins:/usr/share/elasticsearch/plugins"
ports:
- 9203:9200
networks:
- elastic
networks:
elastic:
driver: bridge
作者:Yudoge
出处:https://www.cnblogs.com/lilpig/p/16607326.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
欢迎按协议规定转载,方便的话,发个站内信给我嗷~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!