Docker 容器集群中的 Elasticsearch
Posted
技术标签:
【中文标题】Docker 容器集群中的 Elasticsearch【英文标题】:Elasticsearch in Docker container cluster 【发布时间】:2015-04-22 08:49:51 【问题描述】:我想在 2 个不同的主机上运行 2 个 Elasticsearch 实例。
我已经基于 Ubuntu 14.04 和 1.3.2 版本的 Elasticsearch 构建了自己的 Docker 镜像。如果我在 1 个主机上运行 2 个 ES 容器,每个实例都可以看到并与另一个实例通信;但是当我在 2 个不同的主机上运行 2 个 ES 实例时,它不起作用。容器的 9300 端口绑定到主机的 9300 端口。
是否可以使用我的配置创建 ES 集群?
【问题讨论】:
【参考方案1】:我能够在两个 docker 主机上使用单播进行集群工作。我只是碰巧使用了ehazlett/elasticsearch
图像,但我认为这并不重要。真正重要的一点似乎是将 network.publish_host
设置设置为其 docker 主机的公共或可路由 IP。
配置
docker-host-01
eth0: 192.168.1.10
Docker version 1.4.1, build 5bc2ff8/1.4.1
docker-host-02
eth0: 192.168.1.20
Docker version 1.4.1, build 5bc2ff8/1.4.1
构建集群
在 Docker 主机 01
docker run -d \
-p 9200:9200 \
-p 9300:9300 \
ehazlett/elasticsearch \
--cluster.name=unicast \
--network.publish_host=192.168.1.10 \
--discovery.zen.ping.multicast.enabled=false \
--discovery.zen.ping.unicast.hosts=192.168.1.20 \
--discovery.zen.ping.timeout=3s \
--discovery.zen.minimum_master_nodes=1
在 Docker 主机 02 上
docker run -d \
-p 9200:9200 \
-p 9300:9300 \
ehazlett/elasticsearch \
--cluster.name=unicast \
--network.publish_host=192.168.1.20 \
--discovery.zen.ping.multicast.enabled=false \
--discovery.zen.ping.unicast.hosts=192.168.1.10 \
--discovery.zen.ping.timeout=3s \
--discovery.zen.minimum_master_nodes=1
【讨论】:
如果你有 3 个节点呢? 我目前正在使用elasticsearch:2.4.1,想在两个不同的主机上配置cassandra。是否可以运行两个不在同一个局域网中的节点集群? 我尝试在两个不同的 ec2 实例中运行这两个 docker 容器来替换 IP 地址。我无法相互连接。在一台机器(节点)中创建一个索引也不会反映在另一个节点中【参考方案2】:使用 docker-compose 比在命令行中手动运行要容易得多:
elasticsearch_master:
image: elasticsearch:latest
command: "elasticsearch -Des.cluster.name=workagram -Des.node.master=true -Des.node.data=false"
environment:
- ES_HEAP_SIZE=512m
ports:
- "9200:9200"
- "9300:9300"
elasticsearch1:
image: elasticsearch:latest
command: "elasticsearch -Des.cluster.name=workagram -Des.discovery.zen.ping.unicast.hosts=elasticsearch_master"
links:
- elasticsearch_master
volumes:
- "/opt/elasticsearch/data"
environment:
- ES_HEAP_SIZE=512m
elasticsearch2:
image: elasticsearch:latest
command: "elasticsearch -Des.cluster.name=workagram -Des.discovery.zen.ping.unicast.hosts=elasticsearch_master"
links:
- elasticsearch_master
volumes:
- "/opt/elasticsearch/data"
environment:
- ES_HEAP_SIZE=512m
【讨论】:
我在学习docker,也在搭建ES集群。你知道你在哪里使用 docker-compose 标签,比如 ealsticsearch_master、elasticsearch1、elasticsearch2。我们在哪里提到它?可能是愚蠢的问题。 如果我们在三台不同的机器上运行,并且它们不在同一个局域网中,这将不起作用【参考方案3】:您应该能够与在不同主机中运行的两个容器进行通信,只要主机可以在它们之间所需的端口中访问。我认为您的问题是您正在尝试使用 ElasticSearch 多播发现,但是如果那时您还需要公开容器的端口 54328。如果它不起作用,您还可以尝试使用单播配置 ElasticSearch,在您的 elasticsearch.yml 中充分设置机器 IP。
【讨论】:
感谢您的回答,我忘记公开端口 54328。公开此端口后,它不起作用。将 ES 配置为使用单播可以是解决方案,但我确实需要多播协议 我没有尝试过,但有消息称多播在 Docker 设置中不起作用。但是您可以使用单播配置弹性设置。查看这篇文章以查看更多详细信息:www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-discovery-zen.html以上是关于Docker 容器集群中的 Elasticsearch的主要内容,如果未能解决你的问题,请参考以下文章