一种不中断服务的服务端程序平滑升级的方法

文档序号:9380409阅读:773来源:国知局
一种不中断服务的服务端程序平滑升级的方法
【技术领域】
[0001]本发明涉及服务器端程序升级的方法,特别是涉及一种不中断服务的服务端程序平滑升级的方法。
【背景技术】
[0002]服务器对高可用性的需求决定服务器端不能随时停止服务端应用,这是因为不管是应用的bug故障还是因升级所需的中断连接,不仅会造成服务器端的数据丢失,也会导致针对客户端的服务“宕机”。
[0003]通常情况下,客户端和服务端的连接分为短连接和长连接,短连接场景以HTTP短连接较为常见,涉及到的流程有:浏览器建立与HTTP服务器的连接,请求web页面;服务器响应浏览器请求并返回请求页面;浏览器关闭与HTTP服务器的连接。每一次HTTP请求的响应都单独建立一次连接,短连接场景因其“连接只建立在数据传输时”这一特性,使服务端程序的升级可以等到连接中断时进行。
[0004]Nginx实现服务端程序升级的原理是:(I)在不停止老进程的情况下,启动新进程;(2)老进程负责处理仍未处理完的请求,但不再接受新的处理请求;(3)新进程接受新请求;(4)老进程处理完所有请求,关闭所有连接后停止;其中新进程的执行需向新进程发送USR2信号,老进程的逐步停止需向老进程发送WINCH信号。从表面上看,这种服务端程序升级方式似乎保证了新、旧版本程序的平滑替换,但实质上看,旧版本程序在停止接收新请求后,需等待至已有请求全部处理完毕方才退出,之后客户端还需再次建立与服务端连接才能享用新版本程序所提供的服务。Nginx升级模式适用于短连接情景,但对于客户端与服务端间需频繁通信的长连接来说,一方面由于客户端请求量过大,旧版本程序不会短时间内停止服务;另一方面,频繁的创建连接也会造成资源的浪费。
[0005]相较于短连接,长连接场景下的服务端程序升级较为复杂,因为客户端需要不断与服务端通信,在相当长的时间内不会断开与服务端的连接,比如即时通讯工具QQ或麦通。CN200510126314公开了一种通信系统软件版本的平滑升级方法,包括:将硬件单板存储区中的第一长度存储块中原来正常运行的原始版本保留到缓冲存储器,将所述单板存储区重新划分为第二长度存储块,并将所述原始版本和下载的新版本分别保存到两个第二长度存储块中。利用现有硬件资源,重新合理的划分存储空间,软件版本大小在一定范围内时都不需要增加额外的存储设备,有效降低了系统成本。
[0006]但如何做到服务端程序升级时,既可以不中断服务又可以时刻维护客户长连接,保证客户端连接及客户会话数据从旧版本程序向新版本程序的转移,是当前很多系统迫切需要解决的问题。

【发明内容】

