【问题标题】:Docker swarm: guarantee high availability after restartDocker swarm:重启后保证高可用
【发布时间】:2017-05-27 05:55:47
【问题描述】:

我在使用 Docker swarm 时遇到问题。

我有 3 个在 Gunicorn 上运行的 Python Web 服务的副本。

问题是,当我在软件更新后重新启动 swarm 服务时,一个正在运行的旧服务被杀死,然后一个新的服务被创建并启动。但是在旧服务已经被杀死,而新服务还没有完全启动的短时间内,网络消息已经路由到尚未准备好的新实例,导致502 bad gateway错误(我从 nginx 代理到服务)。

我使用--update-parallelism 1 --update-delay 10s 选项,但这并不能消除问题,只是稍微降低了出现 502 错误的机会(因为始终至少有 2 个服务在运行,即使其中一个可能仍在启动) .

【问题讨论】:

  • 我不知道 docker swarm 是否支持HEALTHCHECK Dockerfile 功能(您可以在docker service create 添加)。我很高兴知道它
  • 是的,存在:blog.newrelic.com/2016/08/24/docker-health-check-instruction 我不认为它适用于重启,但我会尝试
  • 请告诉我,祝你好运!
  • 它似乎确实有效,但并不完全完美......请在此处查看我的功能请求:github.com/moby/moby/issues/33410
  • @Robert 是的,这就是我所做的:更简单的健康检查,间隔为一分钟。妥协。

标签: docker docker-swarm


【解决方案1】:

所以,按照我在 cmets 中的建议:

使用 Dockerfile 的HEALTHCHECK 功能:Docs。比如:

HEALTHCHECK --interval=5m --timeout=3s \
  CMD curl -f http://localhost/ || exit 1

知道 Docker Swarm 确实在服务更新期间执行此运行状况检查,因此实现零停机部署相对容易。

但正如你所提到的,你有一个高资源的消费者健康检查,你需要更大的健康检查间隔。

在这种情况下,我建议您自定义您的运行状况检查,立即运行第一次运行并在current_minute % 5 == 0 进行后续检查,但运行状况检查本身运行/30s

HEALTHCHECK --interval=30s --timeout=3s \
  CMD /service_healthcheck.sh

healthcheck.sh

#!/bin/bash

CURRENT_MINUTE=$(date +%M)
INTERVAL_MINUTE=5

[ $((a%2)) -eq 0 ]
do_healthcheck() {
  curl -f http://localhost/ || exit 1
}

if [ ! -f /tmp/healthcheck.first.run ]; then
  do_healhcheck
  touch /tmp/healthcheck.first.run
  exit 0
fi

# Run only each minute that is multiple of $INTERVAL_MINUTE
[ $(($CURRENT_MINUTE%$INTERVAL_MINUTE)) -eq 0 ] && do_healhcheck
exit 0

记住COPYhealthcheck.sh 到/healthcheck.sh(和chmod +x

【讨论】:

    【解决方案2】:

    当前 17.05 及更早版本的 docker swarm 滚动升级存在一些已知问题(例如 moby/moby #30321)(并且看起来并非所有修复程序都会在 17.06 中实现)。如您所见,这些问题将导致滚动升级期间出现连接错误。

    如果您有真正的零停机部署要求并且无法通过客户端重试来解决此问题,那么我建议您在您的 swarm 前面放置某种蓝/绿开关并滚动升级到非活动的容器集,直到 docker 找到所有场景的解决方案。

    【讨论】:

    • 嗨,BMitch,对于这种情况,您如何看待 HEALTHCHECK?
    • 健康检查很好,但即使使用健康检查也存在这些问题。
    • 好的。不管这些问题,蓝/绿方法都是一个不错的选择,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    相关资源
    最近更新 更多