赞
踩
通过本文,将会循序渐进地了解到ES的若干部署方案,以及相关的基础操作与配置。
上一节介绍的一键安装方式,可以快速启动一个ES环境用于学习,调试和测试,但是还不足以作为生产环境,比如:
本文将会依次解决持久化存储(包括数据文件与配置文件)、可视化管理(kibana)和加密(ES+Kibana)的问题,各个章节解决的问题如下:
章节 | 单节点 | 集群 | 数据持久化 | kibana | 加密 |
---|---|---|---|---|---|
3.1 | ✅ | ||||
3.2 | ✅ | ✅ | |||
3.3 | ✅ | ✅ | ✅ | ||
3.4 | ✅ | ✅ | ✅ | ✅ | |
4.1 | ✅ | ✅ | |||
4.2 | ✅ | ✅ | ✅ | ||
4.3 | ✅ | ✅ | ✅ | ✅ |
本系列使用ES 7.10版本作为部署选型
截止到目前撰稿日期,已经推出了ES 8.0版本,有众多的改动和新特性,考虑到:
所以本系列使用ES 7.10的版本作为讲解样例,一方面是:
本系列使用Docker进行ES环境的搭建,希望使用尽可能简单,干净,通用的方式来进行ES环境的搭建与安装 => Docker安装。
Docker可以安装在任何的平台(x86,ARM,Windows,Linux,MacOS)上,通过Docker的沙箱机制,我们可以免除所有ES对操作系统和环境的依赖干扰,快速建立一个干净的ES环境。
参考官方的如何安装Docker选择对应的平台即可进行安装,本文不再赘述。
对于大部分x86环境的情况,可以使用
对于ARM环境的情况(如树莓派、国产机型、苹果M1等),可以使用
对于下文命令中使用镜像名称的地方会统一使用elasticsearch/7.10.1,如果是ARM用户的话请自行改成对应镜像名称
ES需要占用两个端口号
kibana需要占用一个端口号,默认是5601,可以通过浏览器直接访问。
ES需要三个存储目录,如果使用上述的elasticsearch/7.10.1镜像,默认在:
kibana需要配置文件(kibana本身是一个无状态服务,不需要额外的数据信息),如果使用上述的kibana/7.10.1镜像,默认在:
但是由于kibana需要的配置相对简单,本文使用环境变量的方式在运行时配置,不再单独配置yml配置文件,可以根据个人需要进行单独配置。
在部署集群时,哪台机器部署,每台机器部署几个ES节点,相关数据目录放在哪等问题因人而异,但都需要进行提前规划,本文规划如下:
具体方案如下:
部署内容 | 部署名称 | 端口号 | 机器 | 数据目录 |
---|---|---|---|---|
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 | 不需要 |
直接执行如下命令即可。
docker run \
--name es00 \
-d -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
elasticsearch:7.10.1
直接访问本机的9200端口,比如 http://127.0.0.1:9200,如果能够看到如下内容说明启动正常。
上文中提到,ES需要三个存储目录,在容器中的:
所以我们需要将这三个目录在宿主机中进行建立,并将其映射到上述容器内的三个目录中去。
在这里,我们使用/data/elasticsearch/es00/{data,logs,config}三个目录。
mkdir -p /data/elasticsearch/es00/{data,logs,config}
chmod 777 -R /data/elasticsearch/es00
在/data/elasticsearch/es00/config中我们需要3个配置文件,在es启动时会需要使用,分别是jvm,log和es参数的配置文件。
这边已经将相关文件准备好,可以直接使用下面的命令进行下载。
curl https://nginx.mostintelligentape.com/blogimg/elasticsearch/single/jvm.options > /data/elasticsearch/es00/config/jvm.options
curl https://nginx.mostintelligentape.com/blogimg/elasticsearch/single/elasticsearch.yml > /data/elasticsearch/es00/config/elasticsearch.yml
curl https://nginx.mostintelligentape.com/blogimg/elasticsearch/single/log4j2.properties > /data/elasticsearch/es00/config/log4j2.properties
docker run \
--name es00 \
-d -p 9200:9200 -p 9300:9300 \
-v /data/elasticsearch/es00/data:/usr/share/elasticsearch/data \
-v /data/elasticsearch/es00/logs:/usr/share/elasticsearch/logs \
-v /data/elasticsearch/es00/config:/usr/share/elasticsearch/config \
elasticsearch:7.10.1
如果之前es00重名了,可以先执行docker rm -f es00,然后再运行上面的启动命令。
直接访问本机的9200端口,比如 http://127.0.0.1:9200,如果能够看到如下内容说明启动正常。
1 通过API写入数据
curl -X PUT http://127.0.0.1:9200/myindex/doc/1 -d'{"name":"josiah","age":18}' --header "Content-Type: application/json"
2 通过该API能够查询数据
curl http://127.0.0.1:9200/myindex/doc/1?pretty
能够看到刚才写入的数据能够
{
"_index" : "myindex",
"_type" : "doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "josiah",
"age" : 18
}
}
3 验证本地目录有数据存储文件
执行如下命令,可以看到内部已有数据文件
du -sh /data/elasticsearch/es00/data/
4 删除容器,重新启动
docker rm -f es00
docker run \
--name es00 \
-d -p 9200:9200 -p 9300:9300 \
-v /data/elasticsearch/es00/data:/usr/share/elasticsearch/data \
-v /data/elasticsearch/es00/logs:/usr/share/elasticsearch/logs \
-v /data/elasticsearch/es00/config:/usr/share/elasticsearch/config \
elasticsearch:7.10.1
5 之前写入的数据仍然存在
curl http://127.0.0.1:9200/myindex/doc/1?pretty
{
"_index" : "myindex",
"_type" : "doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "josiah",
"age" : 18
}
}
执行如下命令,将下面的http://192.168.51.1:9200换成对应部署的es的地址即可。
不可以使用127.0.0.1或者localhost,需要使用宿主机的网卡ip
docker run \
--name kib \
-d -p 5601:5601 \
-e "ELASTICSEARCH_HOSTS=http://192.168.51.1:9200" \
kibana:7.10.1
启动后访问IP:5601即可。
在确保es00运行的情况下,执行如下命令进入容器内部(以便使用es相关脚本进行加密证书的生成与配置)
docker exec -it es00 bash
如图
1 创建本地CA
仍然在容器内,执行如下语句,第一次要求输入的文件名称直接回车(图中第1个箭头),第二次要求输入的证书密码输入一个不小于6位的密码(图中第2个箭头),记录好,完成后当前目录会多一个"elastic-stack-ca.p12"文件(图中第3个箭头)。
./bin/elasticsearch-certutil ca
2 生成数字证书
仍然在容器内,执行如下命令,第一次要求输入时输入上面创建本地CA时输入的密码(图中第1个箭头),第二次要求输入的文件名称直接回车(图中第2个箭头),第三次要求输入时也可以输入上面创建本地CA时输入的密码(图中第3个箭头),完成后当前目录会多一个"elastic-certificates.p12"文件(图中第4个箭头),然后将其移动到./config/certificates中去(也是我们做了持久化的目录),最后对其的权限进行修改确保ES能够正常使用它(图中第5个箭头)。
./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
mkdir ./config/certificates
mv ./elastic-certificates.p12 ./config/certificates/
chmod 777 ./config/certificates/elastic-certificates.p12
仍然在容器内,通过执行如下的vi命令编辑elasticsearch.yml文件
vi ./config/elasticsearch.yml
添加如下内容,告知ES使用刚才创建的证书文件,如图:
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Type,Content-Length
xpack.security.enabled: true
xpack.security.authc.accept_default_password: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certificates/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certificates/elastic-certificates.p12
最后执行如下两行语句,如果需要输入密码使用第二步的密码即可
./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
接着第三步,如果还在容器内,执行exit退出容器,然后执行docker restart es00重启es服务。
在确保es00运行的情况下,执行如下命令进入容器内部
docker exec -it es00 bash
如图
然后执行如下语句,先输入y进行确认,然后会要求定义ES相关各类账户的密码,输入不少于6位的,不是纯数字的若干平台(elastic,apm,kibana,logstash,beats,remote_monitor)的密码,如图。
./bin/elasticsearch-setup-passwords interactive
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rTUVVMkG-1655200502715)(https://nginx.mostintelligentape.com/blogimg/202206/es/es_set_pwd.jpg)]
然后浏览器访问http://IP地址:9200,即会弹出密码框,用户名输入elastc,密码输入刚才定义的密码,即可进入,如图。
注:如果想要修改密码的话,可以使用下面的方法,注意–user后面跟上目前elastic用户的账号密码
curl --user elastic:123456 -XPOST --header "Content-Type: application/json" -d '{"password": "a123456"}' http://192.168.1.1:9200/_security/user/elastic/_password
curl --user elastic:a123456 -XPOST --header "Content-Type: application/json" -d '{"password": "123456a"}' http://192.168.1.1:9200/_security/user/kibana/_password
此时ES已经有了密码,如果再访问我们上面部署的Kibana会发现无法访问了,我们也需要告诉Kibana对应ES的密码才行,如图。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LVj9bUV1-1655200502717)(https://nginx.mostintelligentape.com/blogimg/202206/es/kibana_need_pwd.jpg)]
如果之前已经启动了Kibana,可以先执行docker rm -f kib进行删除
启动命令加入ES的账号密码信息即可,如下,将ELASTICSEARCH_HOSTS,ELASTICSEARCH_USERNAME,ELASTICSEARCH_PASSWORD配置成你的ES的地址、账号和密码即可。
docker run \
--name kib \
-d -p 5601:5601 \
-e "ELASTICSEARCH_HOSTS=http://192.168.51.1:9200" \
-e "ELASTICSEARCH_USERNAME=elastic" \
-e "ELASTICSEARCH_PASSWORD=a123456" \
kibana:7.10.1
如图。
本文部署集群的规划如下:
具体方案如下:
部署内容 | 部署名称 | 端口号 | 机器 | 数据目录 |
---|---|---|---|---|
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 | 不需要 |
每一个节点的部署方式是一样的,这边针对es00节点的部署进行展开描述,其他两个节点的部署直接粘贴命令。
第一步:建立目录
mkdir -p /data/elasticsearch/es00/{data,logs,config}
chmod 777 -R /data/elasticsearch/es00
第二步:拷贝配置文件
在/data/elasticsearch/es00/config中我们需要3个配置文件,在es启动时会需要使用,分别是jvm,log和es参数的配置文件。
这边已经将相关文件准备好,可以直接使用下面的命令进行下载。
curl https://nginx.mostintelligentape.com/blogimg/elasticsearch/init_config/es00/jvm.options > /data/elasticsearch/es00/config/jvm.options
curl https://nginx.mostintelligentape.com/blogimg/elasticsearch/init_config/es00/elasticsearch.yml > /data/elasticsearch/es00/config/elasticsearch.yml
curl https://nginx.mostintelligentape.com/blogimg/elasticsearch/init_config/es00/log4j2.properties > /data/elasticsearch/es00/config/log4j2.properties
其中elasticsearch.yml补充说明,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MxOv8gO1-1655200502718)(https://nginx.mostintelligentape.com/blogimg/202206/es/es_yml.jpg)]
第三步:启动
执行如下命令即可启动,如果之前es00重名了,可以先执行docker rm -f es00,然后再运行下面的启动命令(需要根据实际情况修改–add-host)。
docker run \
--name es00 \
-d -p 9200:9200 -p 9300:9300 \
-v /data/elasticsearch/es00/data:/usr/share/elasticsearch/data \
-v /data/elasticsearch/es00/logs:/usr/share/elasticsearch/logs \
-v /data/elasticsearch/es00/config:/usr/share/elasticsearch/config \
--add-host es00:192.168.51.2 --add-host es01:192.168.51.2 --add-host es02:192.168.51.1 \
elasticsearch:7.10.1
上面的命令参数补充说明:
第四步:验证
直接浏览器访问IP:9200即可验证启动成功
第一步:建立目录
mkdir -p /data/elasticsearch/es01/{data,logs,config}
chmod 777 -R /data/elasticsearch/es01
第二步:拷贝配置文件
curl https://nginx.mostintelligentape.com/blogimg/elasticsearch/init_config/es01/jvm.options > /data/elasticsearch/es01/config/jvm.options
curl https://nginx.mostintelligentape.com/blogimg/elasticsearch/init_config/es01/elasticsearch.yml > /data/elasticsearch/es01/config/elasticsearch.yml
curl https://nginx.mostintelligentape.com/blogimg/elasticsearch/init_config/es01/log4j2.properties > /data/elasticsearch/es01/config/log4j2.properties
第三步:启动
执行如下命令即可启动,如果之前es01重名了,可以先执行docker rm -f es01,然后再运行下面的启动命令(需要根据实际情况修改–add-host)。
docker run \
--name es01 \
-d -p 9201:9201 -p 9301:9301 \
-v /data/elasticsearch/es01/data:/usr/share/elasticsearch/data \
-v /data/elasticsearch/es01/logs:/usr/share/elasticsearch/logs \
-v /data/elasticsearch/es01/config:/usr/share/elasticsearch/config \
--add-host es00:192.168.51.2 --add-host es01:192.168.51.2 --add-host es02:192.168.51.1 \
elasticsearch:7.10.1
第四步:验证
直接浏览器访问IP:9201即可验证启动成功
第一步:建立目录
mkdir -p /data/elasticsearch/es02/{data,logs,config}
chmod 777 -R /data/elasticsearch/es02
第二步:拷贝配置文件
curl https://nginx.mostintelligentape.com/blogimg/elasticsearch/init_config/es02/jvm.options > /data/elasticsearch/es02/config/jvm.options
curl https://nginx.mostintelligentape.com/blogimg/elasticsearch/init_config/es02/elasticsearch.yml > /data/elasticsearch/es02/config/elasticsearch.yml
curl https://nginx.mostintelligentape.com/blogimg/elasticsearch/init_config/es02/log4j2.properties > /data/elasticsearch/es02/config/log4j2.properties
第三步:启动
执行如下命令即可启动,如果之前es02重名了,可以先执行docker rm -f es02,然后再运行下面的启动命令(需要根据实际情况修改–add-host)。
docker run \
--name es02 \
-d -p 9202:9202 -p 9302:9302 \
-v /data/elasticsearch/es02/data:/usr/share/elasticsearch/data \
-v /data/elasticsearch/es02/logs:/usr/share/elasticsearch/logs \
-v /data/elasticsearch/es02/config:/usr/share/elasticsearch/config \
--add-host es00:192.168.51.2 --add-host es01:192.168.51.2 --add-host es02:192.168.51.1 \
elasticsearch:7.10.1
第四步:验证
直接浏览器访问IP:9202即可验证启动成功
访问三个节点任意一个的http://IP:端口/_cat/nodes能够看到集群信息。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LhylB47o-1655200502719)(https://nginx.mostintelligentape.com/blogimg/202206/es/es_cluster_success.jpg)]
执行如下命令,将下面的http://192.168.51.1:9200换成对应部署的es的地址与端口即可。
不可以使用127.0.0.1或者localhost,需要使用宿主机的网卡ip
docker run \
--name kib \
-d -p 5601:5601 \
-e "ELASTICSEARCH_HOSTS=http://192.168.51.1:9200" \
kibana:7.10.1
启动后访问IP:5601即可。
在确保es00运行的情况下,执行如下命令进入容器内部(以便使用es相关脚本进行加密证书的生成与配置)
docker exec -it es00 bash
如图
1 创建本地CA
仍然在容器内,执行如下语句,第一次要求输入的文件名称直接回车(图中第1个箭头),第二次要求输入的证书密码输入一个不小于6位的密码(图中第2个箭头),记录好,完成后当前目录会多一个"elastic-stack-ca.p12"文件(图中第3个箭头)。
./bin/elasticsearch-certutil ca
2 生成数字证书
仍然在容器内,执行如下命令,第一次要求输入时输入上面创建本地CA时输入的密码(图中第1个箭头),第二次要求输入的文件名称直接回车(图中第2个箭头),第三次要求输入时也可以输入上面创建本地CA时输入的密码(图中第3个箭头),完成后当前目录会多一个"elastic-certificates.p12"文件(图中第4个箭头),然后将其移动到./config/certificates中去(也是我们做了持久化的目录),最后对其的权限进行修改确保ES能够正常使用它(图中第5个箭头)。
./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
mkdir ./config/certificates
mv ./elastic-certificates.p12 ./config/certificates/
chmod 777 ./config/certificates/elastic-certificates.p12
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EGHhpXhb-1655200502720)(https://nginx.mostintelligentape.com/blogimg/202206/es/es_create_cert.jpg)]
3 将数字证书拷贝到其他节点上
将上面的elastic-certificates.p12文件拷贝到所有节点上:
依次进入所有节点的容器,通过执行如下的vi命令编辑elasticsearch.yml文件
vi ./config/elasticsearch.yml
添加如下内容,告知ES使用刚才创建的证书文件,如图:
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Type,Content-Length
xpack.security.enabled: true
xpack.security.authc.accept_default_password: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certificates/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certificates/elastic-certificates.p12
最后执行如下两行语句,如果需要输入密码使用第二步的密码即可
./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
对所有机器的所有es节点进行重启。
docker restart es00
docker restart es01
docker restart es02
在确保es服务运行的情况下,找任意一个节点执行如下命令进入容器(密码设置会自动同步到各个节点上,所以不用重复执行)
docker exec -it es00 bash
如图
然后执行如下语句,先输入y进行确认,然后会要求定义ES相关各类账户的密码,输入不少于6位的,不是纯数字的若干平台(elastic,apm,kibana,logstash,beats,remote_monitor)的密码,如图。
./bin/elasticsearch-setup-passwords interactive
然后浏览器访问http://IP地址:9200,即会弹出密码框,用户名输入elastc,密码输入刚才定义的密码,即可进入,如图。
注:如果想要修改密码的话,可以使用下面的方法,注意–user后面跟上目前elastic用户的账号密码
curl --user elastic:123456 -XPOST --header "Content-Type: application/json" -d '{"password": "a123456"}' http://192.168.1.1:9200/_security/user/elastic/_password
curl --user elastic:a123456 -XPOST --header "Content-Type: application/json" -d '{"password": "123456a"}' http://192.168.1.1:9200/_security/user/kibana/_password
此时ES已经有了密码,如果再访问我们上面部署的Kibana会发现无法访问了,我们也需要告诉Kibana对应ES的密码才行,如图。
如果之前已经启动了Kibana,可以先执行docker rm -f kib进行删除
启动命令加入ES的账号密码信息即可,如下,将ELASTICSEARCH_HOSTS,ELASTICSEARCH_USERNAME,ELASTICSEARCH_PASSWORD配置成你的ES的地址、账号和密码即可。
docker run \
--name kib \
-d -p 5601:5601 \
-e "ELASTICSEARCH_HOSTS=http://192.168.51.1:9200" \
-e "ELASTICSEARCH_USERNAME=elastic" \
-e "ELASTICSEARCH_PASSWORD=a123456" \
kibana:7.10.1
如图。
如果报错vm.max_map_count太低,需要将其设置为至少262144,参考链接
sysctl -w vm.max_map_count=262144
在上文的jvm.options中,关于堆内存的设置默认是1GB,对于大部分生产环境来说是不够的,这一块可以根据实际情况进行调整
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。