多种方式(含docker容器)实现零停机时间(Zero-Downtime)部署

本文介绍了如何在不中断服务的情况下进行零停机时间(Zero-Downtime)部署,包括结合软负载均衡器、利用SO_REUSEPORT特性以及通过docker容器的方法。通过示例详细阐述了docker容器在部署更新和回滚过程中的应用。
摘要由CSDN通过智能技术生成

零停机时间 (Zero-Downtime)

对于互联网上需要直接面向用户的应用在更新时一般要求尽可能地减少停机时间,所谓零停机时间意思就是应用更新或回滚时不会导致服务不可用,一般实现有结合软负载均衡器、SO_REUSEPORT等。

结合软负载均衡器

该方案架构上要求由web server对外提供服务,接收到请求后均衡转发给多个app server,部署时利用reload特性每次更新一部分机器,可以实现零停机时间,缺点是整个部署过程较长,比较繁琐。假设存在这样一个工作集:一台nginx服务器和两台tomcat服务器tomcat1和tomcat2,这样的工作集零停机部署过程大致是这个样子的:

  1. 将app-v1@tomcat1从nginx负载中移除
  2. 部署app-v2到tomcat1,即为app-v2@tomcat1
  3. 将app-v2@tomcat1重新加入到负载中(此时负载中app-v1和app-v2共存)
  4. 将app-v1@tomcat2从nginx负载中移除
  5. 部署app-v2到tomcat2,即为app-v2@tomcat2
  6. 将app-v2@tomcat2重新加入到负载中

说明:app-v1表示v1版本的应用,app-v1@tomcat1表示在tomcat1上的v1版本的应用

SO_REUSEPORT

SO_REUSEPORT是linux kernel 3.9之后的一个新特性,它支持多个进程同时listen同一个地址和端口,在此之前我相信大家都遇到过类似Address already in use的错误,这样一来就给我们一种错觉认为多个进程不能同时listen同一个端口,其实并非如此,下面看一个python应用的例子。

$ vi server.py
import socket
import os

SO_REUSEPORT = 15

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, SO_REUSEPORT, 1)
s.bind(('', 10000))
s.listen(1)
while True:
    conn, addr = s.accept()
    print('Connected to {}'.format(os.getpid()))
    data = conn.recv(1024)
    conn.send(data)
    conn.close()
<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值