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

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

3)修改系统参数

vim /etc/sysctl.conf
vm.max_map_count = 262144

# 使配置生效
sysctl -p
# 临时修改,系统重启后就失效
sysctl -w vm.max_map_count=262144

三、安装elasticsearch

1、新建目录

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

mkdir -p /soft/elasticsearch/es/
cd /soft/elasticsearch/es/
mkdir conf
mkdir logs
mkdir data

2、创建docker-compose.yml文件

三个节点分别执行

cd /soft/elasticsearch/es
touch  docker-compose.yml

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

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协议。

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协议。

        这里要注意的是,  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

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

5、授权

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

chmod -R 777 es

6、启动/停止

# -d表示后台启动
docker-compose up -d

# 命令将停止运行的容器,但不会删除它们
docker-compose stop

# 停止运行的容器,并且会删除已停止的容器以及已创建的所有网络;添加-v标记以删除所有卷。这对于通过运行在环境中进行完全重置非常有用
docker-compose down -v

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]

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

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

2)401(Unauthorized)问题

docker compose搭建elasticsearch7集群_第1张图片

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

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

按照如下方式访问即可:

docker compose搭建elasticsearch7集群_第2张图片

四、安装kibana

1、新建目录

mkdir /soft/elasticsearch/kibana
cd kibana
mkdir conf
mkdir data

 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

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"

4、授权

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

chmod -R 777 kibana

5、启动/停止

# -d表示后台启动
docker-compose up -d

# 命令将停止运行的容器,但不会删除它们
docker-compose stop

# 停止运行的容器,并且会删除已停止的容器以及已创建的所有网络;添加-v标记以删除所有卷。这对于通过运行在环境中进行完全重置非常有用
docker-compose down -v

你可能感兴趣的:(elasticsearch,项目部署与配置,docker,elasticsearch)