一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

基于父子进程传递描述符的网关控制程序的优雅升级方法与流程

2022-02-22 06:46:45 来源:中国专利 TAG:


1.本发明涉及网关程序开发技术领域,尤其是涉及一种基于父子进程传递描述符的网关控制程序的优雅升级方法。


背景技术:

2.现有网关已承载很多业务,当网关需要对控制程序升级时,往往需要后端服务配合进行停机发布。因此需要实现不停机升级的方案,从而不影响后端系统。
3.现有不停机方案如下:
4.1、在启动新网关进程时,用so_reuseport socket选项,以便新进程在相同的ip和端口上启动监听。linux内核会平衡分配连接请求到所有可用的socket监听。当一个新的进程启动后,将会产生两个不同的进程绑定到同样的ip和端口,但此时的套接字描述符是不同的。
5.2、新进程开始接受请求后,老进程开始停止接受请求并关闭自己的套接字直到进程真正退出。
6.然而,现有的方案还是有很小的概率,在最后一次接收调用和套接字真正关闭这段时间内,仍会有请求进到这个套接字来,由于代码会继续执行关闭套接字,但是此时在此监听套接字上backlog队列的已被系统接受或正在建立链接的请求将会被丢弃而得不到处理。即无法做到完全的优雅升级,且在升级的过程中,会导致请求的失败。


技术实现要素:

