docker-compose搭建Elasticsearch7.17.3集群

环境准备

  • 服务器(虚拟机)三台(在一个局域网内):
    192.168.0.130
    192.168.0.131
    192.168.0.132

  • 操作系统 :LInux

  • 安装 docker 以及 docker-compose
    如果未安装,请参考:在 Linux上安装和使用Docker

设置系统参数

最大虚拟内存值设置过小,无法支持ElasticSearch的运行。故需要修改系统参数。

编辑配置文件

sudo vim /etc/sysctl.conf

在文件中追加配置后保存退出

vm.max_map_count = 262144

使配置生效

sudo sysctl -p

临时修改(前面永久修改做了,这个就不用执行了)

sudo sysctl -w vm.max_map_count=262144

安装elasticsearch

  • 创建elasticsearch用户,如果已有非root的用户则不需要新建用户

创建用户

sudo useradd elasticsearch

设置密码

sudo passwd elasticsearch

切换用户

su elasticsearch
  • 在三台服务器上创建elasticsearch目录
sudo mkdir -p /opt/elasticsearch/
cd /opt/elasticsearch/
sudo mkdir conf
sudo mkdir logs
sudo mkdir data
  • 在三台服务器上分别创建 docker-compose.yml 文件
cd /opt/elasticsearch/
sudo vim docker-compose.yml

192.168.0.131 节点(默认主节点)配置如下:

version: '3.3'

services:
  elasticsearch:                                                         # 服务名称
    container_name: es02                                                 # 容器名称
    image: elasticsearch:7.17.3                                          # 镜像
    restart: always                                                      # 失败自动重启策略
    environment:
      - node.name=es02                                                   # 节点名称,集群模式下每个节点名称唯一
      - network.host=0.0.0.0                                             # 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0,即本机
      - network.publish_host=192.168.0.131                               # 用于集群内各机器间通信,对外使用,其他机器访问本机器的es服务,一般为本机宿主机IP
#      - discovery.seed_hosts=192.168.0.130,192.168.0.131,192.168.0.132   # es7.0之后新增的写法,写入候选主节点的设备地址,在开>启服务后,如果master挂了,哪些可以被投票选为主节点
      - cluster.initial_master_nodes=es02                                # es7.0之后新增的配置,初始化一个新的集群时需要此配置来选举master
      - cluster.name=cluster-prod                                        # 集群名称,相同名称为一个集群, 三个es节点须一致
      - bootstrap.memory_lock=true                                       # 内存交换的选项,官网建议为true
      - node.master=true                                                 # 是否可以成为master节点
      - node.data=true                                                   # 是否可以成为data节点
      - http.port=9200                                                   # http 端口
      - transport.tcp.port=9300                                          # tcp 端口
      - "ES_JAVA_OPTS=-Xms2g -Xmx2g"                                     # 设置内存,如内存不足,可以尝试调低点
      - TZ=Asia/Shanghai                                                 # 时区
    ulimits:
      memlock:
        soft: -1                                                         # 不限制
        hard: -1                                                         # 不限制
    volumes:                                                             # 
      - ./data:/usr/share/elasticsearch/data                             # 数据文件挂载
      - ./plugins:/usr/share/elasticsearch/plugins                       # 插件文件挂载
      - ./logs:/usr/share/elasticsearch/logs                             # 日志文件挂载
      - ./config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml  # 将容器中es的配置文件映射到本地,设置跨域, 否则head插件无法连接该节点
      - ./config/elastic-certificates.p12:/usr/share/elasticsearch/config/elastic-certificates.p12 #存放证书
    ports:                                                               # 端口映射
      - 9200:9200                                                        # http端口,可以直接浏览器访问
      - 9300:9300                                                        # es集群之间相互访问的端口,jar之间就是通过此端口进行tcp协议通>信,遵循tcp协议。
    networks:
      - elsticsearch
networks:
  elsticsearch:
    driver: bridge

192.168.0.130 节点配置如下:

version: '3.3'

