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

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

Info

Publication number
CN105100232B
CN105100232B CN201510411325.3A CN201510411325A CN105100232B CN 105100232 B CN105100232 B CN 105100232B CN 201510411325 A CN201510411325 A CN 201510411325A CN 105100232 B CN105100232 B CN 105100232B
Authority
CN
China
Prior art keywords
program
data
client
legacy version
redaction
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201510411325.3A
Other languages
English (en)
Other versions
CN105100232A (zh
Inventor
仇文超
张旭
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Focus Education Technology Co ltd
Original Assignee
Focus Teach Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Focus Teach Technology Co Ltd filed Critical Focus Teach Technology Co Ltd
Priority to CN201510411325.3A priority Critical patent/CN105100232B/zh
Publication of CN105100232A publication Critical patent/CN105100232A/zh
Application granted granted Critical
Publication of CN105100232B publication Critical patent/CN105100232B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L67/00Network arrangements or protocols for supporting network services or applications
    • H04L67/34Network arrangements or protocols for supporting network services or applications involving the movement of software or configuration parameters 

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Networks & Wireless Communication (AREA)
  • Signal Processing (AREA)
  • Information Transfer Between Computers (AREA)

Abstract

一种不中断服务的服务端程序平滑升级的方法,步骤1:升级开始,服务器端启动新程序;步骤2:确认新版本程序在服务器端上运行没有问题后,分别向新、旧版本程序发送“开始升级”指令;步骤3:旧版本程序接收到“开始升级”指令后,将自己的服务端口号的侦听连接传给新版本程序;步骤4:旧版本程序停止客户端套接字的事件监控,旧版本程序停止接收已有客户端连接的数据收发,然后获取之前所有接入旧版本程序的客户端会话数据,并将其打包;步骤5:旧版本程序调用“发送会话”接口,将已打包的客户端会话数据依次、逐步地传至新版本程序中;步骤6:新版本程序调用“接收会话”接口;步骤7:对旧版本程序中的每个客户会话循环执行步骤5和步骤6。

Description

一种不中断服务的服务端程序平滑升级的方法
技术领域
本发明涉及服务器端程序升级的方法,特别是涉及一种不中断服务的服务端程序平滑升级的方法。
背景技术
服务器对高可用性的需求决定服务器端不能随时停止服务端应用,这是因为不管是应用的bug故障还是因升级所需的中断连接,不仅会造成服务器端的数据丢失,也会导致针对客户端的服务“宕机”。
通常情况下,客户端和服务端的连接分为短连接和长连接,短连接场景以HTTP短连接较为常见,涉及到的流程有:浏览器建立与HTTP服务器的连接,请求web页面;服务器响应浏览器请求并返回请求页面;浏览器关闭与HTTP服务器的连接。每一次HTTP请求的响应都单独建立一次连接,短连接场景因其“连接只建立在数据传输时”这一特性,使服务端程序的升级可以等到连接中断时进行。
Nginx实现服务端程序升级的原理是:(1)在不停止老进程的情况下,启动新进程;(2)老进程负责处理仍未处理完的请求,但不再接受新的处理请求;(3)新进程接受新请求;(4)老进程处理完所有请求,关闭所有连接后停止;其中新进程的执行需向新进程发送USR2信号,老进程的逐步停止需向老进程发送WINCH信号。从表面上看,这种服务端程序升级方式似乎保证了新、旧版本程序的平滑替换,但实质上看,旧版本程序在停止接收新请求后,需等待至已有请求全部处理完毕方才退出,之后客户端还需再次建立与服务端连接才能享用新版本程序所提供的服务。Nginx升级模式适用于短连接情景,但对于客户端与服务端间需频繁通信的长连接来说,一方面由于客户端请求量过大,旧版本程序不会短时间内停止服务;另一方面,频繁的创建连接也会造成资源的浪费。
相较于短连接,长连接场景下的服务端程序升级较为复杂,因为客户端需要不断与服务端通信,在相当长的时间内不会断开与服务端的连接,比如即时通讯工具QQ或麦通。CN200510126314公开了一种通信系统软件版本的平滑升级方法,包括:将硬件单板存储区中的第一长度存储块中原来正常运行的原始版本保留到缓冲存储器,将所述单板存储区重新划分为第二长度存储块,并将所述原始版本和下载的新版本分别保存到两个第二长度存储块中。利用现有硬件资源,重新合理的划分存储空间,软件版本大小在一定范围内时都不需要增加额外的存储设备,有效降低了系统成本。
但如何做到服务端程序升级时,既可以不中断服务又可以时刻维护客户长连接,保证客户端连接及客户会话数据从旧版本程序向新版本程序的转移,是当前很多系统迫切需要解决的问题。
发明内容
本发明的目的在于,在不断开客户端和服务器端连接的情况下,实现服务器端软件的平滑升级,并保证所有会话数据由旧版本程序转移入新版本程序中。本发明方法有利于在服务端程序升级时,保证所有客户端与服务端的连接不断开,减少客户端重连服务器的逻辑处理,提高服务端可用性和稳定性。
本发明的技术方案是,一种不中断服务的服务端程序平滑升级的方法,具体包含如下步骤:
步骤1:服务器端开始启动新程序;
步骤1的具体实现方法,把新版本程序复制到旧版本程序所在服务器的特定目录中,考虑到同一机器上的多个进程不能同时侦听相同端口号,因而需为新版本程序分配不同于旧版本程序的服务端口号,然后启动新版本程序。此时,新、旧版本程序在同一服务器上同时正常运行,但通过不同的服务端口提供服务;
步骤2:确认新版本程序在服务器端上运行没有问题后,分别向新、旧版本程序发送“开始升级”指令;
步骤3:旧版本程序接收到“开始升级”指令后,将自己的服务端口号的侦听连接传给新版本程序;为新版本程序分配不同于旧版本程序的新服务端口,新版本程序接收到“开始升级”指令后,接收到旧版本程序的侦听连接并开始接管自此之后新接入服务端的所有客户端,此时,新版本程序通过新旧两个版本的服务端口为客户端提供服务;
所谓侦听连接(亦可称为侦听套接字),就是编程技术中用于接收客户端连接的对象,这里说的连接亦可理解为编程技术中的套接字(即socket)。所述客户端连接,其区别于侦听连接,是指客户端连入服务端侦听连接后,服务端新创建的一个独立于侦听连接的连接对象;这个对象代表服务端与客户端的连接通道,通过它可以发送和接收客户端数据,因而客户会话可理解成是客户连接及通过其传输的数据的综合。
步骤3具体包括:
(1)旧版本程序停止侦听套接字的事件监控,表示旧版本程序停止接收来自客户端的连接请求,停止侦听套接字的事件监控并不会影响到客户端后续向服务器继续发出连接请求;
(2)旧版本程序向新版本程序发送侦听连接,之后旧版本程序关闭该侦听连接。在新版本程序未接收到侦听连接且旧版本程序已经关闭侦听连接的情况下,由于此过程中的新连接请求会被服务端操作系统缓存,因而客户端仍然可以随时向服务器发出连接请求,而且不会失败。
(3)新版本程序接收侦听连接。如果接收到侦听连接之前有新的客户端连接请求发了过来,操作系统将帮助新版本程序缓存这些连接请求;
(4)新版本程序开始接管所有用户的之后发往服务器的所有连接请求;
步骤4:旧版本程序停止客户端套接字的事件监控,即旧版本程序停止接收已有客户端连接的数据收发,然后获取之前所有接入旧版本程序的客户端会话,并将其打包。数据打包时需将旧版本程序未处理完成的客户端会话数据一并打包,新版本程序会在收到这些数据后继续处理。
客户端的会话数据包括客户端连接、旧版本程序未处理完的数据、网络库接收队列中的数据以及网络库发送队列中的数据。
按照服务器端应用程序的三层架所述构,网络库层位于操作系统层和应用层中间,其内含有发送队列和接收队列,承担着在两者间传输数据的角色,客户端请求到达服务器的网卡后,服务端操作系统会接收这些数据,并通知上一层的网络库;接着,网络库把操作系统收到的数据取出放入自己的接收队列中,同时通知应用层数据到达;应用层从网络层的接收队列中取出数据,经解析得到客户请求数据包,并根据实际业务做相应处理,处理的过程中可能涉及调用其它服务,如数据库、缓存及逻辑服务器等;当应用层处理完数据包后生成相应的结果包,并将其传至网络库的发送队列;网络库将发送队列中的各数据包依次发给操作系统层,最终操作系统会把返回的结果包发给客户端,响应客户端请求。因而,发送队列中存储应用层要发送至操作系统层的数据,接收队列存储应用层从操作系统层接收到的数据;停留在程序应用层还未发送至网络库层的数据被称为未处理完的数据。
步骤5:旧版本程序调用“发送会话”接口,将已打包的客户会话数据依次、逐步地传至新版本程序中;
步骤6:新版本程序调用“接收会话”接口,解包后得到旧版本程序的客户连接及会话数据,这个客户连接即是旧版本程序的客户连接。接着,新版本程序对这些连接所涉及的所有会话数据进行处理;
解包后的会话数据主要包含两部分:输入到应用中+输出到网络库;
新版本程序对解包后会话数据的处理,具体包括:
(1)添加输入数据:通过调用网络库的添加输入数据接口,将旧版本程序网络库层接收队列中的数据转移入到新版本程序的网络库层接收队列中;
(2)添加输出数据:通过调用网络库的添加输出数据接口,将旧版本程序网络库发送队列中的数据转移入到新版本程序的网络库层发送队列中;
(3)处理旧版本程序中未处理完成的数据:将旧版本程序应用层中的数据转移入新版本程序应用层中,并进行处理;
步骤7:转到步骤5,对旧版本程序中的每个客户会话循环执行步骤5和步骤6,直到所有客户会话数据全部转移至新版本程序。这一过程会因实际场景不同而持续不同的时间,通常可在极短时间内完成迁移;
步骤8:结束旧版本程序,并向新版本程序发送指令,告之停止新版本程序的新服务端口,仅保留旧版本程序的原服务端口。至此,整个服务器端程序平滑升级过程结束
本发明与现有技术相比,其有益效果:
(1)本发明提供一种不中断服务的服务端程序平滑升级的方法,实现在不断开客户端与服务端连接的情况下,进行服务端软件的升级,有效降低传统的服务端升级方式中额外开发工作和运营维护的成本;
(2)本发明方法使服务端程序升级过程全程对客户端不可见,因而客户端无需关注和参与升级流程,也无需处理升级中产生的任何数据,利于简化客户端的结构设计;
(3)本发明方法使服务端软件的升级无需等到客户端与服务端连接断开后进行,同时解决因服务端程序升级而可能产生的“宕机”问题,保证在不丢失任何数据的情况下完成新版本程序对旧版本程序的替换,提高服务端应用的可用性、可靠性和稳定性。
附图说明
图1为本发明实施例中一种不中断服务的服务端程序平滑升级的流程示意图
图2为本发明实施例中新版本程序启动时客户端与服务端连接示意图
图3为本发明实施例中旧版程序停止侦听连接请求时客户端与服务端连接示意图
图4为本发明实施例中服务端程序应用程序结构及数据传递流向示意图
图5本发明实施例中新、旧版本记性会话数据传输时客户端与服务端连接示意图
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本发明进一步详细说明
如图1所示,为本发明实施例中一种不中断服务的服务端程序平滑升级流程示意图,具体包括:
步骤1:升级开始,服务端启动新程序;
步骤1的具体实现方法,把新版本程序复制到旧版本程序所在服务器的特定目录中,考虑到同一机器上的多个进程不能同时侦听相同端口号,因而需为新版本程序分配不同于旧版本程序的服务端口号,然后启动新版本程序。此时,客户端与服务端的连接依据客户端设置的端口号建立,新、旧版本程序在同一服务器上同时正常运行,但通过不同的服务端口提供服务;
例如:新版本程序未启动前,旧版本程序通过443端口为客户端1、客户端2、…、客户端N提供服务,新版本程序启动后,旧版本程序仍通过443端口为客户端1、客户端2、…、k客户端N提供服务,新版本程序通过80端口为客户端N+1提供服务,这里的80端口通常称为预发布端口,方便对部分线上用户进行灰度发布。即让部分用户优先使用新版本的程序,这些用户通过80端口而非原来的443端口来连接服务器,参阅图2所示。
步骤2:确认新版本程序在服务器端上运行没有问题,分别向新、旧版本程序发送“开始升级”指令。例如可以通过Telnet命令连接应用程序,并向程序发送各类控制指令,应用程序中开放管理端口来供Telnet进行控制;
步骤3:旧版本程序接收到“开始升级”指令后,将自己的服务端口号的侦听连接传给新版本程序;新版本程序接收到“开始升级”指令后,接收到旧版本程序的侦听连接并开始接管自此之后新接入服务端的所有客户端(包括443端口和80端口)。此时,新版本程序通过两个服务端口为客户端提供服务。
所谓侦听连接(亦可称为侦听套接字),就是编程技术中用于接收客户端连接的对象,这里说的连接亦可理解为编程技术中的套接字(即socket);所述客户端连接,其区别于侦听连接,是指客户端连入服务端侦听连接后,服务端新创建的一个独立于侦听连接的连接对象;这个对象代表服务端与客户端的连接通道,通过它可以发送和接收客户端数据,因而客户会话可理解成是客户连接及通过其传输的数据的综合。
步骤3具体包括:
(1)旧版本程序停止侦听套接字的事件监控,表示旧版本程序停止接收来自客户端的连接请求,停止侦听套接字的事件监控并不会影响到客户端后续向服务器继续发出连接请求;
(2)旧版本程序向新版本程序发送侦听连接,之后旧版本程序关闭该侦听连接。在新版本程序未接收到侦听连接且旧版本程序已经关闭侦听连接的情况下,由于此过程中的新连接请求会被服务端操作系统缓存,因而客户端仍然可以随时向服务器发出连接请求,而且不会失败。
(3)新版本程序接收侦听连接。如果接收到侦听连接之前有新的客户端连接请求发了过来,操作系统将帮助新版本程序缓存这些连接请求;
(4)新版本程序开始接管所有用户的之后发往服务器的所有连接请求;
根据上述例子,旧版本程序响应升级指令,停止接收新的客户端请求,但不断开已有客户端连接,如果此时有客户端n+2请求接入服务端,则操作系统会缓存这一请求直到新版本程序接收到旧版本程序的侦听连接;新版本程序响应升级指令,获取旧版本程序443服务的侦听连接,并与80服务端口的侦听连接一同提供服务,之后新的客户端可通过443服务端口或80服务端口接入新版本程序,参阅图3所示。
部分代码可参考如下:
//旧版本程序向新版本程序发送侦听连接
intop_t_send_listener(LibsuOpCtx*suctx,struct event*listener,char*data,size_tlen){
int res=-1;
//组装会话信息结构
LibsuSessionInfosi;
si.fd=event_get_fd(listener);
si.data=data;
si.data_len=len;
LibsuSessionEtra extra;
extra.role=LIBSU_SR_LISTENER;
si.extra=extra;
//组装会话输入输出结构
LibsuSessionInputOutputio;
io.input_len=0;
io.input=NULL;
io.output_len=0;
io.output=NULL;
do{
if(NULL==suctx)
break;
//发送会话
intrt=send_session(bufferevent_getfd(suctx->_op_t_bev),&si,&io);
if(rt!=0)
break;
res=0;
}while(0);
return res;
}
//新版本程序接收侦听连接,并开始接管所有用户的之后发往服务器的所有连接请求
//准备会话信息结构
LibsuSessionInfosi;
si.fd=-1;
si.data=NULL;
si.data_len=0;
LibsuSessionEtrasessionetra;
sessionetra.role=LIBSU_SR_LISTENER;
si.extra=sessionetra;
//准备会话输入输出结构
LibsuSessionInputOutputio;
io.input_len=0;
io.input=NULL;
io.output_len=0;
io.output=NULL;
do{
//接收会话
intrt=recv_session(fd,&si,&io);
if(rt!=0)
break;
LibsuSessionEtra extra=si.extra;
//新版本程序开始接管所有用户的之后发往服务器的所有连接请求。
if(suctx->_np_rl_acceptcb&&suctx->_libsu_np_t_recved_listener_cb){
//新版本程序创建libevent的侦听器对象.
suctx->_np_rl_listener=event_new(suctx->_np_event_base,
si.fd,
EV_READ|EV_PERSIST,
suctx->_np_rl_acceptcb,
suctx->_np_rl_acceptcb_ctx);
//新版本程序添加侦听器对象
event_add(suctx->_np_rl_listener,NULL);
步骤4:旧版本程序停止客户端套接字的事件监控,即旧版本程序停止接收已有客户端连接的数据收发,然后获取之前所有接入旧版本程序的客户端会话,并将其打包。数据打包时需将旧版本程序未处理完成的客户端会话数据一并打包,新版本程序会在收到这些数据后继续处理。
客户端的会话数据包括客户端连接(套接字)、旧版本程序未处理完的数据、网络库接收队列中的数据以及网络库发送队列中的数据。
按照服务器端应用程序的三层架所述构,网络库层位于操作系统层和应用层中间,其内含有发送队列和接收队列,承担着在两者间传输数据的角色,客户端请求到达服务器的网卡后,服务端操作系统会接收这些数据,并通知上一层的网络库;接着,网络库把操作系统收到的数据取出放入自己的接收队列中,同时通知应用层数据到达;应用层从网络层的接收队列中取出数据,经解析得到客户请求数据包,并根据实际业务做相应处理,处理的过程中可能涉及调用其它服务,如数据库、缓存及逻辑服务器等;当应用层处理完数据包后生成相应的结果包,并将其传至网络库的发送队列;网络库将发送队列中的各数据包依次发给操作系统层,最终操作系统会把返回的结果包发给客户端,响应客户端请求,参与图4所示。因而,发送队列中存储应用层要发送至操作系统层的数据,接收队列存储应用层从操作系统层接收到的数据;停留在程序应用层还未发送至网络库层的数据被称为未处理完的数据。
根据上述例子,旧版本程序停止接收客户端1、客户端2、…、客户端n的会话请求,并将每个客户端连接及其当前已有的会话数据(包括服务端已处理的会话请求和未处理完的会话请求)打包,最终形成数据包1、数据包2、、…、数据包n。
步骤5:旧版本程序调用“发送会话”接口,将已打包的客户会话数据依次传至新版本程序中。“发送会话”接口的实现可视情况选用不同的实现方式,比如在大部分Unix操作系统平台及类Unix平台(如Linux、BSD及AIX等)中,使用Unix域套接字实现单机进程间套接字及数据的传递;
部分代码可参考如下:
//拼接会话数据各部分长度。
//包括应用层中数据长度,网络层输入队列数据长度,网络层输出队列数据长度。
char header[LIBSU_HEADER_SIZE];
memcpy(&header[LIBSU_HEADER_RSV_SIZE+sizeof(size_t)*0],&(si->data_len),sizeof(si->data_len));
memcpy(&header[LIBSU_HEADER_RSV_SIZE+sizeof(size_t)*1],&(io->input_len),sizeof(io->input_len));
memcpy(&header[LIBSU_HEADER_RSV_SIZE+sizeof(size_t)*2],&(io->output_len),sizeof(io->output_len));
//发送会话连接及会话数据各部分长度。
ssize_trt=libsu_write_fd(fd,header,sizeof(header),si->fd,errmsg);
if(rt==-1)
break;
//设置传递通道为阻塞式。以便一次性的把下面各部分数据全部发送过去。
if(0!=SetBlocking(fd,1)){
break;
}
//发送应用层数据
int ret=0;
if(si->data_len>0){
if(si->data)//si->data is malloc outside of libsu,so free by user.{
ret=SendnSync(fd,si->data,si->data_len,errmsg);
if(ret==-1)
break;
}
else{
fprintf(stderr,"libsu_send_session,io->data==NULL!\n");
}
}
//发送网络层输入队列数据
if(io->input_len>0){
if(io->input){
ret=SendnSync(fd,io->input,io->input_len,errmsg);
free(io->input);//io->input is malloc by libsu,so free by myself.
if(ret==-1)
break;}
else{
fprintf(stderr,"libsu_send_session,io->input==NULL!\n");
}
}
//发送网络层输出队列数据
if(io->output_len>0){
if(io->output){
ret=SendnSync(fd,io->output,io->output_len,errmsg);
free(io->output);//io->output is malloc by libsu,so free by myself.
if(ret==-1)
break;}
else{
fprintf(stderr,"libsu_send_session,io->output==NULL!\n");
}
}
//发送附加数据。用于标识本次发送的信息是侦听会话还是客户会话。
ret=SendnSync(fd,(const char*)(&(si->extra)),sizeof(si->extra),errmsg);
if(0!=ret)
break;
步骤6:新版本程序调用“接收会话”接口,解包后得到旧版本程序的客户连接及会话数据,这个客户连接即是旧版本程序原有的连接。接着,新版本程序对当前所有会话数据进行处理。“接收会话”接口的实现可以使用与“发送会话”相同的Unix域套接字技术;
解包后的会话数据主要包含两部分:输入到应用中+输出到网络库;
新版本程序对解包后会话数据的处理,具体包括:
(1)添加输入数据:通过调用网络库的添加输入数据接口将旧版本程序网络库层接收队列中的数据转移入到新版本程序的网络库层接收队列中;
在libevent中,调用方式如下所示:
evbuffer_prepend(bufferevent_get_input(bev),io.input,io.input_len);
其中,bufferevent_get_input(bev)是获取libevent的输入结构对象,io.input和io.input_len是输入数据及其长度。
(2)添加输出数据:通过调用网络库的添加输出数据接口,将旧版本程序网络库发送队列中的数据转移入到新版本程序的网络库层发送队列中;
在libevent中,调用方式如下所示:
evbuffer_add(bufferevent_get_output(bev),io.output,io.output_len);
其中,bufferevent_get_output(bev)是获取libevent的输出结构对象,io.output和io.output_len是输出数据及其长度。
(3)处理旧版本程序中未处理完成的数据:将旧版本程序应用层中的数据转移入新版本程序应用层中,并进行处理;
部分代码可参考如下:
//接收会话数据各部分长度。
//包括应用层中数据长度,网络层输入队列数据长度,网络层输出队列数据长度。
char header[LIBSU_HEADER_SIZE]={0};
ssize_trt=libsu_read_fd(fd,header,sizeof(header),&si->fd,errmsg);
if(rt<0){
break;
}
memcpy(&(si->data_len),&header[LIBSU_HEADER_RSV_SIZE+sizeof(size_t)*0],sizeof(si->data_len));
memcpy(&(io->input_len),&header[LIBSU_HEADER_RSV_SIZE+sizeof(size_t)*1],sizeof(io->input_len));
memcpy(&(io->output_len),&header[LIBSU_HEADER_RSV_SIZE+sizeof(size_t)*2],sizeof(io->output_len));
//接收应用层数据
int ret=0;
if(si->data_len>0){
si->data=(char*)(malloc(si->data_len+1));
if(NULL==si->data)
break;
si->data[si->data_len]='\0';
ret=RecvnSync(fd,si->data,si->data_len,errmsg);
if(ret==-1)
break;}
//接收网络层输入队列数据
if(io->input_len>0){
io->input=(char*)(malloc(io->input_len));//free after recved by libsu.
if(NULL==io->input)
break;
ret=RecvnSync(fd,io->input,io->input_len,errmsg);
if(ret==-1)
break;}
//接收网络层输出队列数据
if(io->output_len>0){
io->output=(char*)(malloc(io->output_len));//free after recved by libsu.
if(NULL==io->output)
break;
ret=RecvnSync(fd,io->output,io->output_len,errmsg);
if(ret==-1)
break;}
//接收附加数据。用于标识本次发送的信息是侦听会话还是客户会话。
ret=RecvnSync(fd,(char*)(&(si->extra)),sizeof(si->extra),errmsg);
if(0!=ret)
break;
res=0;
步骤7:转到步骤5,对旧版本程序中的每个客户会话循环执行步骤5和步骤6,直到所有客户会话数据全部转移至新版本程序。这一过程会因实际场景不同而持续不同的时间,通常可在极短时间内完成迁移;
根据上述例子,客户端1、客户端2、…、客户端N在不与服务端断开连接的情景下,依次断开与旧版本程序的连接,然后依次与新版本程序建立联系,参阅图5所示。
步骤8:退出旧版本程序,并向新版本程序发送指令,告之停止新版本程序的服务端口,仅保留旧版本程序的服务端口。至此,整个服务器端程序平滑升级过程结束
根据上述例子,新版本程序停止80服务端口的服务,自此开始彻底替代旧版本程序,通过443服务端口为客户端提供服务。
所属领域的普通技术人员应当理解:以上所述仅为本发明的具体实施例而已,并不用于限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (5)

1.一种不中断服务的服务端程序平滑升级的方法,其特征在于,包括如下步骤:
步骤1:升级开始,服务器端启动新程序;
步骤2:确认新版本程序在服务器端上运行没有问题后,分别向新、旧版本程序发送“开始升级”指令;
步骤3:旧版本程序接收到“开始升级”指令后,将自己的服务端口号的侦听连接传给新版本程序;为新版本程序分配不同于旧版本程序的新服务端口,新版本程序接收到“开始升级”指令后,接收到旧版本程序的侦听连接并开始接管自此之后新接入服务端的所有客户端,此时,新版本程序通过新旧两个版本的服务端口为客户端提供服务;
步骤4:旧版本程序停止客户端套接字的事件监控,即旧版本程序停止接收已有客户端连接的数据收发,然后获取之前所有接入旧版本程序的客户端会话数据,并将其打包;数据打包时需将旧版本程序未处理完成的客户端会话数据一并打包,新版本程序会在收到这些数据后继续处理;
步骤5:旧版本程序调用“发送会话”接口,将已打包的客户端会话数据依次、逐步地传至新版本程序中;
步骤6:新版本程序调用“接收会话”接口,解包后得到旧版本程序的客户连接及会话数据,这个客户连接即是旧版本程序的客户连接;接着,新版本程序对这些连接所涉及的所有会话数据进行处理;
步骤7:转到步骤5,对旧版本程序中的每个客户会话循环执行步骤5和步骤6,直到所有客户会话数据全部转移至新版本程序;这一过程会因实际场景不同而持续不同的时间;通常可在极短时间内完成迁移;
步骤8:结束旧版本程序,并向新版本程序发送指令,告之停止新版本程序的新服务端口,仅保留旧版本程序的原服务端口,至此,整个服务器端程序平滑升级过程结束。
2.根据权利要求1所述的一种不中断服务的服务端程序平滑升级的方法,其特征在于:
步骤1的具体实现方法是:将新版本程序复制到旧版本程序所在服务器的特定目录中,为其分配不同于旧版本程序的服务端口号,进而保证新版本程序的启动;此时,新、旧版本程序在同一服务器上同时正常运行,但通过不同的服务端口提供服务。
3.根据权利要求1所述的一种不中断服务的服务端程序平滑升级的方法,其特征在于:
步骤3中所述的侦听连接即侦听套接字指代用于接收客户端连接的对象,能够理解为侦听套接字;所述客户端连接,其区别于侦听连接,是指客户端连入服务端侦听连接后,服务端新创建的一个独立于侦听连接的连接对象;这个对象代表服务端与客户端的连接通道,通过它能发送和接收客户端数据,因而客户会话可理解成是客户连接及通过其传输的数据的综合;
步骤3的具体实现包括:
(1)旧版本程序停止侦听套接字的事件监控,表示旧版本程序停止接收来自客户端的连接请求,停止侦听套接字的事件监控并不会影响到客户端后续向服务器继续发出连接请求;
(2)旧版本程序向新版本程序发送侦听连接,之后旧版本程序关闭该侦听连接;在新版本程序未接收到侦听连接且旧版本程序已经关闭侦听连接的情况下,由于此过程中的新连接请求会被服务端操作系统缓存,因而客户端仍然能够随时向服务器发出连接请求,而且不会失败;
(3)新版本程序接收侦听连接;如果接收到侦听连接之前有新的客户端连接请求发了过来,操作系统将帮助新版本程序缓存这些连接请求;
(4)新版本程序开始接管所有用户之后发往服务器的所有连接请求。
4.根据权利要求1所述的一种不中断服务的服务端程序平滑升级的方法,其特征在于,客户端的会话数据包括客户端连接、旧版本程序未处理完的数据、网络库层接收队列中的数据以及网络库层发送队列中的数据;
按照服务器端应用程序的三层架构,网络库层位于操作系统层和应用层中间,其内含有发送队列和接收队列,承担着在两者间传输数据的角色,客户端请求到达服务器的网卡后,服务端操作系统会接收这些数据,并通知上一层的网络库层;接着,网络库层把操作系统收到的数据取出放入自己的接收队列中,同时通知应用层数据到达;应用层从网络库层的接收队列中取出数据,经解析得到客户请求数据包,并根据实际业务做相应处理,处理的过程中可能涉及调用其它服务,包括数据库、缓存及逻辑服务器;当应用层处理完数据包后生成相应的结果包,并将其传至网络库层的发送队列;网络库层将发送队列中的各数据包依次发给操作系统层,最终操作系统会把返回的结果包发给客户端,响应客户端请求;因而,发送队列中存储应用层要发送至操作系统层的数据,接收队列存储应用层从操作系统层接收到的数据;停留在程序应用层还未发送至网络库层的数据被称为未处理完的数据。
5.根据权利要求1所述的一种不中断服务的服务端程序平滑升级的方法,其特征在于,解包后的会话数据主要包含两部分:输入到应用中+输出到网络库层;
新版本程序对解包后会话数据的处理,具体包括:
(1)添加输入数据:通过调用网络库层的添加输入数据接口,将旧版本程序网络库层接收队列中的数据转移入到新版本程序的网络库层接收队列中;
(2)添加输出数据:通过调用网络库层的添加输出数据接口,将旧版本程序网络库层发送队列中的数据转移入到新版本程序的网络库层发送队列中;
(3)处理旧版本程序中未处理完成的数据:将旧版本程序应用层中的数据转移入新版本程序应用层中,并进行处理。
CN201510411325.3A 2015-07-14 2015-07-14 一种不中断服务的服务端程序平滑升级的方法 Active CN105100232B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201510411325.3A CN105100232B (zh) 2015-07-14 2015-07-14 一种不中断服务的服务端程序平滑升级的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201510411325.3A CN105100232B (zh) 2015-07-14 2015-07-14 一种不中断服务的服务端程序平滑升级的方法

Publications (2)

Publication Number Publication Date
CN105100232A CN105100232A (zh) 2015-11-25
CN105100232B true CN105100232B (zh) 2016-08-17

Family

ID=54579748

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201510411325.3A Active CN105100232B (zh) 2015-07-14 2015-07-14 一种不中断服务的服务端程序平滑升级的方法

Country Status (1)

Country Link
CN (1) CN105100232B (zh)

Families Citing this family (27)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106301820B (zh) * 2015-05-15 2020-03-10 阿里巴巴集团控股有限公司 一种基于网络连接服务的升级方法和装置
CN106909410B (zh) * 2015-12-23 2024-04-30 鼎捷软件股份有限公司 一种用于服务器系统的更新方法以及服务器系统
CN105450782B (zh) 2016-01-15 2018-11-06 网宿科技股份有限公司 一种无丢包零停机重启网络服务的方法和系统
US10671376B2 (en) 2016-03-15 2020-06-02 Shenzhen Skyworth-Rgb Electronic Co., Ltd. Server program hot upgrading method and device
AU2016277742A1 (en) * 2016-03-15 2017-10-05 Shenzhen Skyworth-Rgb Electronic Co., Ltd. Server program hot upgrading method and device
CN107463390B (zh) * 2016-06-02 2020-12-01 阿里巴巴集团控股有限公司 一种软件升级方法及升级服务器
CN107544991B (zh) * 2016-06-23 2020-10-23 滴滴(中国)科技有限公司 服务器处理访问请求的方法和装置
CN106130798A (zh) * 2016-08-29 2016-11-16 上海斐讯数据通信技术有限公司 一种服务系统平滑升级的方法
CN107809445A (zh) * 2016-08-31 2018-03-16 阿里巴巴集团控股有限公司 服务请求处理系统、方法和装置
CN106445593B (zh) * 2016-09-22 2020-02-18 广州华多网络科技有限公司 一种分布式系统通信中灰度升级的方法及装置
CN106598648A (zh) * 2016-11-10 2017-04-26 北京三快在线科技有限公司 一种服务器程序升级的控制方法及装置
CN108076091A (zh) * 2016-11-14 2018-05-25 北京京东尚科信息技术有限公司 用于应用程序发版的方法和系统
CN107153560B (zh) * 2017-05-25 2020-12-15 微梦创科网络科技(中国)有限公司 版本升级方法、服务器和系统
CN108984191A (zh) * 2017-06-02 2018-12-11 阿里巴巴集团控股有限公司 一种应用更新的方法、装置以及电子设备
CN108170464A (zh) * 2017-12-27 2018-06-15 联想(北京)有限公司 一种版本升级方法、服务平台及电子设备
CN108446219B (zh) * 2018-03-01 2021-07-13 网易宝有限公司 应用程序的操作方法、系统、介质和计算设备
CN108459871A (zh) * 2018-03-13 2018-08-28 北京焦点新干线信息技术有限公司 一种实现平滑发布的方法及装置
CN109086069A (zh) * 2018-10-24 2018-12-25 特瓦特能源科技有限公司 一种后台服务无缝升级方法及其装置
CN109857439B (zh) * 2019-01-30 2020-11-20 腾讯科技(深圳)有限公司 一种游戏版本的更新方法及装置
CN110874234A (zh) * 2019-10-15 2020-03-10 北京雷石天地电子技术有限公司 一种程序升级方法及系统
CN110928568B (zh) * 2019-11-05 2022-07-26 杭州衣科信息技术股份有限公司 一种发布更新web应用程序时业务服务不间断的方法
CN110806890B (zh) * 2019-11-21 2023-06-06 金蝶软件(中国)有限公司 软件更新方法以及相关装置
CN111258739A (zh) * 2020-01-20 2020-06-09 上海米哈游天命科技有限公司 一种服务器进程更新方法、装置、服务器和介质
CN112506549B (zh) * 2020-12-17 2022-07-08 思必驰科技股份有限公司 用于多轮对话长连接服务的升级方法及系统
CN114915669A (zh) * 2021-02-08 2022-08-16 北京金山云网络技术有限公司 一种基于quic协议的服务升级方法、装置及电子设备
CN113162992B (zh) * 2021-04-01 2022-05-27 杭州数跑科技有限公司 系统的升级不断流控制方法、装置、设备和存储介质
CN114553693B (zh) * 2022-02-21 2024-03-26 上海哔哩哔哩科技有限公司 网关升级方法及装置

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101078993A (zh) * 2007-03-13 2007-11-28 中兴通讯股份有限公司 一种终端产品不中断业务在线升级版本的方法
CN102299940A (zh) * 2010-06-25 2011-12-28 龚华清 一种不间断网络服务的软件升级方法
CN103501298A (zh) * 2013-09-29 2014-01-08 杭州华三通信技术有限公司 一种不中断业务升级过程中保证链路不断流的方法和设备

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101078993A (zh) * 2007-03-13 2007-11-28 中兴通讯股份有限公司 一种终端产品不中断业务在线升级版本的方法
CN102299940A (zh) * 2010-06-25 2011-12-28 龚华清 一种不间断网络服务的软件升级方法
CN103501298A (zh) * 2013-09-29 2014-01-08 杭州华三通信技术有限公司 一种不中断业务升级过程中保证链路不断流的方法和设备

Also Published As

Publication number Publication date
CN105100232A (zh) 2015-11-25

Similar Documents

Publication Publication Date Title
CN105100232B (zh) 一种不中断服务的服务端程序平滑升级的方法
CN111917649B (zh) 虚拟私有云通信及配置方法以及相关装置
CN111277616B (zh) 一种基于rdma的数据传输方法和分布式共享内存系统
CN102523302B (zh) 虚拟机集群的负载均衡方法、服务器及系统
CN103095783B (zh) 一种调试Web应用的方法及装置
CN106130990B (zh) 容器访问的控制方法及装置
CN104253856A (zh) 可缩放Web实时通信媒体引擎以及相关的方法、系统
KR20090030451A (ko) 공유 메모리를 이용한 가상 기계 상의 응용프로그램 간통신 인터페이스 장치 및 그 방법
CN107770269A (zh) 一种服务响应方法及其终端
CN106453668A (zh) 一种文件反向上传方法和系统
CN103905510A (zh) 一种数据包的处理方法及后台服务器
CN105190530A (zh) 传输硬件渲染的图形数据
CN108667817A (zh) 报文转换系统和报文转换方法
CN114501593A (zh) 网络切片接入方法、装置、系统和存储介质
CN104883277A (zh) 一种基于bmc的信息交互方法和系统
CN110351362A (zh) 数据验证方法、设备及计算机可读存储介质
CN104486133B (zh) 网元代理管理的方法及系统
CN113383515A (zh) 实时通信的设备增强
CN114338632B (zh) 远程终端控制方法、装置、计算机设备及存储介质
CN109587749A (zh) 数据发送方法和系统
KR20090071542A (ko) 호스트 가장 네트워크 디바이스 및 그의 방법
CN114615321A (zh) 流量处理方法和装置
JP7339358B2 (ja) アウトバウンド市場および参照データのための統合貢献データブリッジを実装するシステムおよび方法
CN107277107A (zh) 应用调试方法、装置及系统
CN110795212A (zh) 基于框式设备的主备主控配置同步方法和装置

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C41 Transfer of patent application or patent right or utility model
TA01 Transfer of patent application right

Effective date of registration: 20160719

Address after: Huidalu high tech Zone of Nanjing City, Jiangsu province 210000 Beidou No. 6 Building 2 building 230 room

Applicant after: FOCUS EDUCATION TECHNOLOGY CO.,LTD.

Address before: A software building Spark Road 210003 in Jiangsu province high tech Industrial Development Zone of Nanjing city 8-12F

Applicant before: FOCUS TECHNOLOGY Co.,Ltd.

C14 Grant of patent or utility model
GR01 Patent grant
EE01 Entry into force of recordation of patent licensing contract

Application publication date: 20151125

Assignee: Nanjing Jiangbei new area Yangzi Technology Finance Leasing Co.,Ltd.

Assignor: FOCUS EDUCATION TECHNOLOGY Co.,Ltd.

Contract record no.: X2021320000060

Denomination of invention: A method of smooth upgrade of server program without interrupting service

Granted publication date: 20160817

License type: Exclusive License

Record date: 20210804

EE01 Entry into force of recordation of patent licensing contract
PE01 Entry into force of the registration of the contract for pledge of patent right

Denomination of invention: A method of smooth upgrade of server program without interrupting service

Effective date of registration: 20210811

Granted publication date: 20160817

Pledgee: Nanjing Jiangbei new area green Financing Guarantee Co.,Ltd.

Pledgor: FOCUS EDUCATION TECHNOLOGY Co.,Ltd.

Registration number: Y2021320000170

PE01 Entry into force of the registration of the contract for pledge of patent right
PC01 Cancellation of the registration of the contract for pledge of patent right

Date of cancellation: 20220905

Granted publication date: 20160817

Pledgee: Nanjing Jiangbei new area green Financing Guarantee Co.,Ltd.

Pledgor: FOCUS EDUCATION TECHNOLOGY CO.,LTD.

Registration number: Y2021320000170

PC01 Cancellation of the registration of the contract for pledge of patent right
EC01 Cancellation of recordation of patent licensing contract
EC01 Cancellation of recordation of patent licensing contract

Assignee: Nanjing Jiangbei new area Yangzi Technology Finance Leasing Co.,Ltd.

Assignor: FOCUS EDUCATION TECHNOLOGY CO.,LTD.

Contract record no.: X2021320000060

Date of cancellation: 20220921

EE01 Entry into force of recordation of patent licensing contract

Application publication date: 20151125

Assignee: Nanjing Jiangbei new area Yangzi Technology Finance Leasing Co.,Ltd.

Assignor: FOCUS EDUCATION TECHNOLOGY CO.,LTD.

Contract record no.: X2022980016989

Denomination of invention: A method of smooth upgrade of server program without interrupting service

Granted publication date: 20160817

License type: Exclusive License

Record date: 20220929

EE01 Entry into force of recordation of patent licensing contract
PE01 Entry into force of the registration of the contract for pledge of patent right

Denomination of invention: A method of smooth upgrade of server program without interrupting service

Effective date of registration: 20221010

Granted publication date: 20160817

Pledgee: Nanjing Jiangbei new area green Financing Guarantee Co.,Ltd.

Pledgor: FOCUS EDUCATION TECHNOLOGY CO.,LTD.

Registration number: Y2022980017662

PE01 Entry into force of the registration of the contract for pledge of patent right
EC01 Cancellation of recordation of patent licensing contract

Assignee: Nanjing Jiangbei new area Yangzi Technology Finance Leasing Co.,Ltd.

Assignor: FOCUS EDUCATION TECHNOLOGY CO.,LTD.

Contract record no.: X2022980016989

Date of cancellation: 20231027

EC01 Cancellation of recordation of patent licensing contract
PC01 Cancellation of the registration of the contract for pledge of patent right

Date of cancellation: 20231108

Granted publication date: 20160817

Pledgee: Nanjing Jiangbei new area green Financing Guarantee Co.,Ltd.

Pledgor: FOCUS EDUCATION TECHNOLOGY CO.,LTD.

Registration number: Y2022980017662

PC01 Cancellation of the registration of the contract for pledge of patent right
EE01 Entry into force of recordation of patent licensing contract

Application publication date: 20151125

Assignee: Nanjing Yangzi Technology Industry Leasing Co.,Ltd.

Assignor: FOCUS EDUCATION TECHNOLOGY CO.,LTD.

Contract record no.: X2023980047189

Denomination of invention: A method for smooth upgrade of server-side programs without interrupting services

Granted publication date: 20160817

License type: Exclusive License

Record date: 20231115

EE01 Entry into force of recordation of patent licensing contract
PE01 Entry into force of the registration of the contract for pledge of patent right
PE01 Entry into force of the registration of the contract for pledge of patent right

Denomination of invention: A method for smooth upgrade of server-side programs without interrupting services

Effective date of registration: 20231120

Granted publication date: 20160817

Pledgee: Nanjing Jiangbei new area green Financing Guarantee Co.,Ltd.

Pledgor: FOCUS EDUCATION TECHNOLOGY CO.,LTD.

Registration number: Y2023980066159