写在前边

搞了两三天了,一直有个问题困扰着我,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 文中开始搭建的前四步

目录结构

  1. .
  2. ├── docker-es-data01
  3.    ├── data01
  4.    ├── data01-logs
  5.    ├── docker-compose.yml
  6.    ├── .env
  7.    └── es-config
  8.    └── elasticsearch.yml
  9. ├── docker-es-data02
  10.    ├── data02
  11.    ├── data02-logs
  12.    ├── docker-compose.yml
  13.    ├── .env
  14.    └── es-config
  15.    └── elasticsearch.yml
  16. ├── docker-es-data03
  17.    ├── data03
  18.    ├── data03-logs
  19.    ├── docker-compose.yml
  20.    ├── .env
  21.    └── es-config
  22.    └── elasticsearch.yml
  23. ├── docker-es-master
  24.    ├── docker-compose.yml
  25.    ├── .env
  26.    ├── es-config
  27.       └── elasticsearch.yml
  28.    ├── master-data
  29.    └── master-logs
  30. └── docker-es-tribe
  31. ├── docker-compose.yml
  32. ├── .env
  33. ├── es-config
  34.    └── elasticsearch.yml
  35. ├── tribe-data
  36. └── 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提供默认参数,方便修改

  1. # the default environment for es-master
  2. # set es node jvm args
  3. ES_JVM_OPTS=-Xms256m -Xmx256m
  4. # set master node data folder
  5. MASTER_DATA_DIR=./master-data
  6. # set master node logs folder
  7. MASTER_LOGS_DIR=./master-logs

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

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

  1. version: "3"
  2. services:
  3. es-master:
  4. image: elasticsearch:7.1.0
  5. container_name: es-master
  6. environment: # setting container env
  7. - ES_JAVA_OPTS=${ES_JVM_OPTS} # set es bootstrap jvm args
  8. restart: always
  9. volumes:
  10. - ./es-config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
  11. - ${MASTER_DATA_DIR}:/usr/share/elasticsearch/data:rw
  12. - ${MASTER_LOGS_DIR}:/usr/share/elasticsearch/logs:rw
  13. network_mode: "host"

简单来说,就是修改pull的镜像,替换其中的变量与配置文件,挂载数据与日志目录,最后用的host主机模式,让节点服务占用到实体机端口

elaticsearch.yml elasticsearch的配置文件,搭建集群最关键的文件之一

  1. # ======================== Elasticsearch Configuration =========================
  2. cluster.name: es-cluster
  3. node.name: master
  4. node.master: true
  5. node.data: false
  6. node.attr.rack: r1
  7. bootstrap.memory_lock: true
  8. http.port: 9200
  9. network.host: 10.2.114.110
  10. transport.tcp.port: 9300
  11. discovery.seed_hosts: ["10.2.114.110:9301","10.2.114.110:9302","10.2.114.110:9303","10.2.114.110:9304"]
  12. cluster.initial_master_nodes: ["master"]
  13. 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

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

docker-es-cluster-down.sh

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

docker-es-cluster-stop.sh

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

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

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

Enjoy.

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