7.本发明的目的就是为了克服上述现有技术存在的缺陷而提供一种基于父子进程传递描述符的网关控制程序的优雅升级方法。
8.本发明的目的可以通过以下技术方案来实现:
9.基于父子进程传递描述符的网关控制程序的优雅升级方法,该方法包括:
10.当正在运行的父进程接收控制程序的优雅升级指令时,将新的执行程序替换旧的文件位置;
11.向父进程发送保留至用户使用的信号,清除所有套接字描述符的关闭标志后,创建新的执行程序,将老的父进程的套接字描述符通过环境变量传给新的子进程,并由新的执行程序派生新的worker子进程;
12.当新的请求到达时,所有的父进程皆接受请求,老的父进程向其所有子进程发送优雅升级停止信号,并控制各子进程不再接受请求并执行完当前请求后退出;
13.老的子进程逐一执行完请求后退出;
14.更新完成后,老的父进程退出,新的子进程继续运行,完成一次控制程序的优雅升级。
15.进一步地,向父进程发送保留至用户使用的信号,清除所有套接字描述符的关闭标志后,调用fork函数与exec函数创建新的执行程序。
16.进一步地,所述套接字描述符的关闭标志用于标记套接字描述符是否关闭,当对套接字描述符设置了关闭标志,则判定调用exec函数执行的程序里,此套接字描述符被关闭,无法再使用;而在调用fork函数的子进程中,此套接字描述符并不关闭,仍可使用。
17.进一步地,所述套接字描述符的关闭标志为fd_cloexec标志。
18.进一步地,老的子进程逐一执行完请求后退出的具体步骤包括:
19.1)发送hup信号至老的父进程,老的父进程将派生由旧的执行程序控制的子进程并接收请求,同时通知新的父进程及子进程优雅退出;
20.2)发送term信号至新的父进程,则新的父进程通知新的子进程立即退出,且新的父进程也立即退出,老的父进程派生出子进程继续处理请求。
21.相较于现有技术,本发明方法采用父子进程传递描述符进行控制程序升级,该升级方式中,父进程负责接受管理面的指令,即接受外界的管理指令,并管理子进程,子进程负责具体处理请求逻辑;采用程序调用linux操作系统命令,令监听的套接字在内核态只有一个,而用户态下可以实现多个进程绑定到此监听的套接字上,即只需在用户态启动新的进程时调用同一个套接字的接口就可以保证网关控制程序的优雅升级,且在升级的过程中,可完全避免请求的失败。
附图说明
22.图1为实施例中基于父子进程传递描述符的网关控制程序的优雅升级方法的流程原理示意图。
具体实施方式
23.下面结合附图和具体实施例对本发明进行详细说明。显然,所描述的实施例是本发明的一部分实施例,而不是全部实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都应属于本发明保护的范围。
24.实施例
25.本发明涉及一种基于父子进程传递描述符的网关控制程序的优雅升级方法,优雅升级,即在对业务和用户无感知的情况下,对系统进行升级。本发明方法能够解决如何使监听的套接字在内核态只有一个,且用户态下可实现多个进程绑定到此监听的套接字上。本发明方法采用父子进程传递描述符方案,这种升级方式适用于进程的工作模式是父子进程的模式,父进程负责接受管理面的指令,即接受外界的管理指令(例如重启指令),并管理子进程。子进程负责具体处理请求逻辑。一般父进程被称为master,子进程被称为worker。
26.应用层通过传输层进行数据通信时,tcp(transmission control protocol,传输控制协议)和udp(user datagram protocol,用户数据报协议)会遇到同时为多个应用程序进程提供并发服务的问题。多个tcp连接或多个应用程序进程可能需要通过同一个tcp协议端口传输数据。为了区别不同的应用程序进程和连接,操作系统为应用程序与tcp/ip协议交互提供了称为套接字(socket)的接口,区分不同应用程序进程间的网络通信和连接。
27.本发明只需要在用户态启动新的进程时调用同一个套接字的接口就可以保证用户态下实现多个进程绑定到监听的套接字上。下文将对本发明方法的具体过程进行详细阐述,为使内容理解充分,首先对出现的主要英文注释的含义进行解释:
28.信号(signal)是linux系统中进程之间通信(ipc)的一种常见方式。通过这个信号向进程发出指令;
29.sigterm:进程终止信号,效果等同于linux中,不带-9的kill命令;
30.sig_usr1:保留给用户使用的信号;
31.sig_usr2:同sigusr1,保留给用户使用的信号;
32.winch和usr1这两个信号,发送这两个信号时它们分别表示优雅停止和优雅重启。
33.hup:中断信号,hup中断信号的对应操作为让进程挂起,睡眠;当发送一个挂起信号(信号1或hup)时,大多数服务器进程(所有常用的进程)都会进行复位操作并重新加载它们的配置文件;
34.term:中断信号,term中断信号的对应操作为正常的退出进程。
35.如图1所示,本发明方法的具体更新升级的过程如下:
36.步骤1、当正在运行的父进程接收控制程序的优雅升级指令时,将新的执行程序替换旧的文件位置。
37.步骤2、向master进程发送sig_usr2信号,清除所有套接字描述符的fd_cloexec标志(如果对描述符设置了fd_cloexec标志,即表示使用exec执行的程序里,此描述符被关闭,不能再使用它,但是在使用fork调用的子进程中,此描述符并不关闭,仍可使用),然后fork() exec()新的执行程序,将老master的套接字描述符通过环境变量传给新master,并由新的执行程序派生新的worker子进程。
38.父进程一般会调用fork函数来执行一个子进程,子进程调用exec()执行其他程序,这时候可能就导致子进程中存在一些无用的文件描述符问题。
39.父进程在fork函数的时候,子进程会拷贝跟父进程一样的地址空间,包括寄存器、文件描述符、堆、栈等。在一开始,父进程与子进程的文件描述符指向的是系统文件表中的同一项(包括文件状态,和文件偏移量)。
40.当利用exec执行其他程序的时候,全新的程序会替换子进程中的地址空间、数据段和堆栈,此时保存与父进程文件描述符也就不存在了,也无法进行关闭,这时候就需要fd_cloexec,表示子进程在执行exec的时候,该文件描述符就需要进行关闭。
41.步骤3、当一个新的请求到达时,所有的worker进程(包括新的和老的)都能接受请求。老的master向它所有的worker进程发送winch信号(优雅停止),通知它们不再接受请求并执行完当前请求后退出。
42.步骤4、老的worker逐个执行完请求后退出,此过程中老的master一直存在,以防止新的执行程序有问题存在时可选择处理,具体地:
43.a)发送hup到老的master,老的master将派生worker进程(老执行程序)并接收请求,同时通知新master及worker优雅退出;
44.linux中如果想要更改配置而不需停止并重新启动服务,则使用该命令。
45.b)发送term信号到新的master,则新master通知新的worker立即退出,并且新master也立即退出。老master派生出worker继续处理请求。
46.linux中终止进程,软件终止信号。
47.步骤5、更新完成后,老master进程退出,新master继续运行。这样就完成了一次控制程序的优雅升级。
48.本发明方法使用程序调用linux操作系统命令,让监听的套接字在内核态只有一个,而用户态下能有多个进程绑定到此监听的套接字上。只需要在用户态启动新的进程时调用同一个套接字的接口就可以保证了。
49.以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的工作人员在本发明揭露的技术范围内,可轻易想到各种等效的修改或替换,这些修改或替换都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献