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

我在同一个节点应用程序的两个实例前面的单个节点/ vm上使用nginx作为负载平衡器/代理。我对新版本的部署进行了如下描述(通常称为blue-green deployments):

  • 新版本的节点应用程序已推送到github
  • Docker中心构建一个新镜像
  • 拆卸,升级并重新部署了一个上游容器
  • 当其中一个容器被拆除时,nginx自动故障转移到另一个 Activity 容器
  • 部署升级的容器后,另一个容器以及
  • 都将脱机以进行升级/重新部署

    但是,在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;
        }
      }
    }
    

    最佳答案

    经过一番角力,我认为我提出了一个合理的解决方案。为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
    

    07-27 19:13