[0007]本发明的目的在于,在不断开客户端和服务器端连接的情况下,实现服务器端软件的平滑升级,并保证所有会话数据由旧版本程序转移入新版本程序中。本发明方法有利于在服务端程序升级时,保证所有客户端与服务端的连接不断开,减少客户端重连服务器的逻辑处理,提高服务端可用性和稳定性。
[0008]本发明的技术方案是,一种不中断服务的服务端程序平滑升级的方法,具体包含如下步骤:
[0009]步骤1:服务器端开始启动新程序;
[0010]步骤I的具体实现方法,把新版本程序复制到旧版本程序所在服务器的特定目录中,考虑到同一机器上的多个进程不能同时侦听相同端口号,因而需为新版本程序分配不同于旧版本程序的服务端口号,然后启动新版本程序。此时,新、旧版本程序在同一服务器上同时正常运行,但通过不同的服务端口提供服务;
[0011]步骤2:确认新版本程序在服务器端上运行没有问题后,分别向新、旧版本程序发送“开始升级”指令;
[0012]步骤3:旧版本程序接收到“开始升级”指令后,将自己的服务端口号的侦听连接传给新版本程序;为新版本程序分配不同于旧版本程序的新服务端口,新版本程序接收到“开始升级”指令后,接收到旧版本程序的侦听连接并开始接管自此之后新接入服务端的所有客户端,此时,新版本程序通过新I日两个版本的服务端口为客户端提供服务;
[0013]所谓侦听连接(亦可称为侦听套接字),就是编程技术中用于接收客户端连接的对象,这里说的连接亦可理解为编程技术中的套接字(即socket)。所述客户端连接,其区别于侦听连接,是指客户端连入服务端侦听连接后,服务端新创建的一个独立于侦听连接的连接对象;这个对象代表服务端与客户端的连接通道,通过它可以发送和接收客户端数据,因而客户会话可理解成是客户连接及通过其传输的数据的综合。
[0014]步骤3具体包括:
[0015](I)旧版本程序停止侦听套接字的事件监控,表示旧版本程序停止接收来自客户端的连接请求,停止侦听套接字的事件监控并不会影响到客户端后续向服务器继续发出连接请求;
[0016](2)旧版本程序向新版本程序发送侦听连接,之后旧版本程序关闭该侦听连接。在新版本程序未接收到侦听连接且旧版本程序已经关闭侦听连接的情况下,由于此过程中的新连接请求会被服务端操作系统缓存,因而客户端仍然可以随时向服务器发出连接请求,而且不会失败。
[0017](3)新版本程序接收侦听连接。如果接收到侦听连接之前有新的客户端连接请求发了过来,操作系统将帮助新版本程序缓存这些连接请求;
[0018](4)新版本程序开始接管所有用户的之后发往服务器的所有连接请求;
[0019]步骤4:旧版本程序停止客户端套接字的事件监控,即旧版本程序停止接收已有客户端连接的数据收发,然后获取之前所有接入旧版本程序的客户端会话,并将其打包。数据打包时需将旧版本程序未处理完成的客户端会话数据一并打包,新版本程序会在收到这些数据后继续处理。
[0020]客户端的会话数据包括客户端连接、旧版本程序未处理完的数据、网络库接收队列中的数据以及网络库发送队列中的数据。
[0021]按照服务器端应用程序的三层架所述构,网络库层位于操作系统层和应用层中间,其内含有发送队列和接收队列,承担着在两者间传输数据的角色,客户端请求到达服务器的网卡后,服务端操作系统会接收这些数据,并通知上一层的网络库;接着,网络库把操作系统收到的数据取出放入自己的接收队列中,同时通知应用层数据到达;应用层从网络层的接收队列中取出数据,经解析得到客户请求数据包,并根据实际业务做相应处理,处理的过程中可能涉及调用其它服务,如数据库、缓存及逻辑服务器等;当应用层处理完数据包后生成相应的结果包,并将其传至网络库的发送队列;网络库将发送队列中的各数据包依次发给操作系统层,最终操作系统会把返回的结果包发给客户端,响应客户端请求。因而,发送队列中存储应用层要发送至操作系统层的数据,接收队列存储应用层从操作系统层接收到的数据;停留在程序应用层还未发送至网络库层的数据被称为未处理完的数据。
[0022]步骤5:旧版本程序调用“发送会话”接口,将已打包的客户会话数据依次、逐步地传至新版本程序中;
[0023]步骤6:新版本程序调用“接收会话”接口,解包后得到旧版本程序的客户连接及会话数据,这个客户连接即是旧版本程序的客户连接。接着,新版本程序对这些连接所涉及的所有会话数据进行处理;
[0024]解包后的会话数据主要包含两部分:输入到应用中+输出到网络库;
[0025]新版本程序对解包后会话数据的处理,具体包括:
[0026](I)添加输入数据:通过调用网络库的添加输入数据接口,将旧版本程序网络库层接收队列中的数据转移入到新版本程序的网络库层接收队列中;
[0027](2)添加输出数据:通过调用网络库的添加输出数据接口,将旧版本程序网络库发送队列中的数据转移入到新版本程序的网络库层发送队列中;
[0028](3)处理旧版本程序中未处理完成的数据:将旧版本程序应用层中的数据转移入新版本程序应用层中,并进行处理;
[0029]步骤7:转到步骤5,对旧版本程序中的每个客户会话循环执行步骤5和步骤6,直到所有客户会话数据全部转移至新版本程序。这一过程会因实际场景不同而持续不同的时间,通常可在极短时间内完成迀移;
[0030]步骤8:结束旧版本程序,并向新版本程序发送指令,告之停止新版本程序的新服务端口,仅保留旧版本程序的原服务端口。至此,整个服务器端程序平滑升级过程结束
[0031]本发明与现有技术相比,其有益效果:
[0032](I)本发明提供一种不中断服务的服务端程序平滑升级的方法,实现在不断开客户端与服务端连接的情况下,进行服务端软件的升级,有效降低传统的服务端升级方式中额外开发工作和运营维护的成本;
[0033](2)本发明方法使服务端程序升级过程全程对客户端不可见,因而客户端无需关注和参与升级流程,也无需处理升级中产生的任何数据,利于简化客户端的结构设计;
[0034](3)本发明方法使服务端软件的升级无需等到客户端与服务端连接断开后进行,同时解决因服务端程序升级而可能产生的“宕机”问题,保证在不丢失任何数据的情况下完成新版本程序对旧版本程序的替换,提高服务端应用的可用性、可靠性和稳定性。
【附图说明】
[0035]图1为本发明实施例中一种不中断服务的服务端程序平滑升级的流程示意图
[0036]图2为本发明实施例中新版本程序启动时客户端与服务端连接示意图
[0037]图3为本发明实施例中旧版程序停止侦听连接请求时客户端与服务端连接示意图
[0038]图4为本发明实施例中服务端程序应用程序结构及数据传递流向示意图
[0039]图5本发明实施例中新、旧版本记性会话数据传输时客户端与服务端连接示意图
【具体实施方式】
[0040]为使本发
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1