Docker Compose是 docker 提供的一个命令行工具,用来定义和运行由多个容器组成的应用。使用 compose,我们可以通过 YAML 文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建和启动。
pip install docker-compose docker-compose version-
Master节点作为Master节点与协调节点,为防止脑裂问题,降低负载,不存数据 -
Node1~Node3为数据节点,不参与Master竞选 -
TribeNode节点不存数据,不参与Master竞选
因
Docker中已部署单节点的ElasticSearch,9200和9300端口已被占用。
| 节点目录 | 节点名称 | 协调端口号 | 说明 | 查询端口号 | 节点IP |
|---|---|---|---|---|---|
| docker-es-master | master | 9301 | master节点,非数据节点 | 9201 | 192.168.3.27 |
| docker-es-data01 | data01 | 9302 | 数据节点1,非master节点 | 9202 | 192.168.3.27 |
| docker-es-data02 | data02 | 9303 | 数据节点2,非master节点 | 9203 | 192.168.3.27 |
| docker-es-data03 | data03 | 9304 | 数据节点3,非master节点 | 9204 | 192.168.3.27 |
| docker-es-tribe | tribe | 9305 | 协调节点,非master非数据节点 | 9205 | 192.168.3.27 |
下载地址:https://github.com/gm19900510/docker-es-cluster
.
├── docker-es-data01
│ ├── data01
│ ├── data01-logs
│ ├── docker-compose.yml
│ ├── .env
│ └── es-config
│ └── elasticsearch.yml
├── docker-es-data02
│ ├── data02
│ ├── data02-logs
│ ├── docker-compose.yml
│ ├── .env
│ └── es-config
│ └── elasticsearch.yml
├── docker-es-data03
│ ├── data03
│ ├── data03-logs
│ ├── docker-compose.yml
│ ├── .env
│ └── es-config
│ └── elasticsearch.yml
├── docker-es-master
│ ├── docker-compose.yml
│ ├── .env
│ ├── es-config
│ │ └── elasticsearch.yml
│ ├── master-data
│ └── master-logs
└── docker-es-tribe
├── docker-compose.yml
├── .env
├── es-config
│ └── elasticsearch.yml
├── tribe-data
└── tribe-logsdocker-compose.yml 是docker-compose的配置文件
version: "3"
services:
es-master:
image: elasticsearch:7.9.3
container_name: es-master
environment: # setting container env
- ES_JAVA_OPTS=${ES_JVM_OPTS} # set es bootstrap jvm args
restart: always
volumes:
- ./es-config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- ${MASTER_DATA_DIR}:/usr/share/elasticsearch/data:rw
- ${MASTER_LOGS_DIR}:/usr/share/elasticsearch/logs:rw
network_mode: "host"修改
pull的镜像,替换其中的变量与配置文件,挂载数据与日志目录,最后用的host主机模式,让节点服务占用到实体机端口
启动
ElasticSearch时如果提示无法访问日志或数据目录的问题可以通过,在docker-compose.yml的environment节点下添加- TAKE_FILE_OWNERSHIP=true
elaticsearch.yml 是ElasticSearch的配置文件,搭建集群最关键的文件之一
# ======================== Elasticsearch Configuration =========================
cluster.name: es-cluster
node.name: master
node.master: true
node.data: false
node.attr.rack: r1
bootstrap.memory_lock: true
http.port: 9201
network.host: 192.168.3.27
transport.tcp.port: 9301
discovery.seed_hosts: ["192.168.3.27:9302","192.168.3.27:9303","192.168.3.27:9304","192.168.3.27:9305"]
cluster.initial_master_nodes: ["master"]
gateway.recover_after_nodes: 2
transport.tcp.port设置Elaticsearch多节点协调的端口号discovery.seed_hosts设置当前节点启动后要发现的协调节点位置,当然自己不需要发现自己,推荐使用ip:port形式,集群形成快cluster.initial_master_nodes集群中可以成为master节点的节点名,这里指定唯一的一个,防止脑裂
.env 这个文件为docker-compose.yml提供默认参数,方便修改
# the default environment for es-master
# set es node jvm args
ES_JVM_OPTS=-Xms2048m -Xmx2048m
# set master node data folder
MASTER_DATA_DIR=./master-data
# set master node logs folder
MASTER_LOGS_DIR=./master-logs-
若想将此脚本使用到生产上,需要修改每个节点下的
.env文件,将挂载数据、日志目录修改为启动Elaticsearch的集群的用户可读写的位置,可以通过sudo chmod 777 -R 目录或sudo chown -R 当前用户名:用户组 目录来修改被挂载的目录权限。 -
修改
.env下的JVM参数,扩大堆内存,启动与最大值最好相等,以减少gc次数,提高效率。 -
修改所有节点下的
docker-compose.yml中的network.host地址 为当前所放置的主机的ip,discovery.seed_hosts需要填写具体各待发现节点的实体机ip,以确保可以组成集群。 -
确保各端口在其宿主机上没有被占用,如有占用需确认是否有用,无用
kill,有用则更新docker-compose.yml的http.port或transport.tcp.port,注意与此同时要更新其它节点的discovery.seed_hosts对应的port。 -
docker-compose up -d后台启动命令。 -
docker-compose down关闭同时移除容器与多余虚拟网卡。 -
docker stop contains_name根据容器名称关闭容器,不移除容器。
sh docker-es-cluster-up.sh创建并启动集群shdocker-es-cluster-stop.sh停止集群docker-es-cluster-down.sh停止并移除集群
- 如果你想让这些脚本有执行权限,不妨试试sudo chmod +x *.sh
- 这些脚本中没有使用sudo,如需要使用sudo才能启动docker,请添加当前用户到docker组
问题翻译过来就是:Elasticsearch用户拥有的内存权限太小,至少需要262144;
解决办法:
执行命令:
sudo sysctl -w vm.max_map_count=262144查看结果:
sudo sysctl -a|grep vm.max_map_count显示:
vm.max_map_count = 262144上述方法修改之后,如果重启虚拟机将失效,所以:
在 /etc/sysctl.conf文件最后添加一行,vm.max_map_count=262144,即可永久修改
解决方法一,关闭bootstrap.memory_lock,会影响性能
vim elasticsearch.yml // 设置成false就正常运行了。
bootstrap.memory_lock: false解决方法二,开启bootstrap.memory_lock
- 修改文件
elasticsearch.yml,上面那个报错就是开启后产生的,如果开启还要修改其它系统配置文件
vim elasticsearch.yml
bootstrap.memory_lock: true- 修改文件
/etc/security/limits.conf,最后添加以下内容。
* soft nofile 65536
* hard nofile 65536
* soft nproc 32000
* hard nproc 32000
* hard memlock unlimited
* soft memlock unlimited- 修改文件
/etc/systemd/system.conf,分别修改以下内容。
DefaultLimitNOFILE=65536
DefaultLimitNPROC=32000
DefaultLimitMEMLOCK=infinity改好后重启系统。再启动Elasticsearch就没报错了 。
docker ps 
curl http://localhost:9200/_cat/health?v 查看集群状态,出现如下信息则集群搭建成功

