【发布时间】:2018-02-24 15:06:57
【问题描述】:
我是弹性和 docker swarm 的初学者。我花了两个星期来学习并尝试准备一个有弹性的 docker swarm。我想用 docker swarm 准备一个弹性集群。我们可以轻松地使用放大和缩小的地方。我认为我们需要 swarm 来做到这一点,并且需要弹性集群来保持 swarm 节点之间的数据同步。我还考虑了完全自动化,我想使用配置了容器主机名的 Zen。 由于 swarm round rubin “elasticsearch” 主机名应该返回所有的 ip。
- docker 版本为:17.06.2-ce
- elastic docker 镜像版本为:elasticsearch:latest
- docker-compose 版本 >= 3
首先,我尝试按照以下说明进行操作: sematext.com/blog/2016/12/12/docker-elasticsearch-swarm
这里 nginx-proxy 不是作为服务工作(docker-compose 文件的一部分),而是作为容器工作。 (码头运行)。我不知道有什么区别。但是这个想法本身已经准备好早期版本的 docker,它对我不起作用。
该指令背后的主要思想是,discovery.zen.ping.unicast.hosts 具有容器名称。 Docker swarm 自身进行负载平衡,然后弹性可以找到其他节点。
因为 nginx-proxy 不能作为服务工作,所以我尝试按照以下说明操作: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 http://elastic:changeme@127.0.0.1:9200/_cluster/state?pretty 返回数据。
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 发现应该找到两者。我登录了 nginx 容器并尝试获取集群信息。你可以在这里看到,它们是不同的节点,它们不在集群中。 curl -XGET http://elastic:changeme@elasticsearch:9200/_cluster/state?pretty
有没有人有任何想法或解决方案? 谢谢。
【问题讨论】:
-
相信你指的是这个页面derpturkey.com/…
-
部署堆栈后您是否运行
docker service update --endpoint-mode=dnsrr <service name>?
标签: docker elasticsearch nginx docker-swarm