基于docker环境实现Elasticsearch 集群环境

标签: 系统架构 es | 发表时间:2019-07-12 15:19 | 作者:admin
出处:https://blog.haohtml.com

最近搭建了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 在下一个版本中即将废除的,但在官方文档里没有找到说明信息,这一点待确认。

相关 [docker 环境 elasticsearch] 推荐:

基于docker环境实现Elasticsearch 集群环境

- - 学习日志
最近搭建了es集群的时候,现在需要测试添加一个新的数据节点,项目是使用docker-compose命令来搭建的. 以下基于最新版本 es7.2.0进行. // docker-compose.yaml 集群配置文件. 集群配置了3个master节点,并同时作为数据节点使用,当节点未指定 node.master和node.data的时候,默认值为 true.

利用Docker构建开发环境

- - UC技术博客
最近接触PAAS相关的知识,在研发过程中开始使用Docker搭建了自己完整的开发环境,感觉生活在PAAS时代的程序员真是幸福,本文会简要介绍下Docker是什么,如何利用Docker来搭建自己的开发环境(本文主要是面向Mac OS X),以及期间所遇到的一些坑和解决方案. (本文会要求你对PAAS、LXC、CGroup、AUFS有一定的了解基础,请自行Google ).

Racher Docker基础环境配置 | Rancher Docs

- -
因为K8S的规定,主机名只支持包含  - 和  .(中横线和点)两种特殊符号,并且主机名不能出现重复. 配置每台主机的hosts(/etc/hosts),添加. host_ip $hostname到. CentOS关闭selinux. 关闭防火墙(可选)或者放行相应端口. 对于刚刚接触Rancher的用户,建议在关闭防火墙的测试环境或桌面虚拟机来运行rancher,以避免出现网络通信问题.

[译] 使用 Docker 和 Elasticsearch 搭建全文本搜索引擎应用

- - IT瘾-dev
作者简介:Patrick Triest是一位全栈工程师,数据爱好者,持续学习者,洁癖编程者. 作者github地址为 https://github.com/triestpa,本文地址参见 https://blog.patricktriest.com. 本文源码可以在GitHub repository 中找到 - https://github.com/triestpa/guttenberg-search.

使用 Docker 搭建 Java Web 运行环境

- - 码农网
Docker 是 2014 年最为火爆的技术之一,几乎所有的程序员都听说过它. Docker 是一种“轻量级”容器技术,它几乎动摇了传统虚拟化技术的地位,现在国内外已经有越来越多的公司开始逐步使用 Docker 来替换现有的虚拟化平台了. 作为一名 Java 程序员,我们是时候一起把 Docker 学起来了.

生产环境用Docker?先搞定这8个常见故障

- - DockOne.io
维护生产环境中的Docker虚拟化应用,高效、稳定的运行至关重要. 但是,对于Docker的初学者而言,当容器或应用出现了问题,往往不知从何入手进行排查. Docker虚拟化主要有三类故障:. 应用故障:应用执行状态与预期不一致. 容器故障:无法正确创建、停止、更新容器等. 集群故障:集群创建失败、更新失败、无法连接等.

研发环境容器化实施过程(docker + docker-compose + jenkins) - 陈晨_软件五千言 - 博客园

- -
目前公司内部系统(代号GMS)研发团队,项目整体微服务规模大概是4+9+3的规模,4个内部业务微服务,9个是外部平台或者基础服务(文件资源/用户中心/网关/加密等),3个中间件服务(数据库/Redis/Nacos). 需求和排期都是会有交叉,会保证每周都有迭代内容交付,另外技术部门也在进行性能优化以及代码规约的重构.

Docker & Flatpak

- - IT瘾-dev
目前最流行的技术莫过于Docker,Docker和Docker衍生的东西用到了很多很酷的技术,目前deepin应用软件发布转变成flatpak,这些看似风牛马不相及的技术方案,实际都使用了一个共同的底层技术——Namespace,假如没有namespace支持,这些技术实现都将成为空中楼阁. 一句话总结,无论是Docker、sysmted-nspawn还是flatpak,都是在namespace基础上,针对不同的场景,生出的不同的解决方案.

[原]生产环境使用elasticsearch遇到的一些问题以及解决方法(不断更新)

- - 云端分布式搜索技术
1.由gc引起节点脱离集群      因为gc时会使jvm停止工作,如果某个节点gc时间过长,master ping3次(zen discovery默认ping失败重试3次)不通后就会把该节点剔除出集群,从而导致索引进行重新分配. (1)优化gc,减少gc时间. (2)调大zen discovery的重试次数(es参数:ping_retries)和超时时间(es参数:ping_timeout).

docker初体验之docker-tomcat

- - BlogJava-首页技术区
docker已经是现在最热的容器技术,最近也去体验了一下,在daocloud注册了一个账号,并开始本机实战docker. daocloud免费有两个容器可用,体验送T恤,邀请送书,这里我分享一个daocloud的邀请码 https://account.daocloud.io/signup?invite_code=mxeq2jkmcur37vz6ven8,daocloud是非常棒的容器云平台,使用体验好,问题响应也及时,绑定微信还送一个额外容器.