• 【拆分版】Docker-compose构建Elasticsearch 7.1.0集群


    写在前边

    搞了两三天了,一直有个问题困扰着我,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.

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

  • 相关阅读:
    Java多线程系列 JUC锁03 公平锁(一)
    Java多线程系列 JUC锁02 互斥锁ReentrantLock
    JDBC课程3--通过ResultSet执行查询操作
    JDBC课程2--实现Statement(用于执行SQL语句)--使用自定义的JDBCTools的工具类静态方法,包括insert/update/delete三合一
    JDBC_通过DriverManager获得数据库连接
    JDBC课程1-实现Driver接口连接mysql数据库、通用的数据库连接方法(使用文件jdbc.properties)
    [终章]进阶20-流程控制结构--if/case/while结构
    MySQL进阶19--函数的创建(举例)/设置mysql的创建函数的权限/查看(show)/删除(drop) / 举4个栗子
    MySQL进阶18- 存储过程- 创建语句-参数模式(in/out/inout-对应三个例子) -调用语法-delimiter 结束标记'$'- 删除/查看/修改-三个练习
    SQL进阶17-变量的声明/使用(输出)--全局变量/会话变量--用户变量/局部变量
  • 原文地址:https://www.cnblogs.com/hellxz/p/docker_es_cluster.html
Copyright © 2020-2023  润新知