elasticsearch,nginx,docker-swarm,Docker,elasticsearch,Nginx,Docker Swarm" /> elasticsearch,nginx,docker-swarm,Docker,elasticsearch,Nginx,Docker Swarm" />

具有弹性簇的docker群

具有弹性簇的docker群,docker,elasticsearch,nginx,docker-swarm,Docker,elasticsearch,Nginx,Docker Swarm,我是初学者,有弹性和码头工人群。我花了两个星期的时间学习并尝试准备一个有弹性的码头工人群。我想用docker swarm准备一个弹性集群。在这里,我们可以轻松地使用缩放。我认为我们需要swarm来做到这一点,需要弹性集群来保持swarm节点之间的数据同步。我还认为,为了实现完全自动化,我希望使用配置了容器主机名的Zen。 由于swarm round rubin的“elasticsearch”主机名应返回所有ip docker版本为:17.06.2-ce elastic docker图像版本为:

我是初学者,有弹性和码头工人群。我花了两个星期的时间学习并尝试准备一个有弹性的码头工人群。我想用docker swarm准备一个弹性集群。在这里,我们可以轻松地使用缩放。我认为我们需要swarm来做到这一点,需要弹性集群来保持swarm节点之间的数据同步。我还认为,为了实现完全自动化,我希望使用配置了容器主机名的Zen。 由于swarm round rubin的“elasticsearch”主机名应返回所有ip

  • docker版本为:17.06.2-ce
  • elastic docker图像版本为:elasticsearch:最新
  • docker compose版本>=3
首先,我试着按照这个指示: sematext.com/blog/2016/12/12/docker-elasticsearch-swarm

在这里,nginx代理不是作为服务(docker compose文件的一部分)工作的,而是作为容器工作的。(码头工人赛跑)。我不知道会有什么不同。但是这个想法本身是由docker的早期版本准备的,对我来说不起作用

此指令背后的主要思想是,discovery.zen.ping.unicast.hosts具有容器名称。Docker swarm自身进行负载平衡,然后elastic可以找到其他节点

因为nginx代理不能作为服务使用,所以我尝试按照以下说明操作:derpturkey.com/elasticsearch-cluster-with-docker-engine-swarm-mode/

我已经定义了nginx服务来连接elastic,并在这里配置了所有参数

version: '3'  
  services:  
    elasticsearch:
    image: 'elasticsearch:5'
    command: [ elasticsearch, -E, network.host=0.0.0.0, -E, discovery.zen.ping.unicast.hosts=elasticsearch, -E, discovery.zen.minimum_master_nodes=1 ]
  nginx:
    image: 'nginx:1'
    ports:
      - '9200:9200'
    command: |
      /bin/bash -c "echo '
      server {
        listen 9200;
        add_header X-Frame-Options "SAMEORIGIN";
        location / {
          proxy_pass http://elasticsearch:9200;
          proxy_http_version 1.1;
          proxy_set_header Connection keep-alive;
          proxy_set_header Upgrade $$http_upgrade;
          proxy_set_header Host $$host;
          proxy_set_header X-Real-IP $$remote_addr;
          proxy_cache_bypass $$http_upgrade;
      }
   }' | tee /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
它不起作用。 后来我做了一些改变:

  • 我已经创建了自己的映像,并直接在nginx配置文件中设置nginx参数
  • 这是我的docker compose文件的新配置
我测试过了。Nginx正在工作。curl-XGET返回数据

version: '3'  
  services:  
    elasticsearch:
      image: elasticsearch:latest
      deploy:
        replicas: 2
      ports: ["9300:9300"]
      command: [elasticsearch, -E, network.bind_host=0.0.0.0, -E, discovery.zen.ping.unicast.hosts=elasticsearch, -E, discovery.zen.minimum_master_nodes=1]
    nginx:
      image: 'dodi1983/nginx:0.1'
      ports:
        - 9200:9200
      depends_on: 
        - elasticsearch
后果:

  • nginx正在工作
  • 从nginx容器elasticsearch解析dns正在工作,并在到节点之间进行负载平衡
不幸的是,当我询问可用节点时。Elastic始终返回当前节点信息(负载平衡)。我可以看到不同的ID。只有一个节点可用,但我认为ZEN discovery应该同时找到这两个节点。我登录到nginx容器并尝试获取集群信息。您可以在这里看到,它们是不同的节点,不在集群中。

有人有什么想法或解决办法吗?
谢谢。

为我帮助的官方文件


我相信您指的是此页面。部署堆栈后是否运行了
docker service update--endpoint mode=dnsrr
version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.4.1
    container_name: es01
    environment:
      - node.name=es01
      - discovery.seed_hosts=es02
      - cluster.initial_master_nodes=es01,es02
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - esnet
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.4.1
    container_name: es02
    environment:
      - node.name=es02
      - discovery.seed_hosts=es01
      - cluster.initial_master_nodes=es01,es02
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata02:/usr/share/elasticsearch/data
    networks:
      - esnet

volumes:
  esdata01:
    driver: local
  esdata02:
    driver: local

networks:
  esnet: