写在前边

搞了两三天了,一直有个问题困扰着我,ES集群中配置怎么能正确映射到主机上,这边经常报ClusterFormationFailureHelper master not discovered or elected yet.原因是容器中的ES节点没有正确的映射到主机上,而且容器内ip是易变的,我该怎么配置呢?

临下班了,终于想到个法子,固定容器ip——使用network_mode: host

看到主机模式的我眼前一亮,容器就相当于一个主机服务,你占哪个端口就是哪个,没有必要再去自己指定port去映射到主机。这样只要主机ip不变,容器中ip不就没问题了么!!!

本文内容架构图

解释:

Master节点作为Master节点与协调节点,为防止脑裂问题,降低负载,不存数据

Node1~Node3为数据节点,不参与Master竞选

TribeNode节点不存数据,不参与Master竞选

准备环境

  • GNU/Debain Stretch 9.9 linux-4.19
  • Docker 18.09.6
  • Docker-Compose 1.17.1
  • elasticsearch:7.1.0

配置脚本参见我的Github <https://github.com/hellxz/docker-es-cluster.git>

宿主机环境准备参考ELK集群搭建,基于7.1.1 文中开始搭建的前四步

目录结构

.
├── 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-logs

最终效果

各目录代表节点与端口号

节点目录 节点名称 协调端口号 说明 查询端口号
docker-es-data01 data01 9301 数据节点1,非master节点 9201
docker-es-data02 data02 9302 数据节点2,非master节点 9202
docker-es-data03 data03 9303 数据节点3,非master节点 9203
docker-es-master master 9300 master节点,非数据节点 9200
docker-es-tribe tribe 9304 协调节点,非master非数据节点 9204

想测试这些节点是否可用,只需要修改每个节点目录下的es-config/elasticsearch.yml中的ip地址,全部换成你需要的ip即可。

各文件功用举例说明

鉴于这里边有很多是重复操作,这里仅拿其中的master节点进行举例,其余代码参见Github

.env 这个文件为docker-compose.yml提供默认参数,方便修改

# the default environment for es-master
# set es node jvm args
ES_JVM_OPTS=-Xms256m -Xmx256m
# set master node data folder
MASTER_DATA_DIR=./master-data
# set master node logs folder
MASTER_LOGS_DIR=./master-logs

2020/02/26 更新:启动es时如果提示无法访问日志或数据目录的问题可以通过,在docker-compose.yml的environment节点下添加- TAKE_FILE_OWNERSHIP=true

docker-compose.yml docker-compose的配置文件

version: "3"
services:
es-master:
image: elasticsearch:7.1.0
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主机模式,让节点服务占用到实体机端口

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: 9200
network.host: 10.2.114.110
transport.tcp.port: 9300
discovery.seed_hosts: ["10.2.114.110:9301","10.2.114.110:9302","10.2.114.110:9303","10.2.114.110:9304"]
cluster.initial_master_nodes: ["master"]
gateway.recover_after_nodes: 2

按照前几篇文章下来,大家对这些参数已经不是很陌生了,这里简单说下几个比较重要的参数

  • transport.tcp.port 设置es多节点协调的端口号
  • discovery.seed_hosts 设置当前节点启动后要发现的协调节点位置,当然自己不需要发现自己,推荐使用ip:port形式,集群形成快
  • cluster.initial_master_nodes 集群中可以成为master节点的节点名,这里指定唯一的一个,防止脑裂

