【问题标题】:Elasticsearch in Docker container clusterDocker 容器集群中的 Elasticsearch
【发布时间】: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 集群?

【问题讨论】:

    标签: elasticsearch docker cluster-computing


    【解决方案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
    猜你喜欢
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2017-07-29
    • 1970-01-01
    相关资源
    最近更新 更多