容器化方式部署 Elasticsearch 8.15.2 集群

1. 前提条件

  1. 安装前确保集群已经完成 基础环境配置
  2. 本次安装包括 Elasticsearch 和 Kibana 软件版本都是:8.15.2
  3. 支持的芯片包括:x86_64/AMD64 和 ARM64
  4. 本次部署基于 Docker Compose,需要提前部署 Docker Engine 以及 Docker Compose 基础环境,Docker Engine 的版本需要大于 20.10.10
  5. 当前使用的安装包为:elasticsearch-8.15.2-docker.tar.gz

2. 环境和参数准备

  1. 当前示例集群共配置 3 个节点,集群的 hosts 定义如下

    10.2.1.21   es01
    10.2.1.22   es02
    10.2.1.23   es03
    
  2. Elasticsearch 的数据目录定为:/data/elasticsearch,生产环境通常使用挂载的数据盘,建议为固态盘。

  3. Kibana 只需要在其中 1 个节点运行即可,当前计划运行在 es01 节点,Kibana 的数据目录为 /data/kibana

为了简化安装过程本次部署将基于 Docker Compose 进行,Elasticsearch 和 Kibana 服务本身将运行在容器网络之上,多个节点之间通信仍然使用主机的网络进行路由。如果想在分布式环境中使用容器网络,则需要使用 Kubernetes 实现分布式的容器编排。

3. 集群部署过程

3.1. 基础镜像导入

首先需要在每个节点上都完成基础的镜像安装导入:

# 在所有节点上导入镜像
tar -xvzf elasticsearch-8.15.2-docker.tar.gz -C /opt
cd /opt/elasticsearch-8.15.2-docker
./install.sh

导入过程会自动检测当前的 CPU 芯片是 x86_64 还是 ARM64,并且自动导入。

3.2. 在第一个节点上进行基础配置

我们在第一个节点 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_PASSWORDKIBANA_PASSWORD 分别配置 Elasticsearch 中 elastic 用户和 kibana_system 用户的密码,其中 elastic 用户用于访问 Elasticsearch 服务,kibana_system 是 Kibana 和 Elasticsearch 集群交互的用户,我们一般不会直接用到。

NODE_NAME 配置当前节点的主机名,每个节点都是不一样的,当前是 es01

CLUSTER_NODES 配置 Elasticsearch 集群的节点列表,这个配置每个节点都是一样的,当前配置为 es01,es02,es03

然后 ES_DATAKIBANA_DATA 分别配置 Elasticsearch 和 Kibana 的数据目录,我们稍后需要手动创建它。

ES_PORTES_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 下面生成证书。

3.3. 同步配置和证书到其他节点

上面步骤已经在第一个节点 es01 上面完成了基础配置并且为集群生成了证书,下面需要将这些修改后的配置同步至其他的节点,无需重复修改:

# 推荐使用 rsync 增量同步,当前在 es01 的 /opt/elasticsearch-8.15.2-docker 项目下执行
rsync -av ./ es02:`pwd`
rsync -av ./ es03:`pwd`

同步完成之后我们只需要分别在 es02es03 节点的项目目录下修改 .env 配置文件中的 NODE_NAME 设置即可。

es02 节点设置为:

NODE_NAME=es02

es03 节点设置为:

NODE_NAME=es03

其他配置都保持一致即可。

3.4. 初始化数据目录

在所有节点创建 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

3.5. 安装 IK 分词插件(可选)

如果需要安装 IK 分词插件,可以在还没有启动 Elasticsearch 服务的情况下先进行安装,安装后再启动 Elasticsearch 服务。也可以暂时跳过这一步,等 Elasticsearch 集群正常运行后,需要的时候再安装也是可以的,但是安装后需要重启所有节点的 Elasticsearch 服务重新加载生效。

如果要安装 IK 插件,需要在所有的节点都执行下面的命令:

# 所有节点都执行
./elasticsearch-setup.sh ik

执行后可能会有提示,注意输入 Y 然后确认就安装上了。

3.6. 启动 Elasticsearch 服务

在所有节点启动 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

3.7. 运行 Kibana

我们目前计划在 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:

  1. https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html