麦克斯仇
Think different
158
文章
26591
阅读
首页
INDEX
文章
ARTICLE
关于
ABOUT
Docker 环境安装 Elasticsearch8.10.4 (ik分词器 + 单节点模式 + 集群模式) + Kibana8.10.4
创建日期:
2023/01/14
修改日期:
2024/04/17
Docker
Elasticsearch
Kibana
# Elasticsearch > 官方教程:[Install Elasticsearch with .zip on Windows](https://www.elastic.co/guide/en/elasticsearch/reference/8.10/zip-windows.html) ## 镜像拉取 ```bash docker pull elasticsearch:8.10.4 ``` > 因为 `Spring Boot 3.2.2` 对应的 `Spring Data Elasticsearch 5.2.2` 对应的 `Elasticsearch` 的版本为 `8.10.4` ,所以本文以此版本为例 ## 系统配置 ### 修改 sysctl.conf 编辑配置文件 ```bash vim /etc/sysctl.conf ``` 添加如下设置 ```bash vm.max_map_count = 262144 net.ipv4.tcp_retries2=5 ``` 保存后执行以下命令立即生效 ```bash sysctl -p ``` ### 检查 ulimits 的 nofile 和 nproc 运行一个测试容器(运行时会拉取 `centos` 镜像,请耐心等待),输出默认值 ```bash 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` 时添加如下参数 ```bash --ulimit nofile=65536:65536 --ulimit nproc=4096:4096 ``` ### 禁用 swap 分区 若已关闭则忽略 #### 方案1:关闭宿主机的 swap (推荐) 1. 临时关闭 ```bash swapoff -a ``` 2. 永久关闭 ```bash #编辑配置文件 vim /etc/fstab # 在/etc/fstab中swap分区这行前加 # # /dev/mapper/centos-swap swap swap defaults 0 0 ``` #### 方案2:关闭容器的 swap 在执行 `docker run` 时添加如下参数 ```bash -e "bootstrap.memory_lock=true" --ulimit memlock=-1:-1 ``` ### 端口映射 | 端口 | 协议 | 作用 | | ---- | ---- | ------------ | | 9200 | tcp | 客户端访问 | | 9300 | tcp | 集群数据通信 | 在执行 `docker run` 时添加 `-p` 参数完成端口映射,如果是单节点,9300可以不用映射,如果不需要外部访问,仅容器之间访问,9200也可以不用映射 ### 检查Docker存储驱动程序 不建议使用 `loop-lvm` 驱动,执行以下命令查看驱动 ```bash docker info | grep Storage ``` 查看结果是否如下,默认情况下,驱动为 `overlay2` ```bash Storage Driver: overlay2 ``` 如若出现 `loop-lvm`,请参考[Docker storage drivers](https://docs.docker.com/storage/storagedriver/select-storage-driver/)相关文档 ## 其他配置 ### 自定义网络 创建一个网络,方便后续的其他服务连接进来,网络名称( `elk-birdge` )可自定义 ```bash docker network create elk-birdge ``` ### 文件夹准备 ```bash # 创建 elasticsearch 文件夹 mkdir -p /work/elasticsearch # 进入该文件夹(下文中的命令均以该目录为基础!) cd /work/elasticsearch # 创建 plugins 文件夹,用于存放插件 mkdir -p plugins ``` ### 添加 elasticsearch-analysis-ik #### 下载 下载地址:[https://github.com/infinilabs/analysis-ik/releases/tag/v8.10.4](https://github.com/infinilabs/analysis-ik/releases/tag/v8.10.4) 下载对应的 `8.10.4` 版本 `zip` 包。注意!是 `zip` 包! #### 解压 ```bash # 安装解压工具(若已安装,则忽略此步) # CentOS yum -y install zip unzip # Debian apt-get install zip unzip # 解压 unzip elasticsearch-analysis-ik-8.10.4.zip -d /work/elasticsearch/plugins/ik/ # 删除 rm -rf elasticsearch-analysis-ik-8.10.4.zip ``` ## 单节点模式启动 ### 创建文件夹 创建数据存储文件夹,并修改文件夹所有者。说明:默认情况下,容器运行使用 `elasticsearch` 用户并且 `uid:gid` 为 `1000:0` ,所以使用 `-v` 绑定本地数据卷时,需要修改文件夹访问权限以允许容器访问 ```bash mkdir data chmod g+rwx data chgrp 0 data ``` ### 启动容器 ```bash docker run -d --name elasticsearch -h elasticsearch --restart always \ -v /work/elasticsearch/data/:/usr/share/elasticsearch/data \ -v /work/elasticsearch/plugins/:/usr/share/elasticsearch/plugins \ --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:8.10.4 ``` 启动脚本注意如下事项 - `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` 退出跟踪 ```bash docker logs -f elasticsearch ``` ### 重置初始密码 由于启动时使用了 `-d` 参数,首次启动时生成的默认密码不会在控制台输出,所以需要重置密码。执行以下脚本 ```bash docker exec -it elasticsearch /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic ``` 根据提示输入 `y` 并回车,新密码将在控制台显示 ### 访问 浏览器访问:`https://[ip]:9200`,注意是 `https` 协议,默认用户名为 `elastic` ,密码在上文生成的密码,访问成功后可以看到如下类似信息 ```json { "name" : "elasticsearch", "cluster_name" : "docker-cluster", "cluster_uuid" : "Q4bqhQRzQ8KxSWeW6Ctz7g", "version" : { "number" : "8.10.4", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "b4a62ac808e886ff032700c391f45f1408b2538c", "build_date" : "2023-10-11T22:04:35.506990650Z", "build_snapshot" : false, "lucene_version" : "9.7.0", "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` 绑定本地数据卷时,需要修改文件夹访问权限以允许容器访问 ```bash mkdir data chmod g+rwx data chgrp 0 data ``` ### 启动容器 #### 启动主节点 在主节点的机器上执行一下命令 ```bash docker run -d --name elasticsearch1 -h elasticsearch1 --restart always \ -v /work/elasticsearch/data/:/usr/share/elasticsearch/data \ -v /work/elasticsearch/plugins/:/usr/share/elasticsearch/plugins \ --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:8.10.4 ``` 启动脚本注意如下事项 - `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 退出跟踪 ```bash docker logs -f elasticsearch1 ``` #### 生成从节点加入 token 由于启动时使用了 `-d` 参数,首次启动时生成的默认 `token` 不会在控制台输出,所以需要手动重置一下。 `token` 有效期为半小时,可多次使用。 ```bash docker exec -it elasticsearch1 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node ``` #### 启动从节点 启动时,需要将脚本中的 `token` 更换成上文生成的 > 从节点1 ```bash docker run -d --name elasticsearch2 -h elasticsearch2 --restart always \ -v /work/elasticsearch/data/:/usr/share/elasticsearch/data \ -v /work/elasticsearch/plugins/:/usr/share/elasticsearch/plugins \ --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:8.10.4 ``` > 从节点2 ```bash docker run -d --name elasticsearch3 -h elasticsearch3 --restart always \ -v /work/elasticsearch/data/:/usr/share/elasticsearch/data \ -v /work/elasticsearch/plugins/:/usr/share/elasticsearch/plugins \ --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:8.10.4 ``` ### 重置初始密码 由于启动时使用了 `-d` 参数,首次启动时生成的默认密码不会在控制台输出,所以需要重置密码,在主节点执行以下命令 ```bash docker exec -it elasticsearch1 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic ``` 根据提示输入 `y` 并回车,新密码将在控制台显示 ### 访问 浏览器访问:`https://[ip]:9200` ,注意是 `https` 协议,默认用户名为 `elastic` ,密码在上文生成的密码,访问成功后可以看到如下类似信息 ```json { "name" : "elasticsearch1", "cluster_name" : "es_cluster", "cluster_uuid" : "Gm98ojL9TLm6TpFEQw7aFg", "version" : { "number" : "8.10.4", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "f229ed3f893a515d590d0f39b05f68913e2d9b53", "build_date" : "2023-04-27T04:33:42.127815583Z", "build_snapshot" : false, "lucene_version" : "9.5.0", "minimum_wire_compatibility_version" : "7.17.0", "minimum_index_compatibility_version" : "7.0.0" }, "tagline" : "You Know, for Search" } ``` # Kibana 官方教程:[Install Kibana with Docker](https://www.elastic.co/guide/en/kibana/8.5/docker.html) ## 镜像拉取 ```bash docker pull kibana:8.10.4 ``` ## 启动容器 ### 创建 token 执行以下脚本创建 `token` ;集群模式时,在 `elasticsearch` 节点上执行,注意容器名称 ```bash docker exec -it elasticsearch /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana ``` 将新生成的 `token` 记录下来,下文需要使用 ### 创建容器 ```bash docker run -d --name kibana -h kibana --restart always -p 5601:5601 --network elk-birdge kibana:8.10.4 ``` ### 访问与配置 在容器启动后,查看启动日志 ```bash 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` 则此时会提示输入,完成输入并确定即可配置成功
320
全部评论