Docker环境安装Elasticsearch8.5.3(ik分词器 + 单节点模式 + 集群模式)+ Kibana8.5....
source link: https://maxqiu.com/article/detail/150
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Elasticsearch
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.5.3
因为
Spring Boot 3.0.1
对应的Spring Data Elasticsearch 5.0.0
对应的Elasticsearch
的版本为8.5.3
,所以本文以此版本为例
修改 sysctl.conf
编辑配置文件
vim /etc/sysctl.conf
添加如下设置
vm.max_map_count = 262144
net.ipv4.tcp_retries2=5
保存后执行以下命令立即生效
sysctl -p
检查 ulimits 的 nofile 和 nproc
运行一个测试容器(运行时会拉取 centos
镜像,请耐心等待),输出默认值
docker run --rm centos:7 /bin/bash -c 'ulimit -Hn && ulimit -Sn && ulimit -Hu && ulimit -Su'
默认情况下,会输出如下内容
- 前两位代表:最多可开启的文件数,最小要求65536
- 后两位代表:进程开启多少个线程,最小要求4096,
unlimited
代表不受限制
65536
65536
unlimited
unlimited
若出现被限制的值,则需要在执行 docker run
时添加如下参数
--ulimit nofile=65536:65536 --ulimit nproc=4096:4096
禁用 swap 分区
若已关闭则忽略
方案1:关闭宿主机的 swap (推荐)
swapoff -a
#编辑配置文件
vim /etc/fstab
# 在/etc/fstab中swap分区这行前加 #
# /dev/mapper/centos-swap swap swap defaults 0 0
方案2:关闭容器的 swap
在执行 docker run
时添加如下参数
-e "bootstrap.memory_lock=true" --ulimit memlock=-1:-1
端口 | 协议 | 作用 |
---|---|---|
9200 | tcp | 客户端访问 |
9300 | tcp | 集群数据通信 |
在执行 docker run
时添加 -p
参数完成端口映射,如果是单节点,9300可以不用映射,如果不需要外部访问,仅容器之间访问,9200也可以不用映射
检查Docker存储驱动程序
不建议使用 loop-lvm
驱动,执行以下命令查看驱动
docker info | grep Storage
查看结果是否如下,默认情况下,驱动为 overlay2
Storage Driver: overlay2
如若出现 loop-lvm
,请参考Docker storage drivers相关文档
自定义网络
创建一个网络,方便后续的其他服务连接进来,网络名称( elk-birdge
)可自定义
docker network create elk-birdge
文件夹准备
# 创建 elasticsearch 文件夹
mkdir -p /work/elasticsearch
# 进入该文件夹(下文中的命令均以该目录为基础!)
cd /work/elasticsearch
# 创建自定义 image 文件夹,并创建ik分词器文件夹
mkdir -p image/ik
添加 elasticsearch-analysis-ik
ik中文分词器,推荐安装
下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
需要下载对应的 8.5.3
版本zip
包。注意!是zip
包!下载完成后上传至服务器
PS:由于作者未更新至 8.5.3
,所以只能下载 8.5.2
的包
# 安装解压工具(若已安装,则忽略此步)
yum -y install zip unzip
# 解压
unzip elasticsearch-analysis-ik-8.5.2.zip -d /work/elasticsearch/image/ik/
# 删除
rm -rf elasticsearch-analysis-ik-8.5.2.zip
# 修改 ik 分词器的配置
vim /work/elasticsearch/image/ik/plugin-descriptor.properties
# 将文档结尾的 elasticsearch.version=8.5.2 改为 elasticsearch.version=8.5.3 并保存
制作自定义镜像(含时区和自定义插件)
编写 Dockerfile
新建一个Dockerfile文件
vim ./image/Dockerfile
添加如下内容
FROM docker.elastic.co/elasticsearch/elasticsearch:8.5.3
# 切换至 root
USER root
# 设置为国内源,更新源、安装 tzdata 、设置时区
RUN curl -o /etc/apt/sources.list http://mirrors.cloud.tencent.com/repo/ubuntu20_sources.list \
&& apt-get update -y && apt-get upgrade -y \
&& ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone \
&& apt-get install -y tzdata \
&& dpkg-reconfigure -f noninteractive tzdata \
&& apt-get clean \
&& apt-get autoclean
# 回到 elasticsearch 用户
USER elasticsearch
ADD ik /usr/share/elasticsearch/plugins/ik/
执行制作镜像
docker build -t elasticsearch-ik:8.5.3 ./image/
单节点模式启动
创建文件夹
创建数据存储文件夹,并修改文件夹所有者。说明:默认情况下,容器运行使用 elasticsearch
用户并且 uid:gid
为 1000:0
,所以使用 -v
绑定本地数据卷时,需要修改文件夹访问权限以允许容器访问
mkdir data
chmod g+rwx data
chgrp 0 data
docker run -d --name elasticsearch -h elasticsearch --restart always \
-v /work/elasticsearch/data/:/usr/share/elasticsearch/data \
--network elk-birdge -p 9200:9200 \
-e "network.host=0.0.0.0" \
-e "network.publish_host=192.168.220.101" \
-e "discovery.type=single-node" \
-e "ingest.geoip.downloader.enabled=false" \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
elasticsearch-ik:8.5.3
启动脚本注意如下事项
ulimit
相关设置根据情况自行添加swap
相关设置根据情况自行添加- 如果后面搭建的
Kibana
和Elasticsearch
在同一台服务器同一个网络下,则无需添加-e "network.publish_host=192.168.220.101" \
,其中192.168.220.101
为宿主机的IP
-e "discovery.type=single-node"
:使用单节点模式-e "ingest.geoip.downloader.enabled=false"
:关闭geoip
数据下载-e ES_JAVA_OPTS="-Xms512m -Xmx512m"
:JVM
内存设置,根据实际情况调整,但是Xms
和Xmx
的值一定要相等- 端口根据需要进行映射
跟踪日志,当日志停止输出且中途未出现 ERROR
即可表示容器启动成功,此时可以按 Ctrl + c
退出跟踪
docker logs -f elasticsearch
重置初始密码
由于启动时使用了 -d
参数,首次启动时生成的默认密码不会在控制台输出,所以需要重置密码。执行以下脚本
docker exec -it elasticsearch /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
根据提示输入 y
并回车,新密码将在控制台显示
浏览器访问:https://[ip]:9200
,注意是 https
协议,默认用户名为 elastic
,密码在上文生成的密码,访问成功后可以看到如下类似信息
{
"name" : "elasticsearch",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "3VEaabgoSzuiBUbDHj07zA",
"version" : {
"number" : "8.5.3",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "4ed5ee9afac63de92ec98f404ccbed7d3ba9584e",
"build_date" : "2022-12-05T18:22:22.226119656Z",
"build_snapshot" : false,
"lucene_version" : "9.4.2",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
集群模式启动
以四台服务器三个节点为例,环境如下
IP | 服务 |
---|---|
192.168.220.101 | elasticsearch1 |
192.168.220.102 | elasticsearch2 |
192.168.220.103 | elasticsearch3 |
192.168.220.104 | kibana |
PS:如果需要在一台服务器上完成以上四个服务的搭建(测试可以,生产环境不推荐),需要至少 8G
内存,在下文的教程中,需要注意数据文件目录,节点启动命令需要删除 -e "network.publish_host=xxx" \
配置。
创建文件夹
在 elasticsearch
的节点上创建数据存储文件夹,并修改文件夹所有者。说明:默认情况下,容器运行使用 elasticsearch
用户并且 uid:gid
为 1000:0
,所以使用 -v
绑定本地数据卷时,需要修改文件夹访问权限以允许容器访问
mkdir data
chmod g+rwx data
chgrp 0 data
启动主节点
在主节点的机器上执行一下命令
docker run -d --name elasticsearch1 -h elasticsearch1 --restart always \
-v /work/elasticsearch/data/:/usr/share/elasticsearch/data \
--network elk-birdge -p 9200:9200 -p 9300:9300 \
-e "cluster.name=es_cluster" \
-e "network.host=0.0.0.0" \
-e "network.publish_host=192.168.220.101" \
-e "ingest.geoip.downloader.enabled=false" \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
elasticsearch-ik:8.5.3
启动脚本注意如下事项
ulimit
相关设置根据情况自行添加swap
相关设置根据情况自行添加es_cluster
是集群名称,可自定义,集群名称相同才能加入192.168.220.101
为宿主机的IP
-e "ingest.geoip.downloader.enabled=false"
:关闭geoip
数据下载-e ES_JAVA_OPTS="-Xms512m -Xmx512m"
:JVM
内存设置,根据实际情况调整,但是Xms
和Xmx
的值一定要相等- 多台服务器时,两个端口都需要映射
跟踪日志,当日志停止输出且中途未出现 ERROR 即可表示容器启动成功,此时可以按 Ctrl + c 退出跟踪
docker logs -f elasticsearch1
生成从节点加入 token
由于启动时使用了 -d
参数,首次启动时生成的默认 token
不会在控制台输出,所以需要手动重置一下。 token
有效期为半小时,可多次使用。
docker exec -it elasticsearch1 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node
启动从节点
启动时,需要将脚本中的 token
更换成上文生成的
docker run -d --name elasticsearch2 -h elasticsearch2 --restart always \
-v /work/elasticsearch/data/:/usr/share/elasticsearch/data \
--network elk-birdge -p 9200:9200 -p 9300:9300 \
-e "cluster.name=es_cluster" \
-e "network.host=0.0.0.0" \
-e "network.publish_host=192.168.220.102" \
-e ENROLLMENT_TOKEN="token" \
-e "ingest.geoip.downloader.enabled=false" \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
elasticsearch-ik:8.5.3
docker run -d --name elasticsearch3 -h elasticsearch3 --restart always \
-v /work/elasticsearch/data/:/usr/share/elasticsearch/data \
--network elk-birdge -p 9200:9200 -p 9300:9300 \
-e "cluster.name=es_cluster" \
-e "network.host=0.0.0.0" \
-e "network.publish_host=192.168.220.103" \
-e ENROLLMENT_TOKEN="token" \
-e "ingest.geoip.downloader.enabled=false" \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
elasticsearch-ik:8.5.3
重置初始密码
由于启动时使用了 -d
参数,首次启动时生成的默认密码不会在控制台输出,所以需要重置密码,在主节点执行以下命令
docker exec -it elasticsearch1 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
根据提示输入 y
并回车,新密码将在控制台显示
浏览器访问:https://[ip]:9200
,注意是 https
协议,默认用户名为 elastic
,密码在上文生成的密码,访问成功后可以看到如下类似信息
{
"name" : "elasticsearch1",
"cluster_name" : "es_cluster",
"cluster_uuid" : "e4IGny9-T8i7yrO5Ucx5OQ",
"version" : {
"number" : "8.5.3",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "4ed5ee9afac63de92ec98f404ccbed7d3ba9584e",
"build_date" : "2022-12-05T18:22:22.226119656Z",
"build_snapshot" : false,
"lucene_version" : "9.4.2",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
Kibana
官方教程:Install Kibana with Docker
docker pull docker.elastic.co/kibana/kibana:8.5.3
创建 token
执行以下脚本创建 token
;集群模式时,在 elasticsearch
节点上执行,注意容器名称
docker exec -it elasticsearch /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
将新生成的 token
记录下来,下文需要使用
docker run -d --name kibana -h kibana --restart always -p 5601:5601 --network elk-birdge docker.elastic.co/kibana/kibana:8.5.3
访问与配置
在容器启动后,查看启动日志
docker logs -f kibana
- 当在日志中看到
Go to http://0.0.0.0:5601/?code=261687 to get started.
信息时,代表容器启动成功(code
代码每个人都不同) - 直接访问
http://[ip]:5601
进入Kibana
配置页面;也可以复制日志中的http://0.0.0.0:5601/?code=261687
这段信息粘贴到浏览器,并将0.0.0.0
改为宿主机的IP
后进入配置页面 - 之后看到信息提示输入
token
,将上文中生成的那段token
粘贴进去(粘贴之后就可以看到elasticsearch
的地址信息)并点击Configure Elastic
完成配置,如果在上一步访问时url
没有携带code
则此时会提示输入,完成输入并确定即可配置成功
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK