1

Docker环境安装Elasticsearch8.5.3(ik分词器 + 单节点模式 + 集群模式)+ Kibana8.5....

 1 year ago
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.
neoserver,ios ssh client

Elasticsearch

官方教程:Install Elasticsearch with Docker



  1. 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

编辑配置文件



  1. vim /etc/sysctl.conf

添加如下设置



  1. vm.max_map_count = 262144
  2. net.ipv4.tcp_retries2=5

保存后执行以下命令立即生效



  1. sysctl -p

检查 ulimits 的 nofile 和 nproc

运行一个测试容器(运行时会拉取 centos 镜像,请耐心等待),输出默认值



  1. docker run --rm centos:7 /bin/bash -c 'ulimit -Hn && ulimit -Sn && ulimit -Hu && ulimit -Su'

默认情况下,会输出如下内容

  • 前两位代表:最多可开启的文件数,最小要求65536
  • 后两位代表:进程开启多少个线程,最小要求4096,unlimited 代表不受限制


  1. 65536
  2. 65536
  3. unlimited
  4. unlimited

若出现被限制的值,则需要在执行 docker run 时添加如下参数



  1. --ulimit nofile=65536:65536 --ulimit nproc=4096:4096

禁用 swap 分区

若已关闭则忽略

方案1:关闭宿主机的 swap (推荐)



  1. swapoff -a


  1. #编辑配置文件
  2. vim /etc/fstab
  3. # 在/etc/fstab中swap分区这行前加 #
  4. # /dev/mapper/centos-swap swap swap defaults 0 0

方案2:关闭容器的 swap

在执行 docker run 时添加如下参数



  1. -e "bootstrap.memory_lock=true" --ulimit memlock=-1:-1
端口 协议 作用
9200 tcp 客户端访问
9300 tcp 集群数据通信

在执行 docker run 时添加 -p 参数完成端口映射,如果是单节点,9300可以不用映射,如果不需要外部访问,仅容器之间访问,9200也可以不用映射

检查Docker存储驱动程序

不建议使用 loop-lvm 驱动,执行以下命令查看驱动



  1. docker info | grep Storage

查看结果是否如下,默认情况下,驱动为 overlay2



  1. Storage Driver: overlay2

如若出现 loop-lvm,请参考Docker storage drivers相关文档

自定义网络

创建一个网络,方便后续的其他服务连接进来,网络名称( elk-birdge )可自定义



  1. docker network create elk-birdge

文件夹准备



  1. # 创建 elasticsearch 文件夹
  2. mkdir -p /work/elasticsearch
  3. # 进入该文件夹(下文中的命令均以该目录为基础!)
  4. cd /work/elasticsearch
  5. # 创建自定义 image 文件夹,并创建ik分词器文件夹
  6. 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 的包



  1. # 安装解压工具(若已安装,则忽略此步)
  2. yum -y install zip unzip
  3. # 解压
  4. unzip elasticsearch-analysis-ik-8.5.2.zip -d /work/elasticsearch/image/ik/
  5. # 删除
  6. rm -rf elasticsearch-analysis-ik-8.5.2.zip


  1. # 修改 ik 分词器的配置
  2. vim /work/elasticsearch/image/ik/plugin-descriptor.properties
  3. # 将文档结尾的 elasticsearch.version=8.5.2 改为 elasticsearch.version=8.5.3 并保存

制作自定义镜像(含时区和自定义插件)

编写 Dockerfile

新建一个Dockerfile文件



  1. vim ./image/Dockerfile

添加如下内容



  1. FROM docker.elastic.co/elasticsearch/elasticsearch:8.5.3
  2. # 切换至 root
  3. USER root
  4. # 设置为国内源,更新源、安装 tzdata 、设置时区
  5. RUN curl -o /etc/apt/sources.list http://mirrors.cloud.tencent.com/repo/ubuntu20_sources.list \
  6. && apt-get update -y && apt-get upgrade -y \
  7. && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
  8. && echo "Asia/Shanghai" > /etc/timezone \
  9. && apt-get install -y tzdata \
  10. && dpkg-reconfigure -f noninteractive tzdata \
  11. && apt-get clean \
  12. && apt-get autoclean
  13. # 回到 elasticsearch 用户
  14. USER elasticsearch
  15. ADD ik /usr/share/elasticsearch/plugins/ik/

