在3台VM部署Elasticsearch集群启动失败,boot2docker下如何设置ulimits?
解决Elasticsearch在docker-machine(boot2docker)环境下的启动失败问题
哈哈,这个问题我之前在docker-machine+VirtualBox部署ES集群时踩过坑,给你一步步梳理清楚:
一、必须设置ulimits吗?
绝对要设! Elasticsearch对系统资源的要求很高:默认需要至少65535个文件描述符、4096个线程数,还有虚拟内存vm.max_map_count得调到262144以上。这些默认的系统限制远远达不到ES的要求,就是导致你启动后警告然后进程终止的核心原因。
二、boot2docker环境下怎么配置?
boot2docker是基于Tiny Core Linux的轻量系统,确实没有传统的/etc/security/limits.conf,得用下面这些方法配置:
1. 临时配置(重启VM就没了,适合快速测试)
先进入你的docker-machine虚拟机,比如你的节点叫es-node1:
docker-machine ssh es-node1
然后执行以下命令修改限制:
# 调整系统级文件描述符上限 sudo sysctl -w fs.file-max=65535 # 调整当前会话的文件描述符限制 ulimit -n 65535 # 调整线程数限制 ulimit -u 4096 # 调整ES必需的虚拟内存参数 sudo sysctl -w vm.max_map_count=262144
执行完后重启ES容器试试,应该能启动,但重启VM后这些配置会消失。
2. 永久配置(重启VM依然生效)
boot2docker启动时会自动执行/var/lib/boot2docker/bootsync.sh脚本,我们把配置命令写进去就能永久生效:
# 先进入VM docker-machine ssh es-node1 # 编辑bootsync.sh脚本 sudo vi /var/lib/boot2docker/bootsync.sh # 在脚本里添加以下内容: #!/bin/sh # 配置文件描述符上限 sysctl -w fs.file-max=65535 # 手动创建limits.conf并写入用户级限制 echo "root soft nofile 65535" > /etc/security/limits.conf echo "root hard nofile 65535" >> /etc/security/limits.conf echo "root soft nproc 4096" >> /etc/security/limits.conf echo "root hard nproc 4096" >> /etc/security/limits.conf # 配置虚拟内存 sysctl -w vm.max_map_count=262144 # 给脚本加上执行权限 sudo chmod +x /var/lib/boot2docker/bootsync.sh # 重启VM让配置生效 docker-machine restart es-node1
别担心手动创建
limits.conf的问题,boot2docker的PAM模块依然会读取这个文件,配置是有效的。
3. 在docker-compose中直接配置容器级ulimits
除了系统层面的配置,你还可以在docker-compose.yml里给ES容器单独设置ulimits,这样能直接覆盖系统默认值,更推荐这种方式(和系统配置配合使用效果更好):
version: '3.8' services: es-node1: image: elasticsearch:7.17.0 # 换成你使用的ES版本 environment: - node.name=es-node1 - cluster.name=es-cluster - discovery.seed_hosts=es-node2,es-node3 - cluster.initial_master_nodes=es-node1,es-node2,es-node3 - ES_JAVA_OPTS=-Xms512m -Xmx512m # 根据VM内存调整 ulimits: memlock: soft: -1 hard: -1 # 锁定内存,避免交换,官方推荐 nofile: soft: 65535 hard: 65535 # 文件描述符限制 ports: - "9200:9200" volumes: - es-data-1:/usr/share/elasticsearch/data # 同理配置es-node2和es-node3... volumes: es-data-1: driver: local
三、验证配置是否生效
重启VM和ES容器后,你可以验证一下配置是否生效:
# 进入ES容器 docker exec -it es-node1 bash # 查看文件描述符限制,应该输出65535 ulimit -n # 查看线程数限制,应该输出4096 ulimit -u # 在VM中查看虚拟内存参数,应该输出262144 docker-machine ssh es-node1 sysctl vm.max_map_count
如果这些值都符合预期,再启动ES集群,应该就能正常运行了。
内容的提问来源于stack exchange,提问作者afmulone
相关产品推荐
相关产品推荐

