基于docker环境实现Elasticsearch 集群环境
最近搭建了es集群的时候,现在需要测试添加一个新的数据节点,项目是使用docker-compose命令来搭建的。
以下基于最新版本 es7.2.0进行
搭建es集群
// docker-compose.yaml 集群配置文件
version: '2.2' services: es01: image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0 container_name: es01 environment: - node.name=es01 - node.master=true - node.data=true - discovery.seed_hosts=es02 - cluster.initial_master_nodes=es01,es02 - cluster.name=docker-cluster - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 volumes: - esdata01:/usr/share/elasticsearch/data ports: - 9200:9200 networks: - esnet es02: image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0 container_name: es02 environment: - node.name=es02 - discovery.seed_hosts=es01 - cluster.initial_master_nodes=es01,es02 - cluster.name=docker-cluster - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 volumes: - esdata02:/usr/share/elasticsearch/data networks: - esnet es03: image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0 container_name: es03 environment: - node.name=es03 - discovery.seed_hosts=es01 - cluster.initial_master_nodes=es01,es02 - cluster.name=docker-cluster - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 volumes: - esdata03:/usr/share/elasticsearch/data networks: - esnet volumes: esdata01: driver: local esdata02: driver: local esdata03: driver: local networks: esnet:
集群配置了3个master节点,并同时作为数据节点使用,当节点未指定 node.master和node.data的时候,默认值为 true 。执行命令
$ docker-compose up
启动集群。
验证集群是成成功,在浏览器里访问 http://localhost:9200 和 http://localhost:9200/_cat/nodes?v 显示正常。三个节点角色为mdi
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name 192.168.16.3 28 74 3 0.14 0.94 4.97 mdi * es02 192.168.16.4 28 74 3 0.14 0.94 4.97 mdi - es01 192.168.16.2 25 74 3 0.14 0.94 4.97 mdi - es03
添加集群新的节点
新添加的es数据节点文件 join-docker-compose.yaml
version: '2.2' services: es04: image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0 container_name: es04 environment: - node.name=es04 - node.master=false - node.data=true - cluster.initial_master_nodes=es01,es02 - cluster.name=docker-cluster - discovery.seed_hosts=es01 - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 volumes: - esdata04:/usr/share/elasticsearch/data networks: - esnet volumes: esdata04: driver: local networks: esnet: external: name: es_esnet
执行命令
$ docker-compose -f join-docker-compose.yaml up
注意这里手动指定了 yaml 文件,两个配置文件都在同一个es目录里。
再次使用上面的 http://localhost:9200/_cat/nodes?v 进行验证
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name 192.168.16.3 26 93 19 0.44 0.28 1.30 mdi * es02 192.168.16.5 22 93 14 0.44 0.28 1.30 di - es04 192.168.16.4 15 93 18 0.44 0.28 1.30 mdi - es01 192.168.16.2 37 93 20 0.44 0.28 1.30 mdi - es03
这里我们可以看到新增加的节点 es04,节点角色为di, 这个节点由于指定了 node.master=false 所有,并不参考master节点的选举。
集群节点使用的docker网络为 es_esnet。
测试es集群master的选举(高可用)
上面我们可以看到当前es02这个master节点为leader,我们现在手动停止这个master容器,让其它的两个master中选举一个leader,执行命令
$ docker stop es02
此时,再用上面的方法查看一下集群节点情况
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name 192.168.16.5 40 74 2 0.19 0.27 0.94 di - es04 192.168.16.4 15 74 2 0.19 0.27 0.94 mdi * es01 192.168.16.2 39 74 2 0.19 0.27 0.94 mdi - es03
可以看到es02节点消失了,现在的master leader 节点为 es01。如果我们再把容器启动起来的话,发现es02作为了一个普通的master节点加入到了集群。
注意事项:
其实es集群的环境搭建挺容易的,我在搭建过程中遇到了一此坑,花费了好久才算爬出来,下面记录下来供大家参考。
一、确认分配给 docker 软件的内存是否足够
在上一篇文章( https://blog.haohtml.com/archives/18981) 里已经写过了,由于docker 分配的内存不足,导致启动一个新的es节点,会直接killed掉原来的es节点,发生OOM的现象,并且这个问题通过直接查看容器日志根本排查不到,容器内并未有相关的日志信息
二、保证环境的干净
使用 docker-compose 命令启动es节点容器成功后,如果需要对旧节点的配置内容进行修改的话,则一定要执行以下命令
$ docker-compose -f 配置文件.yaml down -v
将原来的数据卷 volume 信息进行删除,否则容易出现新启动的节点又单独变成了一个集群,这时会出现跨集群节点加入被拒绝的错误。我在搭建环境的时候,创建用的 docker-compose up 命令,但修改配置文件后,手动执行 “docker rm 容器ID” 将容器删除,再次执行了 docker-compose up命令时,会出现上面说的这个问题,在这个坑里呆了好久才算出来。
三、参数 discovery.zen.minimum_master_nodes
这里用的是es7.2.0的版本,服务启动时提示参数项discovery.zen.minimum_master_nodes 在下一个版本中即将废除的,但在官方文档里没有找到说明信息,这一点待确认。