执行制作镜像



  1. docker build -t elasticsearch-ik:8.5.3 ./image/

单节点模式启动

创建文件夹

创建数据存储文件夹,并修改文件夹所有者。说明:默认情况下,容器运行使用 elasticsearch 用户并且 uid:gid1000:0 ,所以使用 -v 绑定本地数据卷时,需要修改文件夹访问权限以允许容器访问



  1. mkdir data
  2. chmod g+rwx data
  3. chgrp 0 data


  1. docker run -d --name elasticsearch -h elasticsearch --restart always \
  2. -v /work/elasticsearch/data/:/usr/share/elasticsearch/data \
  3. --network elk-birdge -p 9200:9200 \
  4. -e "network.host=0.0.0.0" \
  5. -e "network.publish_host=192.168.220.101" \
  6. -e "discovery.type=single-node" \
  7. -e "ingest.geoip.downloader.enabled=false" \
  8. -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
  9. elasticsearch-ik:8.5.3

启动脚本注意如下事项

  • ulimit 相关设置根据情况自行添加
  • swap 相关设置根据情况自行添加
  • 如果后面搭建的 KibanaElasticsearch 在同一台服务器同一个网络下,则无需添加 -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 内存设置,根据实际情况调整,但是 XmsXmx 的值一定要相等
  • 端口根据需要进行映射

跟踪日志,当日志停止输出且中途未出现 ERROR 即可表示容器启动成功,此时可以按 Ctrl + c 退出跟踪



  1. docker logs -f elasticsearch

重置初始密码

由于启动时使用了 -d 参数,首次启动时生成的默认密码不会在控制台输出,所以需要重置密码。执行以下脚本



  1. docker exec -it elasticsearch /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic

根据提示输入 y 并回车,新密码将在控制台显示

浏览器访问:https://[ip]:9200,注意是 https 协议,默认用户名为 elastic ,密码在上文生成的密码,访问成功后可以看到如下类似信息



  1. {
  2. "name" : "elasticsearch",
  3. "cluster_name" : "docker-cluster",
  4. "cluster_uuid" : "3VEaabgoSzuiBUbDHj07zA",
  5. "version" : {
  6. "number" : "8.5.3",
  7. "build_flavor" : "default",
  8. "build_type" : "docker",
  9. "build_hash" : "4ed5ee9afac63de92ec98f404ccbed7d3ba9584e",
  10. "build_date" : "2022-12-05T18:22:22.226119656Z",
  11. "build_snapshot" : false,
  12. "lucene_version" : "9.4.2",
  13. "minimum_wire_compatibility_version" : "7.17.0",
  14. "minimum_index_compatibility_version" : "7.0.0"
  15. },
  16. "tagline" : "You Know, for Search"
  17. }

集群模式启动

以四台服务器三个节点为例,环境如下

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:gid1000:0 ,所以使用 -v 绑定本地数据卷时,需要修改文件夹访问权限以允许容器访问



  1. mkdir data
  2. chmod g+rwx data
  3. chgrp 0 data

启动主节点

在主节点的机器上执行一下命令



  1. docker run -d --name elasticsearch1 -h elasticsearch1 --restart always \
  2. -v /work/elasticsearch/data/:/usr/share/elasticsearch/data \
  3. --network elk-birdge -p 9200:9200 -p 9300:9300 \
  4. -e "cluster.name=es_cluster" \
  5. -e "network.host=0.0.0.0" \
  6. -e "network.publish_host=192.168.220.101" \
  7. -e "ingest.geoip.downloader.enabled=false" \
  8. -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
  9. 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 内存设置,根据实际情况调整,但是 XmsXmx 的值一定要相等
  • 多台服务器时,两个端口都需要映射

跟踪日志,当日志停止输出且中途未出现 ERROR 即可表示容器启动成功,此时可以按 Ctrl + c 退出跟踪



  1. docker logs -f elasticsearch1