【拆分版】Docker-compose构建Elasticsearch 7.1.0集群的更多相关文章

  1. Docker Compose 一键部署Nginx代理Tomcat集群

    Docker Compose 一键部署Nginx代理Tomcat集群 目录结构 [root@localhost ~]# tree compose_nginx_tomcat/ compose_nginx ...

  2. 【拆分版】 Docker-compose构建Logstash多实例,基于7.1.0

    [拆分版]Docker-compose构建Logstash多实例 写在最前 说起Logstash,这个组件并没有什么集群的概念,与其说是集群,不如说是各自去收集日志分析过滤存储到Elasticsear ...

  3. 企业运维实践-丢弃手中的 docker build , 使用Kaniko直接在Kubernetes集群或Containerd环境中快速进行构建推送容器镜像

    关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 首发地址: h ...

  4. docker swarm英文文档学习-7-在集群中管理节点

    Manage nodes in a swarm在集群中管理节点 List nodes列举节点 为了查看集群中的节点列表,可以在管理节点中运行docker node ls: $ docker node ...

  5. Elasticsearch常见用法-分布式集群

    集群内部工作方式 Elasticsearch用于构建高可用和可扩展的系统.扩展的方式可以是购买更好的服务器(纵向扩展(vertical scale or scaling up))或者购买更多的服务器( ...

  6. Elasticsearch(二)--集群原理及优化

    一.ES原理 1.索引结构ES是面向文档的 各种文本内容以文档的形式存储到ES中,文档可以是一封邮件.一条日志,或者一个网页的内容.一般使用 JSON 作为文档的序列化格式,文档可以有很多字段,在创建 ...

  7. Docker&Kubernetes沙龙干货集锦:容器集群管理利器kubernetes详谈-CSDN.NET

    Docker&Kubernetes沙龙干货集锦:容器集群管理利器kubernetes详谈-CSDN.NET undefined Package - crawler undefined 科学网- ...

  8. docker swarm英文文档学习-8-在集群中部署服务

    Deploy services to a swarm在集群中部署服务 集群服务使用声明式模型,这意味着你需要定义服务的所需状态,并依赖Docker来维护该状态.该状态包括以下信息(但不限于): 应该运 ...

  9. spring boot 2.0.3+spring cloud (Finchley)1、搭建服务注册和发现组件Eureka 以及构建高可用Eureka Server集群

    一 .搭建Eureka 编写Eureka Server 由于有多个spring boot项目,采用maven多module的结构,项目结构如下: 新建一个maven主工程,在主maven的pom文件中 ...

随机推荐

  1. UVA 437 巴比伦塔 【DAG上DP/LIS变形】

    [链接]:https://cn.vjudge.net/problem/UVA-437 [题意]:给你n个立方体,让你以长宽为底,一个个搭起来(下面的立方体的长和宽必须大于上面的长和宽)求能得到的最长高 ...

  2. Python的Web编程[1] -> Web服务器[0] -> Web 服务器与 CGI / WSGI

    Web服务器 / Web Server 对于Web来说,需要建立一个Web服务器,必须建立一个基本的服务器和一个处理程序, 基本服务器的主要作用是,在客户端和服务器端完成必要的HTTP交互, 处理程序 ...

  3. AppScan入门工作原理详解

    AppScan,即 AppScan standard edition.其安装在 Windows 操作系统上,可以对网站等 Web 应用进行自动化的应用安全扫描和测试. Rational AppScan ...

  4. luogu P1182 数列分段Section II

    题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 ...

  5. Codeforces 908 D New Year and Arbitrary Arrangement

    Discription You are given three integers k, pa and pb. You will construct a sequence with the follow ...

  6. POJ 2100:Graveyard Design(Two pointers)

    [题目链接] http://poj.org/problem?id=2100 [题目大意] 给出一个数,求将其拆分为几个连续的平方和的方案数 [题解] 对平方数列尺取即可. [代码] #include ...

  7. db2字符串截取方法及常用函数

    select substr(index_code, 1, locate('-', index_code)-1) from report_data substr(str,m,n)表示从str中的m个字符 ...

  8. 第九章 Android-UI组件(2)

    一.图像视图(ImageView) 布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayo ...

  9. 队列 LinkedBlockingQueue

    1 api     java.util.concurrent包下的新类.LinkedBlockingQueue就是其中之一,是一个阻塞的线程安全的队列,底层采用链表实现.             Li ...

  10. Ubuntu 16.04服务器版查看DHCP自动分配的IP、网关、DNS

    说明: 1.在服务器版本中,没有想桌面版一样的NetworkManager工具,所以的一切都是在命令行上操作的. 2.本文只针对DHCP默认分配的IP进行查看. 方法: 1.如果要使用DHCP,那么需 ...