使用Docker镜像搭建ElasticSearch集群

目录

使用默认配置运行 ElaticSearch 的 Docker 镜像会启动一个单节点模式的服务,名为 docker-cluster。

即便在同一个主机上启动多个 Docker 容器,在默认配置下,这些容器也不会自动组成 ES 集群。

默认配置的 Docker 容器形成单节点 ElasticSearch 服务

ElasticSearch 官方文档中使用 Docker Compose 搭建 ElasticSearch 集群。 详情请访问以下文档:

Install Elasticsearch with Docker

笔者没使用过 Docker Compose,所以尝试通过直接创建 Docker 镜像来搭建 ElasticSearch 集群。

目录挂载

Docker 镜像中 ElasticSearch 的根目录是 /usr/share/elasticsearch

可以通过设置环境变量或使用配置文件的方式配置 ElasticSearch 服务。

本文使用配置文件修改默认的参数。配置文件在 Docker 镜像中的位置是

/usr/share/elasticsearch/config/elasticsearch.yml

为了方便管理,配置文件保存在主机,通过文件挂载方式载入到镜像中。

ElasticSearch 的数据目录是

/usr/share/elasticsearch/data

为了方便升级和维护,将上述目录挂载到 Docker volume 数据卷中。

网络

默认 Docker 网络中的容器无法直接使用内部网络通讯。 所以为 ES 集群创建一个独立的 bridge 网络,名为 message-net。 在该网络中的 Docker 容器已配置 DNS 服务,可以直接使用容器名称访问。

主节点

ElasticSearch 会将所有集群名 (cluster.name) 相同的节点组成一个集群。

集群中的每个节点都应该配置唯一的名称,最好与 Docker 容器名称保持一致。

下面是主节点 message-es-node-01 的配置文件

cluster.name: "message-es-cluster"
network.host: 0.0.0.0
node.name: message-es-node-01
cluster.initial_master_nodes: 
    - message-es-node-01

cluster.initial_master_nodes 设置初始主节点的列表。本文仅使用一个节点作为主节点。

为了模拟动态添加节点,首先启动主节点

sudo docker run -d \
    -p 39300:9200 \
    -v message-es-data-01:/usr/share/elasticsearch/data \
    -v /some/path/to/01/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
    -net message-net \
    --name message-es-node-01 \
    docker.elastic.co/elasticsearch/elasticsearch:7.9.2

等待一段时间后,可以看到名为 message-es-cluster 的 ES 集群已启动,仅有一个节点。

数据节点

数据节点的配置与主节点类似

cluster.name: "message-es-cluster"
network.host: 0.0.0.0
node.name: message-es-node-02
discovery.seed_hosts: 
    - message-es-node-01

discovery.seed_hosts 设置需要查找的集群节点名称,这里只需要设置主节点名称。

启动数据节点

sudo docker run -d \
    -p 39302:9200 \
    -v message-es-data-02:/usr/share/elasticsearch/data \
    -v /some/path/to/02/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
    --network message-net \
    --name message-es-node-02 \
    docker.elastic.co/elasticsearch/elasticsearch:7.9.2

使用同样的方式再启动一个数据节点。 最终形成 3 个节点的 ES 集群

3 个 Docker 容器构成的 ElaticSearch 集群

讨论

之前 NWPC 消息平台使用单节点 ES 服务,同时执行多个查询服务时经常会出现超时的现象。 升级为 3 节点 ES 集群后,查询的效率得到极大改善,尚未遇到查询超时的现象。

当然,笔者对 ElasticSearch 库的使用还属于初级阶段,在索引设计和查询优化等方面还需要进一步研究。