1

当上游容器之一出现故障时,如何让 dockerized nginx 快速进行故障转移?在非 docker 环境中,故障转移似乎是即时的,但在 docker 化时有几个请求超时。

我在同一节点应用程序的两个实例前面的单个节点/虚拟机上使用 nginx 作为负载平衡器/代理。我描绘了新版本部署如下(通常称为蓝绿部署):

  1. 新版node app推送到github
  2. Docker hub 构建新镜像
  3. 一个上游容器被拆除、升级和重新部署
  4. 当其中一个容器被关闭时,nginx 会自动故障转移到另一个活动容器
  5. 部署升级的容器后,另一个容器也将脱机以进行升级/重新部署

但是,在 nginx 上并不能无缝地执行 #4。当我关闭一个用于版本提升的上游容器时,nginx 将超时几个请求(以循环方式),因为它发现其中一个容器已关闭。我没有在非 docker 环境中发生过这种情况。

这是我的 docker 云堆栈文件:

load-balancer:
  image: 'foo/load-balancer:latest'
  links:
    - node-blue
    - node-green
  ports:
    - '80:80'
node-blue:
  image: 'foo/node-app:latest'
node-green:
  image: 'foo/node-app:latest'

nginx.conf 看起来像:

events {
  worker_connections  1024;
}

http {
  gzip on;

  upstream app {
    server node-green;
    server node-blue;
  }

  server {
    listen 80;
    server_name app.local;
    location / {
        proxy_pass http://app;
    }
  }
}
4

1 回答 1

1

经过一堆摔跤,我想我得出了一个合理的解决方案。为dockercloud/haproxy换了一个自定义 nginx 容器。显然负载均衡器需要能够监听docker cloud events并进行相应的调整。

堆栈文件现在看起来像:

load-balancer:
  image: 'dockercloud/haproxy:1.5.3'
  restart: always
  roles:
    - global
  links:
    - node-blue
  ports:
    - '80:80'
node-blue:
  image: 'foo/node-app:latest'
  environment:
    - VIRTUAL_HOST=app.local
node-green:
  image: 'foo/node-app:latest'
  environment:
    - VIRTUAL_HOST=app.local

当我想部署一个新版本时,我只需运行以下脚本:

docker-cloud service set --link node-green:node-green load-balancer
docker-cloud service redeploy node-blue --sync
docker-cloud service set --link node-blue:node-blue load-balancer
docker-cloud service redeploy node-green --sync
于 2016-09-01T20:32:30.670 回答