部署前准备:
三台银河麒麟Server V10 SP3主机(虚拟机),2核4G
es节点 | 主机IP |
---|---|
es-master | 192.168.131.101 |
es-node1 | 192.168.131.102 |
es-node2 | 192.168.131.103 |
虚拟机内部软件版本:
软件 | 版本 |
---|---|
docker | 19.03.15 |
docker-compose | 1.22.0 |
elasticsearch | 7.12.1 |
kibana | 7.12.1 |
集群部署
部署es-master
es-master节点是es的主节点,因为es的集群认证需要密钥,所以master节点需要先进行部署,生成密钥。 如果已经有了密钥,可以直接从第九步开始。 这里采用的是docker-compose的方式部署:
1. 创建一个网络(用于连接kibana)
docker network create es_net
2. 准备docker-compose.yml文件。
version: '3'
services:
es-master:
image: elasticsearch:7.12.1
container_name: es-master
environment:
- "ES_JAVA_OPTS=-Xms1024m -Xmx1024m" #es是java写的,可以进行jvm调优,生产环境可以调高这个参数,如4G
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65536
hard: 65536
volumes:
- /data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro # 配置文件挂载
- /data/elasticsearch/data:/usr/share/elasticsearch/data:rw # 数据挂载
- /data/elasticsearch/log:/usr/share/elasticsearch/log:rw # 日志挂载
- /data/elasticsearch/plugins:/usr/share/elasticsearch/plugins:rw # 插件挂载
ports:
- 9200:9200
- 9300:9300
networks:
- es_net
extra_hosts: # 设置容器 hosts
- "es-master:192.168.131.101"
- "es-node1:192.168.131.102"
- "es-node2:192.168.131.103"
networks:
es_net:
external: true
3. 创建挂载目录
## 创建es配置数据日志目录
mkdir /data/elasticsearch/{config,data,log,plugins} -pv
## 创建kibana配置目录
mkdir /data/kibana/config -pv
## 修改es目录权限,否则容器启动报错,es容器使用es用户启动,用户id=1000
chown 1000:1000 /data/elasticsearch/* -R
4. 编辑 elasticsearch.yml配置文件
# vim /data/elasticsearch/config/elasticsearch.yml
cluster.name: test-es-cluster #集群名称, es会自动发现在同一网段下的es,使用该属性可以区分同一网段下的多个es集群
node.name: es-master
node.master: true # 该节点是否有选主资格(es集群中的第一台es默认为主节点)
node.data: true # 是否为数据节点
network.bind_host: 0.0.0.0 #设置绑定ip,默认是0.0.0.0
network.publish_host: 192.168.131.101 #设置其它节点和该节点交互的ip地址,必须是真实ip
http.port: 9200
transport.tcp.port: 9300
http.cors.enabled: true
http.cors.allow-origin: "*"
discovery.zen.ping.unicast.hosts: ["es-master:9300", "es-node1:9300", "es-node2:9300"] # 设置集群中节点的初始列表
discovery.zen.minimum_master_nodes: 2 # 集群中的节点可以直到其他n个有master资格的节点,默认1
discovery.zen.ping_timeout: 5s # 自动发现其他节点时,ping连接超时时间,默认3s
bootstrap.memory_lock: true # 禁止es节点进行swap
action.destructive_requires_name: true #禁止通过正则或_all进行index的删除
cluster.initial_master_nodes: ["es-master"] #集群第一次启动时的候选master列表
5. 启动es-master服务
# 进入docker-compose文件所属目录下
docker-compose up -d
# 启动后可以查看容器日志
docker logs -f es-master
注: 启动时报错:bootstrap checks failed## max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]的解决方案
vim /etc/sysctl.conf
在行尾追加
vm.max_map_count=655360
然后执行
sysctl -p
访问 http://192.168.131.101:9200/ 可以看到节点启动信息
6. 编写kibana.yml配置文件
# vim /data/kibana/config/kibana.yml
server.name: kibana
server.host: "0.0.0.0"
# elasticsearch.hosts: "http://192.168.131.101:9200"
xpack.monitoring.ui.container.elasticsearch.enabled: true
7. 运行kibana容器, 执行代码
docker run -d \
--name kibana \
-v /data/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml:ro \
-e ELASTICSEARCH_HOSTS=http://es-master:9200 \
--network=es_net \
-p 5601:5601 \
kibana:7.12.1
因为 kibana已经和es在同一个docker网络下, 所以可以直接使用容器名进行访问;
如果kibana和es不在同一个网络,可以打开kibana.yml的注释配置,
并删除
-e ELASTICSEARCH_HOSTS=http://es-master:9200 \
证书生成
8. 启动es_xpack
认证, 生成证书
集群认证首先需要配置密钥,否则在给内置用户创建密钥时,会报错。 这里直接用master节点去生成证书,生成后直接传到其他节点即可
docker exec -it es-master bash #进入容器
/usr/share/elasticsearch/bin/elasticsearch-certutil ca
/usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
## 两条命令均一路回车即可,不需要给秘钥再添加密码。
## 证书创建完成之后,默认在es的数据目录,这里统一cp 到宿主机目录中
mv elastic-* /usr/share/elasticsearch/data/
## 退出容器
exit
## 复制 /data/elasticsearch/data/ 下证书到 config 目录
cd /data/elasticsearch/config/
cp /data/elasticsearch/data/elastic-* ./
chmod 644 elastic-*
chown 1000:1000 elastic*
elastic-certificates.p12
和elastic-stack-ca.p12
就是生成好的证书文件。
9. 将证书cp到其他节点上,注意提前创建好文件目录
前往192.168.131.102
和 192.168.131.103
, 执行如下命令
mkdir/data/elasticsearch/{config,data,log,plugins} -pv chown 1000:1000 /data/elasticsearch/* -R
然后回到 192.168.131.101
节点 执行如下命令 (也可以使用工具)
scp /data/elasticsearch/config/elastic-* 192.168.131.102:/data/elasticsearch/config/
scp /data/elasticsearch/config/elastic-* 192.168.131.103:/data/elasticsearch/config/
输入目标机的密码。(第一次执行请先输入yes接收密钥)
10. 修改docker-compose.yml
和elasticsearch.yml
, 删除es容器,重新执行docker-compose。
配置 elasticsearch.yml
# vim /data/elasticsearch/config/elasticsearch.yml
cluster.name: test-es-cluster #集群名称, es会自动发现在同一网段下的es,使用该属性可以区分同一网段下的多个es集群
node.name: es-master
node.master: true # 该节点是否有选主资格(es集群中的第一台es默认为主节点)
node.data: true # 是否为数据节点
network.bind_host: 0.0.0.0 #设置绑定ip,默认是0.0.0.0
network.publish_host: 192.168.131.101 #设置其它节点和该节点交互的ip地址,必须是真实ip
http.port: 9200
transport.tcp.port: 9300
http.cors.enabled: true
http.cors.allow-origin: "*"
discovery.zen.ping.unicast.hosts: ["es-master:9300", "es-node1:9300", "es-node2:9300"] # 设置集群中节点的初始列表
discovery.zen.minimum_master_nodes: 2 # 集群中的节点可以直到其他n个有master资格的节点,默认1
discovery.zen.ping_timeout: 5s # 自动发现其他节点时,ping连接超时时间,默认3s
bootstrap.memory_lock: true # 禁止es节点进行swap
action.destructive_requires_name: true #禁止通过正则或_all进行index的删除
cluster.initial_master_nodes: ["es-master"] #集群第一次启动时的候选master列表
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/elastic-certificates.p12
配置 docker-compose.yml
version: '3'
services:
es-master:
image: elasticsearch:7.12.1
container_name: es-master
environment:
- "ES_JAVA_OPTS=-Xms1024m -Xmx1024m" #es是java写的,可以进行jvm调优,生产环境可以调高这个参数,如4G
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65536
hard: 65536
volumes:
- /data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro # 配置文件挂载
- /data/elasticsearch/data:/usr/share/elasticsearch/data:rw # 数据挂载
- /data/elasticsearch/log:/usr/share/elasticsearch/log:rw # 日志挂载
- /data/elasticsearch/plugins:/usr/share/elasticsearch/plugins:rw # 插件挂载
- /data/elasticsearch/config/elastic-certificates.p12:/usr/share/elasticsearch/config/elastic-certificates.p12:ro # 证书挂载
- /data/elasticsearch/config/elastic-stack-ca.p12:/usr/share/elasticsearch/config/elastic-stack-ca.p12:ro
ports:
- 9200:9200
- 9300:9300
networks:
- es_net
extra_hosts: # 设置容器 hosts
- "es-master:192.168.131.101"
- "es-node1:192.168.131.102"
- "es-node2:192.168.131.103"
networks:
es_net:
external: true
访问9200端口,出现密码提示,说明配置成功。
11. 配置es账户,并为内置账户设置密码
ES 中内置了几个管理其他集成组件的账号
即:
apm_system
,beats_system
,elastic
,kibana
,logstash_system
,remote_monitoring_user
,使用之前,首先需要添加一下密码。这里我给所有的账户设置的密码都是123456
注意必须先开启认证,才能设置密码,否则第二条命令无法设置
docker exec -it es-master bash
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
配置完成后,可以使用如下方式访问es服务
curl -XGET -u elastic 'localhost:9200/_xpack/security/user?pretty'
此时前端也可以使用 elastic 123456成功访问
12. 修改kibana配置文件,添加用户名和密码
# vim /data/kibana/config/kibana.yml
server.name: kibana
server.host: "0.0.0.0"
# elasticsearch.hosts: "http://192.168.131.101:9200"
xpack.monitoring.ui.container.elasticsearch.enabled: true
elasticsearch.username: "elastic"
elasticsearch.password: "123456"
然后重启kibana容器:
docker restart kibana
部署es-node1
部署其他节点的流程和部署es-master节点类似,因为我们已经创建好了目录,并且将证书传递过去,只需要编写好配置文件,直接通过docker-compose启动即可。且其他节点不需要配置kibana。下面只列出配置文件。
1. docker-compose.yml
# vim /data/elasticsearch/config/elasticsearch.yml
version: '3'
services:
es-node1:
image: elasticsearch:7.12.1
container_name: es-node1
environment:
- "ES_JAVA_OPTS=-Xms1024m -Xmx1024m" # 设置Jvm内存大小
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65536
hard: 65536
volumes:
- /data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro # 配置挂载
- /data/elasticsearch/data:/usr/share/elasticsearch/data:rw # 数据挂载
- /data/elasticsearch/log:/usr/share/elasticsearch/log:rw # 日志挂载
- /data/elasticsearch/config/elastic-certificates.p12:/usr/share/elasticsearch/config/elastic-certificates.p12:ro # 证书挂载
- /data/elasticsearch/config/elastic-stack-ca.p12:/usr/share/elasticsearch/config/elastic-stack-ca.p12:ro
ports:
- 9200:9200
- 9300:9300
extra_hosts: # 设置容器 hosts
- "es-master:192.168.131.101"
- "es-node1:192.168.131.102"
- "es-node2:192.168.131.103"
2. elasticsearch.yml
cluster.name: test-es-cluster
node.name: es-node1
node.master: true
node.data: true
#network.host: 0.0.0.0
network.bind_host: 0.0.0.0
network.publish_host: 192.168.131.102
http.port: 9200
transport.tcp.port: 9300
http.cors.enabled: true
http.cors.allow-origin: "*"
discovery.zen.ping.unicast.hosts: ["es-master:9300", "es-node1:9300", "es-node2:9300"]
discovery.zen.minimum_master_nodes: 2
discovery.zen.ping_timeout: 5s
bootstrap.memory_lock: true
action.destructive_requires_name: true
cluster.initial_master_nodes: ["es-master"]
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/elastic-certificates.p12
启动容器
docker-compose up -d
访问http://192.168.131.102:9200/, 如果正确,应提示输入密码,且可以通过主节点配置的密码成功登录。
部署es-node2
1. docker-compose.yml
# vim /data/elasticsearch/config/elasticsearch.yml
version: '3'
services:
es-node2:
image: elasticsearch:7.12.1
container_name: es-node2
environment:
- "ES_JAVA_OPTS=-Xms1024m -Xmx1024m" # 设置Jvm内存大小
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65536
hard: 65536
volumes:
- /data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro # 配置挂载
- /data/elasticsearch/data:/usr/share/elasticsearch/data:rw # 数据挂载
- /data/elasticsearch/log:/usr/share/elasticsearch/log:rw # 日志挂载
- /data/elasticsearch/config/elastic-certificates.p12:/usr/share/elasticsearch/config/elastic-certificates.p12:ro # 证书挂载
- /data/elasticsearch/config/elastic-stack-ca.p12:/usr/share/elasticsearch/config/elastic-stack-ca.p12:ro
ports:
- 9200:9200
- 9300:9300
extra_hosts: # 设置容器 hosts
- "es-master:192.168.131.101"
- "es-node1:192.168.131.102"
- "es-node2:192.168.131.103"
2. elasticsearch.yml
cluster.name: test-es-cluster
node.name: es-node2
node.master: true
node.data: true
#network.host: 0.0.0.0
network.bind_host: 0.0.0.0
network.publish_host: 192.168.131.103
http.port: 9200
transport.tcp.port: 9300
http.cors.enabled: true
http.cors.allow-origin: "*"
discovery.zen.ping.unicast.hosts: ["es-master:9300", "es-node1:9300", "es-node2:9300"]
discovery.zen.minimum_master_nodes: 2
discovery.zen.ping_timeout: 5s
bootstrap.memory_lock: true
action.destructive_requires_name: true
cluster.initial_master_nodes: ["es-master"]
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/elastic-certificates.p12
启动容器
docker-compose up -d
访问http://192.168.131.103:9200/, 如果正确,应提示输入密码,且可以通过主节点配置的密码成功登录。
部署完成查看
查看集群状态 http://192.168.131.101:9200/_cluster/health?pretty
访问 http://192.168.131.101:9200/_cat/health?v 会打印一个简易图标
访问 http://192.168.131.101:9200/_cat/nodes 可以看到集群节点信息, 带 * 的为主节点
es集群搭建完成