环境准备
-
服务器(虚拟机)三台(在一个局域网内):
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