使用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负责!尽情期待吧!