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的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 SSH 连接到 Kubernetes 集群中的 docker 容器? [关闭]

Docker 容器中的自动缩放

docker6 构建docker容器集群

Docker - 容器部署 Consul 集群

Kafka集群部署(Docker容器的方式)

从 ECS 集群中的 docker nodejs EC2 容器连接到 Redis Elasticache 集群