• docker compose搭建elasticsearch7集群


    一、集群介绍

    系统环境:Centos7.5

    服务器节点:

    主机名

    IP

    hadoop03

    192.168.1.153

    hadoop04

    192.168.1.154

    hadoop05

    192.168.1.155

    二、环境准备

    1、安装docker:略过

    2、安装docker compose

    1)使用官方推荐方式(此方式需服务器翻外网)

    curl -L "https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose
    
    chmod +x /usr/local/bin/docker-compose
    
    ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
    
    docker-compose --version
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2)自行下载

    由于服务器连不上Github,因此手动下载:https://github.com/docker/compose/releases/

    选择docker-compose-linux-x86_64并下载,然后上传到fuwuq并下载,然后上传到服务器,

    mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
    
    chmod +x /usr/local/bin/docker-compose
    
    ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
    
    docker-compose --version
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3)修改系统参数

    vim /etc/sysctl.conf
    vm.max_map_count = 262144
    
    # 使配置生效
    sysctl -p
    # 临时修改,系统重启后就失效
    sysctl -w vm.max_map_count=262144
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    三、安装elasticsearch

    1、新建目录

    在三台服务器上新建elasticsearch用户:

    mkdir -p /soft/elasticsearch/es/
    cd /soft/elasticsearch/es/
    mkdir conf
    mkdir logs
    mkdir data
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、创建docker-compose.yml文件

    三个节点分别执行

    cd /soft/elasticsearch/es
    touch  docker-compose.yml
    
    • 1
    • 2

    1)hadoop03节点

    vim docker-compose.yml
    
    version: '1.0'
    services:
      es:                    # 服务名称
        image: elasticsearch:7.3.0      # 使用的镜像
        container_name: es01   # 容器名称
        restart: always                 # 失败自动重启策略
        environment:
          - node.name=es01                 # 节点名称,集群模式下每个节点名称唯一
          - network.host=0.0.0.0                # 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0,即本机
          - network.publish_host=192.168.1.153      # 用于集群内各机器间通信,对外使用,其他机器访问本机器的es服务,一般为本机宿主机IP
          - discovery.seed_hosts=192.168.1.153,192.168.1.154,192.168.1.155          # es7.0之后新增的写法,写入候选主节点的设备地址,在开启服务后,如果master挂了,哪些可以被投票选为主节点
          - cluster.initial_master_nodes=es01  # es7.0之后新增的配置,初始化一个新的集群时需要此配置来选举master
          - cluster.name=es-cluster-prod     # 集群名称,相同名称为一个集群, 三个es节点须一致
    #      - http.cors.enabled=true    # 是否支持跨域,是:true // 这里设置不起作用,但是可以将此文件映射到宿主机进行修改,然后重启,解决跨域
    #      - http.cors.allow-origin="*" # 表示支持所有域名      // 这里设置不起作用,但是可以将此文件映射到宿主机进行修改,然后重启,解决跨域
          - bootstrap.memory_lock=true  # 内存交换的选项,官网建议为true
          - node.master=true
          - node.data=true
          - http.port=9200
          - transport.tcp.port=9300
          - "ES_JAVA_OPTS=-Xms2g -Xmx2g" # 设置内存,如内存不足,可以尝试调低点
        ulimits:        # 栈内存的上限
          memlock:
            soft: -1    # 不限制
            hard: -1    # 不限制
        volumes:
          - ./conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml  # 将容器中es的配置文件映射到本地,设置跨域, 否则head插件无法连接该节点
          - ./data:/usr/share/elasticsearch/data  # 存放数据的文件
          - ./logs:/usr/share/elasticsearch/logs  #存放日志文件
          - ./plugins:/usr/share/elasticsearch/plugins #存放插件
          - ./conf/elastic-certificates.p12:/usr/share/elasticsearch/config/elastic-certificates.p12 #存放证书
        ports:
          - 9200:9200    # http端口,可以直接浏览器访问
          - 9300:9300    # es集群之间相互访问的端口,jar之间就是通过此端口进行tcp协议通信,遵循tcp协议。
        networks:
          - elk
      es-head:
        image: tobias74/elasticsearch-head:6
        container_name: es-head
        restart: always
        ports:
          - 9100:9100
        networks:
          - elk
    networks:
      elk:
        driver: bridge
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    2)hadoop04节点

    docker-compose.yml
    
    version: '1.0'
    services:
      es:                    # 服务名称
        image: elasticsearch:7.3.0      # 使用的镜像
        container_name: es02   # 容器名称
        restart: always                 # 失败自动重启策略
        environment:
          - node.name=es02                 # 节点名称,集群模式下每个节点名称唯一
          - network.host=0.0.0.0                # 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0,即本机
          - network.publish_host=192.168.1.154      # 用于集群内各机器间通信,对外使用,其他机器访问本机器的es服务,一般为本机宿主机IP
          - discovery.seed_hosts=192.168.1.153,192.168.1.154,192.168.1.155          # es7.0之后新增的写法,写入候选主节点的设备地址,在开启服务后,如果master挂了,哪些可以被投票选为主节点
          - cluster.initial_master_nodes=192.168.1.153  # es7.0之后新增的配置,初始化一个新的集群时需要此配置来选举master
          - cluster.name=es-cluster-prod     # 集群名称,相同名称为一个集群, 三个es节点须一致
    #      - http.cors.enabled=true    # 是否支持跨域,是:true // 这里设置不起作用,但是可以将此文件映射到宿主机进行修改,然后重启,解决跨域
    #      - http.cors.allow-origin="*" # 表示支持所有域名      // 这里设置不起作用,但是可以将此文件映射到宿主机进行修改,然后重启,解决跨域
          - bootstrap.memory_lock=true  # 内存交换的选项,官网建议为true
          - node.master=true
          - node.data=true
          - http.port=9200
          - transport.tcp.port=9300
          - "ES_JAVA_OPTS=-Xms2g -Xmx2g" # 设置内存,如内存不足,可以尝试调低点
        ulimits:        # 栈内存的上限
          memlock:
            soft: -1    # 不限制
            hard: -1    # 不限制
        volumes:
          - ./conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml  # 将容器中es的配置文件映射到本地,设置跨域, 否则head插件无法连接该节点
          - ./data:/usr/share/elasticsearch/data  # 存放数据的文件
          - ./logs:/usr/share/elasticsearch/logs  #存放日志文件
          - ./plugins:/usr/share/elasticsearch/plugins #存放插件
          - ./conf/elastic-certificates.p12:/usr/share/elasticsearch/config/elastic-certificates.p12 #存放证书
        ports:
          - 9200:9200    # http端口,可以直接浏览器访问
          - 9300:9300    # es集群之间相互访问的端口,jar之间就是通过此端口进行tcp协议通信,遵循tcp协议。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    3)hadoop05节点

    docker-compose.yml
    
    version: '1.0'
    services:
      es:                    # 服务名称
        image: elasticsearch:7.3.0      # 使用的镜像
        container_name: es03   # 容器名称
        restart: always                 # 失败自动重启策略
        environment:
          - node.name=es03                 # 节点名称,集群模式下每个节点名称唯一
          - network.host=0.0.0.0                # 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0,即本机
          - network.publish_host=192.168.1.155      # 用于集群内各机器间通信,对外使用,其他机器访问本机器的es服务,一般为本机宿主机IP
          - discovery.seed_hosts=192.168.1.153,192.168.1.154,192.168.1.155          # es7.0之后新增的写法,写入候选主节点的设备地址,在开启服务后,如果master挂了,哪些可以被投票选为主节点
          - cluster.initial_master_nodes=192.168.1.153  # es7.0之后新增的配置,初始化一个新的集群时需要此配置来选举master
          - cluster.name=es-cluster-prod     # 集群名称,相同名称为一个集群, 三个es节点须一致
    #      - http.cors.enabled=true    # 是否支持跨域,是:true // 这里设置不起作用,但是可以将此文件映射到宿主机进行修改,然后重启,解决跨域
    #      - http.cors.allow-origin="*" # 表示支持所有域名      // 这里设置不起作用,但是可以将此文件映射到宿主机进行修改,然后重启,解决跨域
          - bootstrap.memory_lock=true  # 内存交换的选项,官网建议为true
          - node.master=true
          - node.data=true
          - http.port=9200
          - transport.tcp.port=9300
          - "ES_JAVA_OPTS=-Xms2g -Xmx2g" # 设置内存,如内存不足,可以尝试调低点
        ulimits:        # 栈内存的上限
          memlock:
            soft: -1    # 不限制
            hard: -1    # 不限制
        volumes:
          - ./conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml  # 将容器中es的配置文件映射到本地,设置跨域, 否则head插件无法连接该节点
          - ./data:/usr/share/elasticsearch/data  # 存放数据的文件
          - ./logs:/usr/share/elasticsearch/logs  #存放日志文件
          - ./plugins:/usr/share/elasticsearch/plugins #存放插件
          - ./conf/elastic-certificates.p12:/usr/share/elasticsearch/config/elastic-certificates.p12 #存放证书
        ports:
          - 9200:9200    # http端口,可以直接浏览器访问
          - 9300:9300    # es集群之间相互访问的端口,jar之间就是通过此端口进行tcp协议通信,遵循tcp协议。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    这里要注意的是,network.publish_host这个属性必须指定为宿主机的IP;否则它默认使用的本机IP,也就是容器自己的IP,由于三个docker容器分别在不容的服务器,这样是互相发现不了的,会报这个错:master not discovered yet, this node has not previously joined a bootstrapped (v7+) cluster,以及这个错:javax.net.ssl.SSLHandshakeException: Insufficient buffer remaining for AEAD cipher fragment (2). Needs to be more than tag size (16)。由于第一个错只是warn,而第二个错误直接是异常比较明显,所以一直在去网上搜索第二个错误,碰巧的是第二个错误网上大部分说是openJDK的一个bug,以至于快把我整抑郁了;但其实第二个错误是第一个错误引起的。

    3、配置elasticsearch.yml

    vim es/conf/elasticsearch.yml
    
    network.host: 0.0.0.0
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    http.cors.allow-headers: Authorization,Content-Type
    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    xpack.security.transport.ssl.verification_mode: certificate
    xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
    xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4、获取授权证书

    由于开启了X-Pack安全认证,需要获取证书,这里的思路是临时创建一个es容器,在里面生成证书后,拷贝出来:

    #生成es临时容器
    docker run -dit --name=es elasticsearch:7.3.0 /bin/bash
    #进入容器内
    docker exec -it es /bin/bash
    #生成证书的命令
    ./bin/elasticsearch-certutil ca
    #一通回车后
    ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
    #又一通回车后,退出容器
    exit
    
    # 复制出来
    docker cp es:/usr/share/elasticsearch/elastic-certificates.p12 .
    #移除临时容器
    docker kill es
    docker rm es
    # 将证书移动到conf目录下
    mv elastic-certificates.p12 /soft/elasticsearch/es/conf
    # 将证书拷贝到另外两台机器
    scp /soft/elasticsearch/es/conf/elastic-certificates.p12 hadoop04:/soft/elasticsearch/es/conf
    scp /soft/elasticsearch/es/conf/elastic-certificates.p12 hadoop05:/soft/elasticsearch/es/conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    5、授权

    如果绑定安装一个本地目录或文件,那么它必须是elasticsearch用户可读的(在容器内部默认使用elasticsearch用户运行)。此外,该用户必须对数据和日志目录具有写权限。

    chmod -R 777 es
    
    • 1

    6、启动/停止

    # -d表示后台启动
    docker-compose up -d
    
    # 命令将停止运行的容器,但不会删除它们
    docker-compose stop
    
    # 停止运行的容器,并且会删除已停止的容器以及已创建的所有网络;添加-v标记以删除所有卷。这对于通过运行在环境中进行完全重置非常有用
    docker-compose down -v
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    7、设置密码

    在hadoop03节点执行:

    docker exec -it es01 /bin/bash
    
    ./bin/elasticsearch-setup-passwords interactive
    
    Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
    You will be prompted to enter passwords as the process progresses.
    Please confirm that you would like to continue [y/N]y
     
    Enter password for [elastic]: 
    Reenter password for [elastic]: 
    Enter password for [apm_system]: 
    Reenter password for [apm_system]: 
    Enter password for [kibana]: 
    Reenter password for [kibana]: 
    Enter password for [logstash_system]: 
    Reenter password for [logstash_system]: 
    Enter password for [beats_system]: 
    Reenter password for [beats_system]: 
    Enter password for [remote_monitoring_user]: 
    Reenter password for [remote_monitoring_user]: 
    Changed password for user [apm_system]
    Changed password for user [kibana]
    Changed password for user [logstash_system]
    Changed password for user [beats_system]
    Changed password for user [remote_monitoring_user]
    Changed password for user [elastic]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    建议密码设置为一样的,方便记忆。

    8、es-head连接不上es

    1)跨域问题

    在elasticsearch.yml配置文件中有如下设置:

    # 如果不设置这个,只能在本机访问
    network.host: 0.0.0.0
    # 处理跨域问题
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    http.cors.allow-headers: Authorization,Content-Type
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2)401(Unauthorized)问题

    这是因为加了X-Pack认证,需要用户名密码才可以访问:

    http://192.168.1.153:9100/?auth_user=elastic&auth_password=Zstax@123

    按照如下方式访问即可:

    四、安装kibana

    1、新建目录

    mkdir /soft/elasticsearch/kibana
    cd kibana
    mkdir conf
    mkdir data
    
    • 1
    • 2
    • 3
    • 4

    2、配置docker-compose

    cd /soft/elasticsearch/kibana
    vim docker-compose.yml
    
    version: '1.0'
    services:
      kibana:
        image: docker.elastic.co/kibana/kibana:7.3.0
        container_name: kibana
        environment:
          - SERVER_NAME=kibana
          - ELASTICSEARCH_HOSTS=http://192.168.1.153:9200  #这个地址如果是阿里云、华为云等云服务器,则需要是对外IP,也就是用户电脑能访问到的IP
          - XPACK_MONITORING_ENABLED=true
        ports:
          - 5601:5601
        volumes:
          - ./conf/kibana.yml:/usr/share/kibana/config/kibana.yml
          - ./data:/usr/share/kibana/data
        depends_on:
          - es
        networks:
          - elk
    networks:
      elk:
        driver: bridge
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    3、配置kibana.yml

    vim /soft/elasticsearch/kibana/conf/kibana.yml
    
    elasticsearch.username: "elastic"
    elasticsearch.password: "Zstax@123"
    xpack.monitoring.enabled: true
    xpack.monitoring.ui.container.elasticsearch.enabled: true
    server.host: "0.0.0.0"
    i18n.locale: zh-CN #中文
    #去除警告:Generating a random key for xpack.reporting.encryptionKey. 
    #To prevent pending reports from failing on restart, please set xpack.reporting.encryptionKey in kibana.ym
    xpack.reporting.encryptionKey: "122333444455555666666777777788888888"
    #去除警告:Generating a random key for xpack.security.encryptionKey. 
    #To prevent sessions from being invalidated on restart, please set xpack.security.encryptionKey in kibana.y
    xpack.security.encryptionKey: "122333444455555666666777777788888888"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    4、授权

    如果绑定安装一个本地目录或文件,那么它必须是elasticsearch用户可读的(在容器内部默认使用elasticsearch用户运行)。此外,该用户必须对数据和日志目录具有写权限。

    chmod -R 777 kibana
    
    • 1

    5、启动/停止

    # -d表示后台启动
    docker-compose up -d
    
    # 命令将停止运行的容器,但不会删除它们
    docker-compose stop
    
    # 停止运行的容器,并且会删除已停止的容器以及已创建的所有网络;添加-v标记以删除所有卷。这对于通过运行在环境中进行完全重置非常有用
    docker-compose down -v
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    CORS(跨域资源共享)
    mysql建数据库时我们的字符集如何选择
    sfm算法之三角化(三角测量)
    设计模式——策略模式
    pytorch之文本篇项目——聊天机器人(一)数据预处理
    linux c++调试 CMakeLists编写
    JavaScript--继承模式、数组操作、操作dom
    Hexagon_V65_Programmers_Reference_Manual(10)
    【Hello Algorithm】暴力递归到动态规划(二)
    创建一个web项目
  • 原文地址:https://blog.csdn.net/m0_67393157/article/details/126327096