使用Docker在多节点上构建Open Distro for Elasticsearch的本地开发环境

这篇文章将介绍Open Distro for Elasticsearch(以下简称odfe),它是Amazon Elasticsearch Service(以下简称Amazon ES)的上游产品。

为了将来在Amazon ES上运营,我们正在使用odfe构建开发环境。在构建odfe开发环境的多节点时遇到了一些问题,本次我想总结一下这个问题。

建立环境

环境构建基本上是按照ODFE官方文档进行的。请参考以下链接:https://opendistro.github.io/for-elasticsearch-docs/docs/install/docker/

在集群内加入三个合格的主节点

然而,官方文档指出集群应由两个节点构成,但根据文档创建仅由两个节点组成的集群在容错性方面并不推荐。根据 Elastic 公司的解释如下。

一般而言,建议在集群中包含三个主节点合格的节点。即使其中一个节点发生故障,其他两个节点仍可以安全地形成仲裁并继续运行。如果集群中的主节点合格节点少于两个,它将无法抵抗任何故障。相反,如果集群中有四个或更多的主节点合格节点,选择主节点和更新集群状态可能需要更长的时间。(新一代Elasticsearch集群协调)

因此,本次我在docker-compose文件中编写了设置,以将集群组成由3个主节点合格节点组成。
参考文章:重要的发现和集群形成设置。

補足 – 补充

此外,从7系开始,引入了新的集群协调机制,并且无论是否采用偶数节点配置,Elasticsearch都可以自动调整并避免脑裂的发生。

请阅读《Elastic Stack实践指南(Elasticsearch/Kibana篇)》的作者在Qiita上非常易懂的解释。2020年版:“Elasticsearch的主节点是否可以配置成偶数台?”

Docker文件

以下是我們剛剛創建的Docker檔案和docker-compose檔案。

FROM amazon/opendistro-for-elasticsearch:1.11.0

RUN /usr/share/elasticsearch/bin/elasticsearch-plugin install --batch analysis-kuromoji
RUN /usr/share/elasticsearch/bin/elasticsearch-plugin install --batch analysis-icu
version: "3"
services:
  elasticsearch-node1:
    build:
      context: .
      dockerfile: dockerfiles/Dockerfile.es
    container_name: elasticsearch-node1
    environment:
      - cluster.name=elasticsearch-cluster
      - node.name=elasticsearch-node1
      - discovery.seed_hosts=elasticsearch-node1,elasticsearch-node2,elasticsearch-node3
      - cluster.initial_master_nodes=elasticsearch-node1,elasticsearch-node2,elasticsearch-node3
      - bootstrap.memory_lock=true # along with the memlock settings below, disables swapping
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # minimum and maximum Java heap size, recommend setting both to 50% of system RAM
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536 # maximum number of open files for the Elasticsearch user, set to at least 65536 on modern systems
        hard: 65536
    volumes:
      - elasticsearch-data1:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
      - 9600:9600 # required for Performance Analyzer
    networks:
      - elasticsearch-net
  elasticsearch-node2:
    build:
      context: .
      dockerfile: dockerfiles/Dockerfile.es
    container_name: elasticsearch-node2
    environment:
      - cluster.name=elasticsearch-cluster
      - node.name=elasticsearch-node2
      - discovery.seed_hosts=elasticsearch-node1,elasticsearch-node2,elasticsearch-node3
      - cluster.initial_master_nodes=elasticsearch-node1,elasticsearch-node2,elasticsearch-node3
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - elasticsearch-data2:/usr/share/elasticsearch/data
    networks:
      - elasticsearch-net
  elasticsearch-node3:
    build:
      context: .
      dockerfile: dockerfiles/Dockerfile.es
    container_name: elasticsearch-node3
    environment:
      - cluster.name=elasticsearch-cluster
      - node.name=elasticsearch-node3
      - discovery.seed_hosts=elasticsearch-node1,elasticsearch-node2,elasticsearch-node3
      - cluster.initial_master_nodes=elasticsearch-node1,elasticsearch-node2,elasticsearch-node3
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - elasticsearch-data3:/usr/share/elasticsearch/data
    networks:
      - elasticsearch-net
  kibana:
    image: amazon/opendistro-for-elasticsearch-kibana:1.11.0
    container_name: elasticsearch-kibana
    ports:
      - 5601:5601
    expose:
      - "5601"
    environment:
      ELASTICSEARCH_URL: https://elasticsearch-node1:9200
      ELASTICSEARCH_HOSTS: https://elasticsearch-node1:9200
    networks:
      - elasticsearch-net

volumes:
  elasticsearch-data1:
  elasticsearch-data2:
  elasticsearch-data3:

networks:
  elasticsearch-net:

我认为您可以参考ODFE的官方文档来了解设置值的相关说明。

由于Amazon ES默认包含了ICU Analysis和Japanese (kuromoji) Analysis插件,因此我们还在odfe的开发环境中安装了相应的插件。

当使用多节点启动时,某些容器无法启动的问题。

在使用docker-compose启动容器时,当尝试在多节点上启动时,部分容器以137的退出代码终止了。

如果退出状态为137并且某些容器无法启动,可能是由于Docker Engine内存不足。

如果你和我一样,某些容器没能启动起来,请尝试从Docker Desktop的设置界面中增加Docker Engine的内存配置。在我的环境中,采取了这个方法后,就不再出现exit with 137的错误,并且所有的容器都成功启动了。

最后

当搭建ODFE开发环境时,介绍了在多节点上遇到的问题。由于我个人第一次使用Elasticsearch,如果有任何配置上的不妥之处,请您给予评论和编辑请求,将不胜感激。

明天的圣诞倒数日历将由@mt-kage负责!尽情期待吧!

广告
将在 10 秒后关闭
bannerAds