services:
  elasticsearch:                                                         # 服务名称
    container_name: es01                                                 # 容器名称
    image: elasticsearch:7.17.3                                          # 镜像
    restart: always                                                      # 失败自动重启策略
    environment:
      - node.name=es01                                                   # 节点名称,集群模式下每个节点名称唯一
      - network.host=0.0.0.0                                             # 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0,即本机
      - network.publish_host=192.168.0.130                               # 用于集群内各机器间通信,对外使用,其他机器访问本机器的es服务,一般为本机宿主机IP
        #      - discovery.seed_hosts=192.168.0.130,192.168.0.131,192.168.0.132   # es7.0之后新增的写法,写入候选主节点的设备地址,在开>启服务后,如果master挂了,哪些可以被投票选为主节点
      - cluster.initial_master_nodes=192.168.0.131                       # es7.0之后新增的配置,初始化一个新的集群时需要此配置来选举master
      - cluster.name=cluster-prod                                        # 集群名称,相同名称为一个集群, 三个es节点须一致
      - bootstrap.memory_lock=true                                       # 内存交换的选项,官网建议为true
      - node.master=true                                                 # 是否可以成为master节点
      - node.data=true                                                   # 是否可以成为data节点
      - http.port=9200                                                   # http 端口
      - transport.tcp.port=9300                                          # tcp 端口
      - "ES_JAVA_OPTS=-Xms2g -Xmx2g"                                     # 设置内存,如内存不足,可以尝试调低点
      - TZ=Asia/Shanghai                                                 # 时区
    ulimits:
      memlock:
        soft: -1                                                         # 不限制
        hard: -1                                                         # 不限制
    volumes:                                                             # 
      - ./data:/usr/share/elasticsearch/data                             # 数据文件挂载
      - ./plugins:/usr/share/elasticsearch/plugins                       # 插件文件挂载
      - ./logs:/usr/share/elasticsearch/logs                             # 日志文件挂载
      - ./config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml  # 将容器中es的配置文件映射到本地,设置跨域, 否则head插件无法连接该节点
      - ./config/elastic-certificates.p12:/usr/share/elasticsearch/config/elastic-certificates.p12 #存放证书
    ports:                                                               # 端口映射
      - 9200:9200                                                        # http端口,可以直接浏览器访问
      - 9300:9300

192.168.0.132 节点配置如下:

version: '3.3'

services:
  elasticsearch:                                                         # 服务名称
    container_name: es03                                                 # 容器名称
    image: elasticsearch:7.17.3                                          # 镜像
    restart: always                                                      # 失败自动重启策略
    environment:
      - node.name=es03                                                   # 节点名称,集群模式下每个节点名称唯一
      - network.host=0.0.0.0                                             # 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0,即本机
      - network.publish_host=192.168.0.132                               # 用于集群内各机器间通信,对外使用,其他机器访问本机器的es服务,一般为本机宿主机IP
        #      - discovery.seed_hosts=192.168.0.130,192.168.0.131,192.168.0.132   # es7.0之后新增的写法,写入候选主节点的设备地址,在开>启服务后,如果master挂了,哪些可以被投票选为主节点
      - cluster.initial_master_nodes=192.168.0.131                       # es7.0之后新增的配置,初始化一个新的集群时需要此配置来选举master
      - cluster.name=cluster-prod                                        # 集群名称,相同名称为一个集群, 三个es节点须一致
      - bootstrap.memory_lock=true                                       # 内存交换的选项,官网建议为true
      - node.master=true                                                 # 是否可以成为master节点
      - node.data=true                                                   # 是否可以成为data节点
      - http.port=9200                                                   # http 端口
      - transport.tcp.port=9300                                          # tcp 端口
      - "ES_JAVA_OPTS=-Xms2g -Xmx2g"                                     # 设置内存,如内存不足,可以尝试调低点
      - TZ=Asia/Shanghai                                                 # 时区
    ulimits:
      memlock:
        soft: -1                                                         # 不限制
        hard: -1                                                         # 不限制
    volumes:                                                             # 
      - ./data:/usr/share/elasticsearch/data                             # 数据文件挂载
      - ./plugins:/usr/share/elasticsearch/plugins                       # 插件文件挂载
      - ./logs:/usr/share/elasticsearch/logs                             # 日志文件挂载
      - ./config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml  # 将容器中es的配置文件映射到本地,设置跨域, 否则head插件无法连接该节点
      - ./config/elastic-certificates.p12:/usr/share/elasticsearch/config/elastic-certificates.p12 #存放证书
    ports:                                                               # 端口映射
      - 9200:9200                                                        # http端口,可以直接浏览器访问
      - 9300:9300 
  • 在三台服务器上创建配置 elasticsearch.yml
sudo vim /opt/elasticsearch/conf/elasticsearch.yml

192.168.0.131 节点配置:

# 对外暴露IP,0.0.0.0 表示本机IP
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

# 集群名称
cluster.name: cluster-prod
# 当前节点名称
node.name: es02
# 是否可以成为主节点
node.master: true
# 是否可以成为数据节点
node.data: true
# http 端口
http.port: 9200
# tcp 端口
transport.tcp.port: 9300
# 集群可发现的节点地址
discovery.zen.ping.unicast.hosts: ["192.168.0.130","192.168.0.131","192.168.0.132"]
# 默认主节点名称
cluster.initial_master_nodes: ["es02"]
# 对外发布的IP
network.publish_host: 192.168.0.131
# 主节点选举至少需要的节点数,配置成:集群节点数/2 + 1,防止脑裂现象
discovery.zen.minimum_master_nodes: 2