使用说明

  1. 若想将此脚本使用到生产上,需要修改每个节点下的.env文件,将挂载数据、日志目录修改为启动es的集群的用户可读写的位置,可以通过sudo chmod 777 -R 目录sudo chown -R 当前用户名:用户组 目录 来修改被挂载的目录权限
  2. 修改.env下的JVM参数,扩大堆内存,启动与最大值最好相等,以减少gc次数,提高效率
  3. 修改所有节点下的docker-compose.yml 中的network.host地址 为当前所放置的主机的ip,discovery.seed_hosts需要填写具体各待发现节点的实体机ip,以确保可以组成集群
  4. 确保各端口在其宿主机上没有被占用,如有占用需确认是否有用,无用kill,有用则更新docker-compose.ymlhttp.porttransport.tcp.port,注意与此同时要更新其它节点的discovery.seed_hosts对应的port
  5. 如果在同一台主机上,可以参考使用文章后边的简单的shell脚本

各节点操作命令

后台启动命令均为docker-compose up -d

关闭命令:

  • docker-compose down: 关闭同时移除容器与多余虚拟网卡
  • docker stop contains_name: 根据容器名称关闭容器,不移除容器

简单的Shell脚本

docker-es-cluster-up.sh

#/bin/bash
# please put this shell script to the root of each node folder.
# this shell script for start up the docker-es-cluster designed in the one of linux server.
cd docker-es-master && docker-compose up -d && \
cd ../docker-es-data01 && docker-compose up -d && \
cd ../docker-es-data02 && docker-compose up -d && \
cd ../docker-es-data03 && docker-compose up -d && \
cd ../docker-es-tribe && docker-compose up -d && \
cd ..

docker-es-cluster-down.sh

#/bin/bash
# please put this shell script to the root of each node folder.
# this shell script for remove the docker-es-cluster's containers and networks designed in the one of linux server.
cd docker-es-tribe && docker-compose down && \
cd ../docker-es-data03 && docker-compose down && \
cd ../docker-es-data02 && docker-compose down && \
cd ../docker-es-data01 && docker-compose down && \
cd ../docker-es-master && docker-compose down && \
cd ..

docker-es-cluster-stop.sh

#/bin/bash
# please put this shell script to the root of each node folder.
# this shell script for stop the docker-es-cluster's containers designed in the one of linux server.
docker stop es-tribe es-data03 es-data02 es-data01 es-master

如果你想让这些脚本有执行权限,不妨试试sudo chmod +x *.sh

这些脚本中没有使用sudo,如需要使用sudo才能启动docker,请添加当前用户到docker组

Enjoy.

本文系原创文章,禁止转载。

最新文章

  1. glusterfs 中的字典查询
  2. {Reshipt}{文白}{资治通鉴}
  3. nodejs字符与字节之间的转换
  4. java项目@override报错问题
  5. Dreamweaver_CS6安装与破解,手把手教程
  6. QT 的信号与槽
  7. 利用FlashPaper实现类似百度文库功能
  8. SORT ORDER BY STOPKEY
  9. 如何在WP8模拟器中连接本地的web服务
  10. 利用python的爬虫技术爬取百度贴吧的帖子
  11. 当今游戏大作share的特性大盘点
  12. 分布式系统里session同步
  13. iOS应用的性能调试
  14. hdu 3746 Cyclic Nacklace(kmp最小循环节)
  15. java 查看SOAP请求报文
  16. GO调度模型的缺点
  17. IOS系统中,Web应用程序的cookie读写
  18. 插入排序的C、C++实现
  19. [POI2014]Rally
  20. __attribute__中constructor和destructor[总结]

热门文章

  1. Python与数据库[2] -&gt; 关系对象映射/ORM[0] -&gt; ORM 与 sqlalchemy 模块
  2. RMQ小结
  3. C语言基础之运算符优先级
  4. C语言基础之自增自减运算符及注意事项
  5. 解决android客户端使用soap与服务器通讯错误415
  6. 无法启动此程序,因为计算机中丢失 MSVCP120.dll。尝试安装该程序以解决此问题
  7. 使用 SVG 来实现波浪 (wave) 动画效果
  8. springMVC初探视图解析器——ResourceBundleViewResolver
  9. 咏南下拉列表非数据敏感控件--TYNSearch
  10. eclipse和maven生成web项目的war包的操作方法