使用Docker镜像搭建ElasticSearch集群
使用默认配置运行 ElaticSearch 的 Docker 镜像会启动一个单节点模式的服务,名为 docker-cluster。
即便在同一个主机上启动多个 Docker 容器,在默认配置下,这些容器也不会自动组成 ES 集群。
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 集群
讨论
之前 NWPC 消息平台使用单节点 ES 服务,同时执行多个查询服务时经常会出现超时的现象。 升级为 3 节点 ES 集群后,查询的效率得到极大改善,尚未遇到查询超时的现象。
当然,笔者对 ElasticSearch 库的使用还属于初级阶段,在索引设计和查询优化等方面还需要进一步研究。