192.168.0.130 节点配置:

# 对外暴露IP,0.0.0.0 表示本机IP
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

# 集群名称
cluster.name: cluster-prod
# 当前节点名称
node.name: es01
# 是否可以成为主节点
node.master: true
# 是否可以成为数据节点
node.data: true
# http 端口
http.port: 9200
# tcp 端口
transport.tcp.port: 9300
# 集群可发现的节点地址
discovery.zen.ping.unicast.hosts: ["192.168.0.130","192.168.0.131","192.168.0.132"]
# 默认主节点名称
cluster.initial_master_nodes: ["es02"]
# 对外发布的IP
network.publish_host: 192.168.0.130
# 主节点选举至少需要的节点数,配置成:集群节点数/2 + 1,防止脑裂现象
discovery.zen.minimum_master_nodes: 2

192.168.0.132 节点配置:

# 对外暴露IP,0.0.0.0 表示本机IP
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

# 集群名称
cluster.name: cluster-prod
# 当前节点名称
node.name: es03
# 是否可以成为主节点
node.master: true
# 是否可以成为数据节点
node.data: true
# http 端口
http.port: 9200
# tcp 端口
transport.tcp.port: 9300
# 集群可发现的节点地址
discovery.zen.ping.unicast.hosts: ["192.168.0.130","192.168.0.131","192.168.0.132"]
# 默认主节点名称
cluster.initial_master_nodes: ["es02"]
# 对外发布的IP
network.publish_host: 192.168.0.132
# 主节点选举至少需要的节点数,配置成:集群节点数/2 + 1,防止脑裂现象
discovery.zen.minimum_master_nodes: 2
  • 获取授权证书

在 192.168.0.131 节点生成es临时容器

docker run -dit --name=es elasticsearch:7.17.3 /bin/bash

进入容器内

docker exec -it es /bin/bash

生成证书命令

./bin/elasticsearch-certutil ca

遇到交互,则一直回车,不用设置密码,方便后面设置密码,然后继续输入命令:

./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

遇到交互,还是一直回车。最后按 exit 退出容器。

复制证书到容器外的elasticsearch的配置文件目录下

docker cp es:/usr/share/elasticsearch/elastic-certificates.p12 /opt/elasticsearch/config/

移除容器

docker kill es
docker rm es

将证书复制到另外两台服务器


# 将证书拷贝到另外两台机器
scp /opt/elasticsearch/conf/elastic-certificates.p12 elasticsearch@192.168.0.130:/opt/elasticsearch/conf
scp /opt/elasticsearch/conf/elastic-certificates.p12 elasticsearch@192.168.0.132:/opt/elasticsearch/conf
  • 在三台服务器上分别授权
chmod -R 777 /opt/elasticsearch
  • 在三台服务器上分别启动es
docker-compose up -d
  • 设置密码,在192.168.0.131节点上执行

进入容器

docker exec -it es02 /bin/bash

设置密码

./bin/elasticsearch-setup-passwords interactive

设置那几个用户的密码
在这里插入图片描述

安装kibana

在其中一个节点安装即可,我选择在192.168.0.132 安装

  • 新建目录
mkdir /opt/elasticsearch/kibana
cd /opt/elasticsearch/kibana
mkdir config
mkdir data
  • 配置docker-compose
vim docker-compose.yml

配置文件如下

version: '3.3'
services:
  kibana:
    image: kibana:7.17.3
    container_name: kibana
    environment:
      - SERVER_NAME=kibana
      - ELASTICSEARCH_HOSTS=["http://192.168.0.130:9200","http://192.168.0.131:9200","http://192.168.0.132:9200"]  #这个地址如果是阿里云
、华为云等云服务器,则需要是对外IP,也就是用户电脑能访问到的IP
      - XPACK_MONITORING_ENABLED=true
    ports:
      - 5601:5601
    volumes:
      - ./config/kibana.yml:/usr/share/kibana/config/kibana.yml
      - ./data:/usr/share/kibana/data
    networks:
      - elasticsearch
networks:
  elasticsearch:
    driver: bridge
  • 配置kibana.yml
vim /opt/elasticsearch/kibana/conf/kibana.yml

配置文件如下:

elasticsearch.username: "elastic"
elasticsearch.password: "你自己设置的密码"
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"
server.publicBaseUrl: "http://192.168.0.132:5601"
  • 授权
chmod -R 777 kibana
  • 启动kibana
docker-compose up -d
  • 验证安装
    浏览器输入:http://192.168.0.132:5601
    输入账号密码登录
    在这里插入图片描述
    查看集群节点情况:GET https://192.168.0.132:9200/_cat/nodes
    在这里插入图片描述
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值