生成从节点加入 token

由于启动时使用了 -d 参数,首次启动时生成的默认 token 不会在控制台输出,所以需要手动重置一下。 token 有效期为半小时,可多次使用。



  1. docker exec -it elasticsearch1 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node

启动从节点

启动时,需要将脚本中的 token 更换成上文生成的



  1. docker run -d --name elasticsearch2 -h elasticsearch2 --restart always \
  2. -v /work/elasticsearch/data/:/usr/share/elasticsearch/data \
  3. --network elk-birdge -p 9200:9200 -p 9300:9300 \
  4. -e "cluster.name=es_cluster" \
  5. -e "network.host=0.0.0.0" \
  6. -e "network.publish_host=192.168.220.102" \
  7. -e ENROLLMENT_TOKEN="token" \
  8. -e "ingest.geoip.downloader.enabled=false" \
  9. -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
  10. elasticsearch-ik:8.5.3


  1. docker run -d --name elasticsearch3 -h elasticsearch3 --restart always \
  2. -v /work/elasticsearch/data/:/usr/share/elasticsearch/data \
  3. --network elk-birdge -p 9200:9200 -p 9300:9300 \
  4. -e "cluster.name=es_cluster" \
  5. -e "network.host=0.0.0.0" \
  6. -e "network.publish_host=192.168.220.103" \
  7. -e ENROLLMENT_TOKEN="token" \
  8. -e "ingest.geoip.downloader.enabled=false" \
  9. -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
  10. elasticsearch-ik:8.5.3

重置初始密码

由于启动时使用了 -d 参数,首次启动时生成的默认密码不会在控制台输出,所以需要重置密码,在主节点执行以下命令



  1. docker exec -it elasticsearch1 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic

根据提示输入 y 并回车,新密码将在控制台显示

浏览器访问:https://[ip]:9200 ,注意是 https 协议,默认用户名为 elastic ,密码在上文生成的密码,访问成功后可以看到如下类似信息



  1. {
  2. "name" : "elasticsearch1",
  3. "cluster_name" : "es_cluster",
  4. "cluster_uuid" : "e4IGny9-T8i7yrO5Ucx5OQ",
  5. "version" : {
  6. "number" : "8.5.3",
  7. "build_flavor" : "default",
  8. "build_type" : "docker",
  9. "build_hash" : "4ed5ee9afac63de92ec98f404ccbed7d3ba9584e",
  10. "build_date" : "2022-12-05T18:22:22.226119656Z",
  11. "build_snapshot" : false,
  12. "lucene_version" : "9.4.2",
  13. "minimum_wire_compatibility_version" : "7.17.0",
  14. "minimum_index_compatibility_version" : "7.0.0"
  15. },
  16. "tagline" : "You Know, for Search"
  17. }

Kibana

官方教程:Install Kibana with Docker



  1. docker pull docker.elastic.co/kibana/kibana:8.5.3

创建 token

执行以下脚本创建 token ;集群模式时,在 elasticsearch 节点上执行,注意容器名称



  1. docker exec -it elasticsearch /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana

将新生成的 token 记录下来,下文需要使用



  1. docker run -d --name kibana -h kibana --restart always -p 5601:5601 --network elk-birdge docker.elastic.co/kibana/kibana:8.5.3

访问与配置

在容器启动后,查看启动日志



  1. docker logs -f kibana
  1. 当在日志中看到 Go to http://0.0.0.0:5601/?code=261687 to get started. 信息时,代表容器启动成功( code 代码每个人都不同)
  2. 直接访问 http://[ip]:5601 进入 Kibana 配置页面;也可以复制日志中的 http://0.0.0.0:5601/?code=261687 这段信息粘贴到浏览器,并将 0.0.0.0 改为宿主机的 IP 后进入配置页面
  3. 之后看到信息提示输入 token ,将上文中生成的那段 token 粘贴进去(粘贴之后就可以看到 elasticsearch 的地址信息)并点击 Configure Elastic 完成配置,如果在上一步访问时 url 没有携带 code 则此时会提示输入,完成输入并确定即可配置成功

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK