3. 如何安装符合生产环境要求的ES集群
3. 如何安装符合生产环境要求的ES集群
赵洲洋【ElasticSearch系列连载】3. 如何安装符合生产环境要求的ES集群
通过本文,将会循序渐进地了解到ES的若干部署方案,以及相关的基础操作与配置。
上一节介绍的一键安装方式,可以快速启动一个ES环境用于学习,调试和测试,但是还不足以作为生产环境,比如:
- 不支持集群模式
- 无法轻易对配置文件进行调整与维护
- 后续写入的搜索数据会随着容器删除而删除,没有在本地进行持久化存储
- 9200端口暴露,不需要认证即可访问存在安全隐患
- 没有可视化管理界面(kibana)
本文将会依次解决持久化存储(包括数据文件与配置文件)、可视化管理(kibana)和加密(ES+Kibana)的问题,各个章节解决的问题如下:
章节 | 单节点 | 集群 | 数据持久化 | kibana | 加密 |
---|---|---|---|---|---|
3.1 | ✅ | ||||
3.2 | ✅ | ✅ | |||
3.3 | ✅ | ✅ | ✅ | ||
3.4 | ✅ | ✅ | ✅ | ✅ | |
4.1 | ✅ | ✅ | |||
4.2 | ✅ | ✅ | ✅ | ||
4.3 | ✅ | ✅ | ✅ | ✅ |
1 版本与环境选型
1.1 ES版本选择考量
本系列使用ES 7.10版本作为部署选型
截止到目前撰稿日期,已经推出了ES 8.0版本,有众多的改动和新特性,考虑到:
- 目前ES 7.11 之后开源协议进行了变更,不再适合企业大规模商用
- 在未来一段时间,市面上目前6.x 和 7.x 仍然是主流
所以本系列使用ES 7.10的版本作为讲解样例,一方面是:
- 7.x是先进且主流的版本,具有所需要的绝大部分的功能特性
- 另一方面7.10是Apache 2.0开源协议授权的最新也是最后一个ES版本了,我们可以基于这个版本进行更自由的二次开发、改造与发布
1.2 安装方式选型
本系列使用Docker进行ES环境的搭建,希望使用尽可能简单,干净,通用的方式来进行ES环境的搭建与安装 => Docker安装。
Docker可以安装在任何的平台(x86,ARM,Windows,Linux,MacOS)上,通过Docker的沙箱机制,我们可以免除所有ES对操作系统和环境的依赖干扰,快速建立一个干净的ES环境。
参考官方的如何安装Docker选择对应的平台即可进行安装,本文不再赘述。
1.3 Docker镜像选型
x86环境
对于大部分x86环境的情况,可以使用
ARM环境
对于ARM环境的情况(如树莓派、国产机型、苹果M1等),可以使用
对于下文命令中使用镜像名称的地方会统一使用elasticsearch/7.10.1,如果是ARM用户的话请自行改成对应镜像名称
2 ES部署相关基础概念说明
2.1 端口号
ES需要占用两个端口号
- 9200-外部通讯使用端口:它是http协议的RESTful接口,我们通过浏览器、CURL与ES打交道进行数据的增删改查等操作大都是使用这个端口,默认是9200。
- 9300-节点之间通讯使用端口:它是tcp通讯端口,集群间和TCPclient都走的它,默认是9300。
kibana需要占用一个端口号,默认是5601,可以通过浏览器直接访问。
2.2 存储与配置
ES需要三个存储目录,如果使用上述的elasticsearch/7.10.1镜像,默认在:
- 数据存储目录:/usr/share/elasticsearch/data
- 日志文件目录:/usr/share/elasticsearch/logs
- 配置文件目录:/usr/share/elasticsearch/config
kibana需要配置文件(kibana本身是一个无状态服务,不需要额外的数据信息),如果使用上述的kibana/7.10.1镜像,默认在:
- 配置文件路径:/usr/share/kibana/config/kibana.yml
但是由于kibana需要的配置相对简单,本文使用环境变量的方式在运行时配置,不再单独配置yml配置文件,可以根据个人需要进行单独配置。
2.3 节点名称、端口号、目录规划方案
在部署集群时,哪台机器部署,每台机器部署几个ES节点,相关数据目录放在哪等问题因人而异,但都需要进行提前规划,本文规划如下:
- 机器与服务:一共两台机器A和B,准备部署3个ES节点和1个Kibana服务
- 节点部署划分:机器A部署ES节点0和ES节点1,机器B部署ES节点2和Kibana服务
- 端口号划分:为了防止节点端口号冲突(因为有多个多个节点部署在一台机器的情况),我们约定
- 0号节点叫做es00,端口号使用9200 & 9300
- 1号节点叫做es01,端口号使用9201 & 9301
- ……
- 99号节点叫做es99,端口号使用9299 & 9399
- 存储划分:为了防止节点存储路径号冲突(因为有多个多个节点部署在一台机器的情况),我们约定
- 0号节点叫做es00,数据存储在/data/elasticsearch/es00/{data,logs,config}中
- 1号节点叫做es01,数据存储在/data/elasticsearch/es01/{data,logs,config}中
- ……
- 99号节点叫做es99,数据存储在/data/elasticsearch/es99/{data,logs,config}中
具体方案如下:
部署内容 | 部署名称 | 端口号 | 机器 | 数据目录 |
---|---|---|---|---|
ES节点0 | es00 | 9200 9300 | 机器A | 数据存储目录:/data/elasticsearch/es00/data 日志文件目录:/data/elasticsearch/es00/logs 配置文件目录:/data/elasticsearch/es00/config |
ES节点1 | es01 | 9201 9301 |
机器A | 数据存储目录:/data/elasticsearch/es01/data 日志文件目录:/data/elasticsearch/es01/logs 配置文件目录:/data/elasticsearch/es01/config |
ES节点2 | es02 | 9202 9302 |
机器B | 数据存储目录:/data/elasticsearch/es02/data 日志文件目录:/data/elasticsearch/es02/logs 配置文件目录:/data/elasticsearch/es02/config |
Kibana服务 | kib | 5601 | 机器B | 不需要 |
3 单节点部署
3.1 裸ES简易部署
直接执行如下命令即可。
1 | docker run \ |
直接访问本机的9200端口,比如 http://127.0.0.1:9200,如果能够看到如下内容说明启动正常。
3.2 ES持久化存储与配置部署
上文中提到,ES需要三个存储目录,在容器中的:
- 数据存储目录:/usr/share/elasticsearch/data
- 日志文件目录:/usr/share/elasticsearch/logs
- 配置文件目录:/usr/share/elasticsearch/config
所以我们需要将这三个目录在宿主机中进行建立,并将其映射到上述容器内的三个目录中去。
在这里,我们使用/data/elasticsearch/es00/{data,logs,config}三个目录。
第一步:建立目录
1 | mkdir -p /data/elasticsearch/es00/{data,logs,config} |
第二步:拷贝配置文件
在/data/elasticsearch/es00/config中我们需要3个配置文件,在es启动时会需要使用,分别是jvm,log和es参数的配置文件。
这边已经将相关文件准备好,可以直接使用下面的命令进行下载。
1 | curl https://zhaozhouyang.oss-cn-beijing.aliyuncs.com/blog/elasticsearch/single/jvm.options > /data/elasticsearch/es00/config/jvm.options |
第三步:启动ES
1 | docker run \ |
如果之前es00重名了,可以先执行docker rm -f es00,然后再运行上面的启动命令。
直接访问本机的9200端口,比如 http://127.0.0.1:9200,如果能够看到如下内容说明启动正常。
第四步:验证持久化效果
1 通过API写入数据
1 | curl -X PUT http://127.0.0.1:9200/myindex/doc/1 -d'{"name":"josiah","age":18}' --header "Content-Type: application/json" |
2 通过该API能够查询数据
1 | curl http://127.0.0.1:9200/myindex/doc/1?pretty |
能够看到刚才写入的数据能够
1 | { |
3 验证本地目录有数据存储文件
执行如下命令,可以看到内部已有数据文件
1 | du -sh /data/elasticsearch/es00/data/ |
4 删除容器,重新启动
1 | docker rm -f es00 |
5 之前写入的数据仍然存在
1 | curl http://127.0.0.1:9200/myindex/doc/1?pretty |
3.3 配套Kibana部署
执行如下命令,将下面的http://192.168.51.1:9200换成对应部署的es的地址即可。
不可以使用127.0.0.1或者localhost,需要使用宿主机的网卡ip
1 | docker run \ |
启动后访问IP:5601即可。
3.4 启用加密
第一步:进入容器
在确保es00运行的情况下,执行如下命令进入容器内部(以便使用es相关脚本进行加密证书的生成与配置)
1 | docker exec -it es00 bash |
如图
第二步:制作p12
1 创建本地CA
仍然在容器内,执行如下语句,第一次要求输入的文件名称直接回车(图中第1个箭头),第二次要求输入的证书密码输入一个不小于6位的密码(图中第2个箭头),记录好,完成后当前目录会多一个”elastic-stack-ca.p12”文件(图中第3个箭头)。
1 | ./bin/elasticsearch-certutil ca |
2 生成数字证书
仍然在容器内,执行如下命令,第一次要求输入时输入上面创建本地CA时输入的密码(图中第1个箭头),第二次要求输入的文件名称直接回车(图中第2个箭头),第三次要求输入时也可以输入上面创建本地CA时输入的密码(图中第3个箭头),完成后当前目录会多一个”elastic-certificates.p12”文件(图中第4个箭头),然后将其移动到./config/certificates中去(也是我们做了持久化的目录),最后对其的权限进行修改确保ES能够正常使用它(图中第5个箭头)。
1 | ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 |
第三步:修改配置使用证书
仍然在容器内,通过执行如下的vi命令编辑elasticsearch.yml文件
1 | vi ./config/elasticsearch.yml |
添加如下内容,告知ES使用刚才创建的证书文件,如图:
1 | http.cors.enabled: true |
最后执行如下两行语句,如果需要输入密码使用第二步的密码即可
1 | ./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password |
第四步:重启ES
接着第三步,如果还在容器内,执行exit退出容器,然后执行docker restart es00重启es服务。
第五步:配置ES访问密码
在确保es00运行的情况下,执行如下命令进入容器内部
1 | docker exec -it es00 bash |
如图
然后执行如下语句,先输入y进行确认,然后会要求定义ES相关各类账户的密码,输入不少于6位的,不是纯数字的若干平台(elastic,apm,kibana,logstash,beats,remote_monitor)的密码,如图。
1 | ./bin/elasticsearch-setup-passwords interactive |
然后浏览器访问http://IP地址:9200,即会弹出密码框,用户名输入elastc,密码输入刚才定义的密码,即可进入,如图。
注:如果想要修改密码的话,可以使用下面的方法,注意–user后面跟上目前elastic用户的账号密码
- 修改elastic账号密码为a123456:
1
curl --user elastic:123456 -XPOST --header "Content-Type: application/json" -d '{"password": "a123456"}' http://192.168.1.1:9200/_security/user/elastic/_password
- 修改kibana账号密码为123456a:
1
curl --user elastic:a123456 -XPOST --header "Content-Type: application/json" -d '{"password": "123456a"}' http://192.168.1.1:9200/_security/user/kibana/_password
第六步:配置Kibana访问密码
此时ES已经有了密码,如果再访问我们上面部署的Kibana会发现无法访问了,我们也需要告诉Kibana对应ES的密码才行,如图。
如果之前已经启动了Kibana,可以先执行docker rm -f kib进行删除
启动命令加入ES的账号密码信息即可,如下,将ELASTICSEARCH_HOSTS,ELASTICSEARCH_USERNAME,ELASTICSEARCH_PASSWORD配置成你的ES的地址、账号和密码即可。
1 | docker run \ |
如图。
4 集群部署
本文部署集群的规划如下:
- 机器与服务:一共两台机器A和B,准备部署3个ES节点和1个Kibana服务
- 节点部署划分:机器A部署ES节点0和ES节点1,机器B部署ES节点2和Kibana服务
- 端口号划分:为了防止节点端口号冲突(因为有多个多个节点部署在一台机器的情况),我们约定
- 0号节点叫做es00,端口号使用9200 & 9300
- 1号节点叫做es01,端口号使用9201 & 9301
- ……
- 99号节点叫做es99,端口号使用9299 & 9399
- 存储划分:为了防止节点存储路径号冲突(因为有多个多个节点部署在一台机器的情况),我们约定
- 0号节点叫做es00,数据存储在/data/elasticsearch/es00/{data,logs,config}中
- 1号节点叫做es01,数据存储在/data/elasticsearch/es01/{data,logs,config}中
- ……
- 99号节点叫做es99,数据存储在/data/elasticsearch/es99/{data,logs,config}中
具体方案如下:
部署内容 | 部署名称 | 端口号 | 机器 | 数据目录 |
---|---|---|---|---|
ES节点0 | es00 | 9200 9300 | 机器A | 数据存储目录:/data/elasticsearch/es00/data 日志文件目录:/data/elasticsearch/es00/logs 配置文件目录:/data/elasticsearch/es00/config |
ES节点1 | es01 | 9201 9301 |
机器A | 数据存储目录:/data/elasticsearch/es01/data 日志文件目录:/data/elasticsearch/es01/logs 配置文件目录:/data/elasticsearch/es01/config |
ES节点2 | es02 | 9202 9302 |
机器B | 数据存储目录:/data/elasticsearch/es02/data 日志文件目录:/data/elasticsearch/es02/logs 配置文件目录:/data/elasticsearch/es02/config |
Kibana服务 | kib | 5601 | 机器B | 不需要 |
4.1 ES集群持久化存储与配置部署
每一个节点的部署方式是一样的,这边针对es00节点的部署进行展开描述,其他两个节点的部署直接粘贴命令。
ES节点0(es00)
第一步:建立目录
1 | mkdir -p /data/elasticsearch/es00/{data,logs,config} |
第二步:拷贝配置文件
在/data/elasticsearch/es00/config中我们需要3个配置文件,在es启动时会需要使用,分别是jvm,log和es参数的配置文件。
这边已经将相关文件准备好,可以直接使用下面的命令进行下载。
1 | curl https://zhaozhouyang.oss-cn-beijing.aliyuncs.com/blog/elasticsearch/init_config/es00/jvm.options > /data/elasticsearch/es00/config/jvm.options |
其中elasticsearch.yml补充说明,如下图:
- node.name: 文本三个节点分别是es00, es01, es02
- network.publish_host: 文本三个节点分别是es00, es01, es02
- http.port: 文本三个节点分别是9200, 9201, 9202
- transport.port: 文本三个节点分别是9300, 9301, 9302
- cluster.name: 固定my-es-cluster
- network.host: 固定0.0.0.0
- discovery.seed_hosts: 所有节点的名称和通信端口,本文固定是[“es00:9300”, “es01:9301”, “es02:9302”]
- cluster.initial_master_nodes: 所有节点的名称,本文固定是[“es00”, “es01”, “es02”]
第三步:启动
执行如下命令即可启动,如果之前es00重名了,可以先执行docker rm -f es00,然后再运行下面的启动命令(需要根据实际情况修改–add-host)。
1 | docker run \ |
上面的命令参数补充说明:
- -d: 后台运行
- -p: 端口映射
- -v: 持久化存储目录映射
- –add-host * 3: 记录所有节点名称和IP地址的映射关系,加入到容器的hosts文件中
第四步:验证
直接浏览器访问IP:9200即可验证启动成功
ES节点1(es01)
第一步:建立目录
1 | mkdir -p /data/elasticsearch/es01/{data,logs,config} |
第二步:拷贝配置文件
1 | curl https://zhaozhouyang.oss-cn-beijing.aliyuncs.com/blog/elasticsearch/init_config/es01/jvm.options > /data/elasticsearch/es01/config/jvm.options |
第三步:启动
执行如下命令即可启动,如果之前es01重名了,可以先执行docker rm -f es01,然后再运行下面的启动命令(需要根据实际情况修改–add-host)。
1 | docker run \ |
第四步:验证
直接浏览器访问IP:9201即可验证启动成功
ES节点2(es02)
第一步:建立目录
1 | mkdir -p /data/elasticsearch/es02/{data,logs,config} |
第二步:拷贝配置文件
1 | curl https://zhaozhouyang.oss-cn-beijing.aliyuncs.com/blog/elasticsearch/init_config/es02/jvm.options > /data/elasticsearch/es02/config/jvm.options |
第三步:启动
执行如下命令即可启动,如果之前es02重名了,可以先执行docker rm -f es02,然后再运行下面的启动命令(需要根据实际情况修改–add-host)。
1 | docker run \ |
第四步:验证
直接浏览器访问IP:9202即可验证启动成功
最终验证
访问三个节点任意一个的http://IP:端口/_cat/nodes能够看到集群信息。
4.2 配套Kibana部署
执行如下命令,将下面的http://192.168.51.1:9200换成对应部署的es的地址与端口即可。
不可以使用127.0.0.1或者localhost,需要使用宿主机的网卡ip
1 | docker run \ |
启动后访问IP:5601即可。
4.3 启用加密
第一步:进入容器
在确保es00运行的情况下,执行如下命令进入容器内部(以便使用es相关脚本进行加密证书的生成与配置)
1 | docker exec -it es00 bash |
如图
第二步:制作p12
1 创建本地CA
仍然在容器内,执行如下语句,第一次要求输入的文件名称直接回车(图中第1个箭头),第二次要求输入的证书密码输入一个不小于6位的密码(图中第2个箭头),记录好,完成后当前目录会多一个”elastic-stack-ca.p12”文件(图中第3个箭头)。
1 | ./bin/elasticsearch-certutil ca |
2 生成数字证书
仍然在容器内,执行如下命令,第一次要求输入时输入上面创建本地CA时输入的密码(图中第1个箭头),第二次要求输入的文件名称直接回车(图中第2个箭头),第三次要求输入时也可以输入上面创建本地CA时输入的密码(图中第3个箭头),完成后当前目录会多一个”elastic-certificates.p12”文件(图中第4个箭头),然后将其移动到./config/certificates中去(也是我们做了持久化的目录),最后对其的权限进行修改确保ES能够正常使用它(图中第5个箭头)。
1 | ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 |
3 将数字证书拷贝到其他节点上
将上面的elastic-certificates.p12文件拷贝到所有节点上:
- 文件在容器内的:/usr/share/elasticsearch/config/certificates/ 目录下
- 文件也在宿主机的:/data/elasticsearch/es01/config/certificates/ 目录下
- 拷贝到其他节点(对于本文还剩es01和es02)的同样目录
第三步:修改配置使用证书
依次进入所有节点的容器,通过执行如下的vi命令编辑elasticsearch.yml文件
1 | vi ./config/elasticsearch.yml |
添加如下内容,告知ES使用刚才创建的证书文件,如图:
1 | http.cors.enabled: true |
最后执行如下两行语句,如果需要输入密码使用第二步的密码即可
1 | ./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password |
第四步:重启ES
对所有机器的所有es节点进行重启。
1 | docker restart es00 |
第五步:配置ES访问密码
在确保es服务运行的情况下,找任意一个节点执行如下命令进入容器(密码设置会自动同步到各个节点上,所以不用重复执行)
1 | docker exec -it es00 bash |
如图
然后执行如下语句,先输入y进行确认,然后会要求定义ES相关各类账户的密码,输入不少于6位的,不是纯数字的若干平台(elastic,apm,kibana,logstash,beats,remote_monitor)的密码,如图。
1 | ./bin/elasticsearch-setup-passwords interactive |
然后浏览器访问http://IP地址:9200,即会弹出密码框,用户名输入elastc,密码输入刚才定义的密码,即可进入,如图。
注:如果想要修改密码的话,可以使用下面的方法,注意–user后面跟上目前elastic用户的账号密码
- 修改elastic账号密码为a123456:
1
curl --user elastic:123456 -XPOST --header "Content-Type: application/json" -d '{"password": "a123456"}' http://192.168.1.1:9200/_security/user/elastic/_password
- 修改kibana账号密码为123456a:
1
curl --user elastic:a123456 -XPOST --header "Content-Type: application/json" -d '{"password": "123456a"}' http://192.168.1.1:9200/_security/user/kibana/_password
第六步:配置Kibana访问密码
此时ES已经有了密码,如果再访问我们上面部署的Kibana会发现无法访问了,我们也需要告诉Kibana对应ES的密码才行,如图。
如果之前已经启动了Kibana,可以先执行docker rm -f kib进行删除
启动命令加入ES的账号密码信息即可,如下,将ELASTICSEARCH_HOSTS,ELASTICSEARCH_USERNAME,ELASTICSEARCH_PASSWORD配置成你的ES的地址、账号和密码即可。
1 | docker run \ |
如图。
5 可能问题
5.1 vm.max_map_count太低
如果报错vm.max_map_count太低,需要将其设置为至少262144,参考链接
1 | sysctl -w vm.max_map_count=262144 |
5.2 ES性能不足
在上文的jvm.options中,关于堆内存的设置默认是1GB,对于大部分生产环境来说是不够的,这一块可以根据实际情况进行调整
参考文档
https://github.com/elastic/kibana/issues/55031
https://www.elastic.co/guide/en/elasticsearch/reference/current/certutil.html
https://blog.csdn.net/hhf799954772/article/details/115870012
https://blog.csdn.net/yabingshi_tech/article/details/109535035
https://www.elastic.co/guide/en/kibana/7.17/docker.html
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/elasticsearch-intro.html
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/docker.html
https://stackoverflow.com/questions/69415530/start-up-elastic-search-on-multiple-hosts-using-docker
https://discuss.elastic.co/t/handshake-failed-unexpected-remote-node/117082
https://docs.docker.com/engine/reference/run/#network-settings
https://stackoverflow.com/questions/46627979/what-is-the-default-user-and-password-for-elasticsearch
https://baijiahao.baidu.com/s?id=1703600336205273370&wfr=spider&for=pc
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/settings.html
https://stackoverflow.com/questions/66433674/what-does-discovery-seed-hosts-and-cluster-initial-master-nodes-mean-in-es
https://stackoverflow.com/questions/14379575/configure-port-number-of-elasticsearch