服务如何做到平滑升级?

2018-07-27 19:45:02 +08:00
 twogoods

例如一个服务两个实例,前面 nginx 负载均衡。

nginx 可以做到实时的健康监测吗?一旦一个服务 kill 不往这个服务上转发请求,不过这样好像还是有一个问题,我要升级必然要 kill 掉一个服务,kill 瞬间如果还有请求在这个实例里,那么这个请求就无法返回数据,这样用户感知到异常了。 所以最好的方式是要重启一个服务前,告诉负载均衡器不要转发请求到我这里,然后等一段时间等这个机器上所有请求都处理完,这个时候老的请求完毕,新的请求不过来,就可以更新重启。

nginx 下有这样的功能吗? haproxy 下倒是有 agent check 可以实现这个功能。

6602 次点击
所在节点    程序员
21 条回复
sagaxu
2018-07-28 18:25:04 +08:00
计划性重启容易,重启前把主机从 upstream 里摘除,用 reload 是 client 感知不到的。重启后,再把它加入集群。

比较不好处理的是服务突然崩溃,这种情况,有两个选择,一是把错误反馈给 client,然后累计错误 xx 次的时候从集群摘除。另一个选择是自动 try next upstream,client 不能感知到,但是并非所有业务都能无状态。

累计 xx 次出错就自动摘除,也容易有坑,阈值设置的高了,要失败太多次才介入。设置的低了,容易产生血崩,尤其是某些 bug 导致服务出错,一不留神你群里机器就全被下架完了。

所以需要配合主动的健康检测,做好平衡和折衷选择。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/474772

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX