8.15.2
当前示例集群共配置 3 个节点,集群的 hosts 定义如下
10.2.1.21 es01
10.2.1.22 es02
10.2.1.23 es03
Elasticsearch 的数据目录定为:/data/elasticsearch
,生产环境通常使用挂载的数据盘,建议为固态盘。
Kibana 只需要在其中 1 个节点运行即可,当前计划运行在 es01
节点,Kibana 的数据目录为 /data/kibana
。
为了简化安装过程本次部署将基于 Docker Compose 进行,Elasticsearch 和 Kibana 服务本身将运行在容器网络之上,多个节点之间通信仍然使用主机的网络进行路由。如果想在分布式环境中使用容器网络,则需要使用 Kubernetes 实现分布式的容器编排。
首先需要在每个节点上都完成基础的镜像安装导入:
# 在所有节点上导入镜像
tar -xvzf elasticsearch-8.15.2-docker.tar.gz -C /opt
cd /opt/elasticsearch-8.15.2-docker
./install.sh
导入过程会自动检测当前的 CPU 芯片是 x86_64 还是 ARM64,并且自动导入。
我们在第一个节点 es01
上进行基础的配置,首先编辑 .env
配置用户环境变量,需要修改的配置如下:
# Password for the 'elastic' user (at least 6 characters)
ELASTIC_PASSWORD=es-123456
# Password for the 'kibana_system' user (at least 6 characters)
KIBANA_PASSWORD=kibana-123456
# Set the node name
NODE_NAME=es01
# Set the nodes in the cluster
CLUSTER_NODES=es01,es02,es03
# Elasticsearch data directory
ES_DATA=/data/elasticsearch
# Port to expose Elasticsearch HTTP API to the host
ES_PORT=9200
# Port to expose Elasticsearch Transport to the host
ES_TRANSPORT_PORT=9300
# Kibana data directory
KIBANA_DATA=/data/kibana
# Port to expose Kibana to the host
KIBANA_PORT=5601
其中 ELASTIC_PASSWORD
和 KIBANA_PASSWORD
分别配置 Elasticsearch 中 elastic 用户和 kibana_system 用户的密码,其中 elastic 用户用于访问 Elasticsearch 服务,kibana_system 是 Kibana 和 Elasticsearch 集群交互的用户,我们一般不会直接用到。
NODE_NAME
配置当前节点的主机名,每个节点都是不一样的,当前是 es01
。
CLUSTER_NODES
配置 Elasticsearch 集群的节点列表,这个配置每个节点都是一样的,当前配置为 es01,es02,es03
。
然后 ES_DATA
和 KIBANA_DATA
分别配置 Elasticsearch 和 Kibana 的数据目录,我们稍后需要手动创建它。
ES_PORT
和 ES_TRANSPORT_PORT
分别配置 Elasticsearch 客户端和集群间通信的端口,通常保持默认即可,确保不要被占用。
KIBANA_PORT
配置 Kibana 的端口,通常也保持默认即可,确保不要被占用。
其余的配置一般情况下都保持默认即可,最后保存配置文件。
然后编辑 docker-compose.yml
配置文件,只需要修改顶部的主机映射配置 x-extra_hosts
部分:
x-extra_hosts:
&es_extra_hosts
- "es01:10.2.1.21"
- "es02:10.2.1.22"
- "es03:10.2.1.23"
由于 Elasticsearch 是运行在容器内部,因此需要配置 Elasticsearch 部署集群的所有节点主机和 IP 映射关系,方便集群之间使用主机进行通信,就在上面的格式上修改或者扩充即可,填写无误后保存配置。
然后执行脚本生成证书实例配置文件:
./generate_instances.sh
如果执行无误就会生成证书需要配置文件到 certs/instances.yml
,例如当前生成的配置如下:
instances:
- name: es01
dns:
- es01
- localhost
ip:
- 10.2.1.21
- 127.0.0.1
- name: es02
dns:
- es02
- localhost
ip:
- 10.2.1.22
- 127.0.0.1
- name: es03
dns:
- es03
- localhost
ip:
- 10.2.1.23
- 127.0.0.1
然后开始生成证书文件:
./elasticsearch-setup.sh
等待执行完成后即可在 ./certs
下面生成证书。
上面步骤已经在第一个节点 es01
上面完成了基础配置并且为集群生成了证书,下面需要将这些修改后的配置同步至其他的节点,无需重复修改:
# 推荐使用 rsync 增量同步,当前在 es01 的 /opt/elasticsearch-8.15.2-docker 项目下执行
rsync -av ./ es02:`pwd`
rsync -av ./ es03:`pwd`
同步完成之后我们只需要分别在 es02
和 es03
节点的项目目录下修改 .env
配置文件中的 NODE_NAME
设置即可。
es02
节点设置为:
NODE_NAME=es02
es03
节点设置为:
NODE_NAME=es03
其他配置都保持一致即可。
在所有节点创建 Elasticsearch 数据目录:
# 所有节点执行
mkdir /data/elasticsearch
chmod g+rwx /data/elasticsearch
在第一个节点 es01
上创建 Kibana 数据目录:
# 在 es01 节点上执行
mkdir /data/kibana
chmod g+rwx /data/kibana
务必要按照上述命令设置用户组的权限,否则服务启动时会因为权限不足而报错 failed to obtain node locks
如果需要安装 IK 分词插件,可以在还没有启动 Elasticsearch 服务的情况下先进行安装,安装后再启动 Elasticsearch 服务。也可以暂时跳过这一步,等 Elasticsearch 集群正常运行后,需要的时候再安装也是可以的,但是安装后需要重启所有节点的 Elasticsearch 服务重新加载生效。
如果要安装 IK 插件,需要在所有的节点都执行下面的命令:
# 所有节点都执行
./elasticsearch-setup.sh ik
执行后可能会有提示,注意输入 Y
然后确认就安装上了。
在所有节点启动 Elasticsearch 服务:
# 在所有节点执行启动脚本启动服务
./elasticsearch-server.sh elasticsearch start
启动之后可以查看运行状态:
./elasticsearch-server.sh elasticsearch status
可以使用 Docker Compose 命令查看运行日志:
docker compose logs elasticsearch -f --tail=100
如果运行没有问题,那么可以查看集群的状态:
# 任意节点都可以执行
./elasticsearch-restapi.sh
# 脚本后可以跟路由参数调用 Elasticsearch 的 RestAPI
# 查看集群健康状态
./elasticsearch-restapi.sh /_cat/health?v
# 查看节点列表
./elasticsearch-restapi.sh /_cat/nodes?v
# 查看索引列表
./elasticsearch-restapi.sh /_cat/indices?v
如果查看状态都正常,则说明 Elasticsearch 集群已经部署完成。
上面的 elasticsearch-restapi.sh
脚本只能完成一些简单的 GET 请求,方便使用,如果要进行索引创建或搜索等复杂操作可以使用 curl 命令或者 Kibana 假面完成。
停止或重启 Elasticsearch 服务的命令如下:
./elasticsearch-server.sh elasticsearch stop
./elasticsearch-server.sh elasticsearch restart
我们目前计划在 es01
节点上运行 Kibana,运行之前需要在 Elasticsearch 集群上初始化 kibana_system 用户的密码,要和 .env
中设置的密码一致,这样 Kibana 才可以正常访问到 Elasticsearch 服务,我们执行下面的命令初始化 kibana_system 用户的密码:
./elasticsearch-setup.sh kibana
然后根据提示输入密码即可。
然后启动 Kibana 的服务:
# 在 es01 上运行 Kibana 服务
./elasticsearch-server.sh kibana start
启动后查看服务状态和日志:
./elasticsearch-server.sh kibana status
docker compose logs kibana -f --tail=100
如果运行无误我们可以访问浏览器打开页面,例如这里的访问地址就是 http://10.2.1.21:5601
,然后就可以通过 Kibana 页面使用 Elasticsearch 集群了。
最后停止或重启 Kibana 的命令如下:
./elasticsearch-server.sh kibana stop
./elasticsearch-server.sh kibana restart
Reference: