CN109597631B - 一种进程的升级方法、装置及电子设备 - Google Patents

一种进程的升级方法、装置及电子设备 Download PDF

Info

Publication number
CN109597631B
CN109597631B CN201710900544.7A CN201710900544A CN109597631B CN 109597631 B CN109597631 B CN 109597631B CN 201710900544 A CN201710900544 A CN 201710900544A CN 109597631 B CN109597631 B CN 109597631B
Authority
CN
China
Prior art keywords
kernel
new version
dynamic library
redis
function
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
CN201710900544.7A
Other languages
English (en)
Other versions
CN109597631A (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.)
Alibaba Group Holding Ltd
Original Assignee
Alibaba Group Holding 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 Alibaba Group Holding Ltd filed Critical Alibaba Group Holding Ltd
Priority to CN201710900544.7A priority Critical patent/CN109597631B/zh
Publication of CN109597631A publication Critical patent/CN109597631A/zh
Application granted granted Critical
Publication of CN109597631B publication Critical patent/CN109597631B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/65Updates
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/71Version control; Configuration management

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本申请提供一种进程的升级方法、装置及电子设备;Redis进程的升级方法包括:确定升级后,退出当前版本内核对应的动态库的异步事件循环;其中,所述动态库包含Redis进程的各业务逻辑;将当前Redis实例中的内核环境数据传给新版本内核;触发新版本内核使用所述内核环境数据进行初始化;进入新版本内核对应的动态库中的异步事件循环。本申请至少一个实施例可以实现进程的热升级。

Description

一种进程的升级方法、装置及电子设备
技术领域
本发明涉及计算机领域,尤其涉及一种进程的升级方法、装置及电子设备。
背景技术
通常,用户总是希望服务能保持稳定,永远不需要重启。但是软件的功能总是在不断的丰富。当用户发现有一些新功能是需要的,就会主动要求升级;当有严重安全问题出现时,用户就不得不接受强制升级。
一般的升级过程,总是需要重启服务,对用户而言,就有短时间的服务不可用状态存在。如果通过部署新旧两套系统进行切换的方式实现热升级的话,不仅存在额外一套系统的开销,而且在切换过程中还是会有部分服务链接会被断掉或者重置。
Redis是开源的高性能的键值对(Key-Value)数据库,所有数据都保存在内存中;目前,Redis进程的升级一般有如下三种方案:
(1)停机升级:当需要升级时,停止当前Redis进程,使用新的执行程序重启Redis进程,加载数据,加载完毕后对外提供服务。
该方案的缺陷在于:在程序重启期间,一切服务停止,用户的连接也会被断掉;也就是说在旧服务停止和新服务启动完毕之间,服务不可用。
(2)代理(proxy)升级方案:在Redis进程之上,封装一层proxy,用户连接到proxy,用户的请求通过proxy再传输到Redis进程。当升级时,使用新的执行程序启动一个新的Redis进程,加载数据。新的Redis进程数据加载完毕后,proxy断掉与旧Redis进程的连接,改为连接新的Redis进程提供服务,杀掉老的Redis进程。
该方案的缺陷在于:虽然可以做到几乎没有停止服务的时间,但是在中间状态会有两个Redis进程同时存在,新进程启动时与老进程进行数据同步会有网络,磁盘等资源的消耗,增加了系统负担,在切换时用户的连接会话会被重置。
(3)传统Linux进程热升级技术:通过加载动态库的方式进行,动态的使用新的动态库中的功能函数替换旧的功能函数,进程无需重启。
该方案的缺陷在于:使用场景受限,仅能替换部分数据无关的功能函数,无法处理涉及到进程当前业务数据的功能函数的替换,也无法应对业务数据的变化和业务流程的变化。
发明内容
本申请提供一种进程的升级方法、装置及电子设备,可以实现进程热升级。
本申请采用如下技术方案。
一种Redis进程的升级方法,包括:
确定升级后,退出当前版本内核对应的动态库的异步事件循环;其中,所述动态库包含Redis进程的各业务逻辑;
将当前Redis实例中的内核环境数据传给新版本内核;
触发新版本内核使用所述内核环境数据进行初始化;
进入新版本内核对应的动态库中的异步事件循环。
其中,所述将当前Redis实例中的内核环境数据传给新版本内核可以包括:
获取当前Redis实例中的内核环境数据;
通过试运行的方式验证所获取的内核环境数据是否符合新版本内核的升级要求;
如果符合,则关闭当前版本内核对应的动态库中创建的后台线程任务和Lua环境;将所获取的内核环境数据传给新版本内核。
其中,所述进入新版本内核对应的动态库中的异步事件循环前还可以包括:
释放已传给新版本内核的内核环境数据,释放当前版本内核对应的动态库。
其中,所述内核环境数据可以包括:
业务逻辑所需的全局变量和静态变量、用户数据、后台线程任务、已缓存的Lua脚本。
其中,所述新版本内核使用所述内核环境数据进行初始化可以包括:
触发新版本内核复制或重设全局变量和函数,浅拷贝实例数据,重设对象中的函数指针,重新绑定文件/时间处理函数,重启后台线程任务,重启Lua环境。
其中,所述重设对象中的函数指针可以包括:
将每个事件处理函数指针对应的函数名称记录在事件函数表里;
分别根据各文件描述符上的事件处理函数指针在事件函数表里查出函数名称,再根据函数名称,将事件处理函数指针改成指向新版本内核对应的动态库中相应的函数。
其中,所述重设对象中的函数指针可以包括:
将字典或列表函数对应的包装函数的函数指针,改成指向新版本内核对应的动态库中相应的函数;其中,所述字典或列表函数都指向对应的包装函数。
一种Redis进程的升级装置,包括:
触发模块,用于确定升级后,退出当前版本内核对应的动态库的异步事件循环;其中,所述动态库包含Redis进程的各业务逻辑;
传递模块,用于将当前Redis实例中的内核环境数据传给新版本内核;
初始化模块,用于触发新版本内核使用所述内核环境数据进行初始化;
启动模块,用于进入新版本内核对应的动态库中的异步事件循环。
其中,所述传递模块将当前Redis实例中的内核环境数据传给新版本内核可以包括:
所述传递模块获取当前Redis实例中的内核环境数据;通过试运行的方式验证所获取的内核环境数据是否符合新版本内核的升级要求;如果符合,则关闭当前版本内核对应的动态库中创建的后台线程任务和Lua环境;将所获取的内核环境数据传给新版本内核。
其中,所述的升级装置还可以包括:
释放模块,用于在所述启动模块进入新版本内核对应的动态库中的异步事件循环前,释放已传给新版本内核的内核环境数据,释放当前版本内核对应的动态库。
其中,所述内核环境数据可以包括:
业务逻辑所需的全局变量和静态变量、用户数据、后台线程任务、已缓存的Lua脚本。
其中,所述初始化模块触发新版本内核使用所述内核环境数据进行初始化可以包括:
所述初始化模块触发新版本内核复制或重设全局变量和函数,浅拷贝实例数据,重设对象中的函数指针,重新绑定文件/时间处理函数,重启后台线程任务,重启Lua环境。
其中,所述重设对象中的函数指针可以包括:
将每个事件处理函数指针对应的函数名称记录在事件函数表里;
分别根据各文件描述符上的事件处理函数指针在事件函数表里查出函数名称,再根据函数名称,将事件处理函数指针改成指向新版本内核对应的动态库中相应的函数。
其中,所述重设对象中的函数指针可以包括:
将字典或列表函数对应的包装函数的函数指针,改成指向新版本内核对应的动态库中相应的函数;其中,所述字典或列表函数都指向对应的包装函数。
一种进行Redis进程升级的电子设备,包括:存储器和处理器;
所述存储器用于保存用于进行Redis进程升级的程序;所述用于进行Redis进程升级的程序在被所述处理器读取执行时,执行以下操作:
确定升级后,退出当前版本内核对应的动态库的异步事件循环;其中,所述动态库包含Redis进程的各业务逻辑;
将当前Redis实例中的内核环境数据传给新版本内核;
触发新版本内核使用所述内核环境数据进行初始化;
进入新版本内核对应的动态库中的异步事件循环。
一种进程的升级方法,包括:
退出当前版本内核对应的动态库的异步事件循环;其中,所述动态库包含所述进程的各业务逻辑;
将当前实例中的内核环境数据传给新版本内核;
触发新版本内核使用所述内核环境数据进行初始化;
进入新版本内核对应的动态库中的异步事件循环。
本申请包括以下优点:
本申请至少一个实施例能够对Redis进程或其它进程进行热升级,可以完全避免停机和服务进程切换,做到升级过程用户完全无感知,系统也没有额外开销,而且不同于Linux热升级技术中简单修补的做法,本申请至少一个实施例甚至可以改变进程的业务逻辑、功能等,只要保持数据的格式不变即可。
当然,实施本申请的任一产品并不一定需要同时达到以上所述的所有优点。
附图说明
图1是实施例一的Redis进程的升级方法的流程图;
图2是实施例一的例子中升级Redis进程的流程图;
图3是实施例一的例子中runRedis的示意图;
图4是实施例二的Redis进程的升级装置的示意图。
具体实施方式
下面将结合附图及实施例对本申请的技术方案进行更详细的说明。
需要说明的是,如果不冲突,本申请实施例以及实现方式中的不同特征可以相互结合,均在本申请的保护范围之内。另外,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
在一种配置中,进行Redis升级的计算设备可包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存(memory)。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。内存可能包括一个或多个模块。
计算机可读介质包括永久性和非永久性、可移动和非可移动存储介质,可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM),快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。
先简要介绍一下本文中出现的概念。
Redis进程可以是指当Redis程序被启动时,操作系统所创建的进程;进程可看成是是程序的实体,或看成是线程的容器。
内核可以是指相应软件(比如Redis程序)中最核心的功能框架部分,它是实现该软件所有功能的基础。
动态库又可以称为动态链接库(Dynamic Link Library),是一种共享库,可以包含可由多个程序共同使用的代码、函数和数据等;在Redis中动态库的后缀名一般为.so。
异步事件可以是指断断续续,随机,没有时序关系的事件;异步事件循环是Redis中的一种机制,可以通过调用Redis中的异步事件主函数(aeMain)来进入异步事件循环,等待外部事件的发生;aeMain函数可以看成是一个封装的实现while循环的代码,循环中的代码会一直运行直到异步事件循环的停止“stop”标识被设置为“true”。
一个Redis实例可以是指一个Redis进程或者一个Redis服务的实体。
实施例一、一种Redis进程的升级方法,如图1所示,包括步骤S110~S140:
S110、确定升级后,退出当前版本内核对应的动态库的异步事件循环;其中,所述动态库包含Redis进程的各业务逻辑;
S120、将当前Redis实例中的内核环境数据传给新版本内核;
S130、触发新版本内核使用所述内核环境数据进行初始化;
S140、进入新版本内核对应的动态库中的异步事件循环。
本实施例可以实现Redis进程的热升级;热升级是指程序/服务在不停止的前提下,通过增加/修改/删除相关功能模块,达到功能升级的目的。一般也叫不停机升级,或者不停机热升级。
目前,Redis是将所有的代码都编译到可执行文件(比如redis-sever.exe)中,而本实施例中则将Redis的业务逻辑都封装到内核对应的动态库(比如libredis-server.so)中,main函数只做装载动态库和热升级调度相关操作,可执行文件的部分尽量薄,业务逻辑都放到动态库中,从而可以扩大热升级所能升级的功能范围。
一种实现方式中,确定升级可以是指收到升级指令。
本实现方式中,用户可以通过在客户端发送升级指令的方式手动触发重新装载动态库,无需重启完成内核的升级;通过加载新版本内核对应的动态库,可以达到用新的功能模块代替旧的功能模块的目的。
本实现方式中,可以在升级指令中包含新版本内核,也可以预先上传和保存新版本内核,在升级指令中指定要升级到哪个新版本内核;所还可以在发送升级指令之后上传新版本内核。
其它实现方式中,也可以通过其它方式确定升级,比如某个预设条件满足后,再比如收到新版本内核等。
本实施例中,上述步骤S110~S120可以通过热升级代码实现,该热升级代码当确定升级时,会跳出当前版本内核对应的异步事件循环,打开新版本内核对应的动态库,并将当前Redis实例中的内核环境数据传给新版本内核。
本实施例中,将当前Redis实例中的内核环境数据传给新版本内核时可以分成以下两步,分别通过当前版本和新版本内核对应的动态库中的函数实现:
获取当前Redis实例中的内核环境数据;
将所获取的内核环境数据传给新版本内核。
一种实现方式中,所述将当前Redis实例中的内核环境数据传给新版本内核可以包括:
获取当前Redis实例中的内核环境数据;
通过试运行的方式验证所获取的内核环境数据是否符合新版本内核的升级要求;
如果符合,则关闭当前版本内核对应的动态库中创建的后台线程任务和Lua环境;将所获取的内核环境数据传给新版本内核。
本实现方式中,如果所获取的内核环境数据不符合新版本内核的升级要求,则可以继续以当前版本的代码运行Redis进程,也可以停止Redis进程,返回出错信息。
其它实现方式中,也可以默认所获取的内核环境数据必然符合新版本内核的升级要求,而不进行该判断。
一种实现方式中,所述进入新版本内核对应的动态库中的异步事件循环前还可以包括:
释放已传给新版本内核的内核环境数据,释放当前版本内核对应的动态库。
本实现方式中,可以释放当前版本内核所占用的资源;其它实现方式中,也可以暂时保留当前版本内核对应的动态库和内核环境数据,如果新版本内核运行出错时,可以切换回当前版本内核。
一种实现方式中,所述内核环境数据可以包括:
业务逻辑所需的全局变量和静态变量、用户数据、后台线程任务、已缓存的Lua脚本。
其它实现方式中,也可以根据实际情况设置内核环境数据所包括的内容。
本实现方式中,所述新版本内核使用所述内核环境数据进行初始化可以包括:
复制或重设全局变量和函数,浅拷贝实例数据,重设对象中的函数指针,重新绑定文件/时间处理函数,重启后台线程任务,重启Lua环境。
其它实现方式中,如果内核环境数据所包括的内容不同于本实现方式,则初始化所包含的操作也会相应调整。
一种实现方式中,所述重设对象中的函数指针可以包括:
将每个事件处理函数指针对应的函数名称记录在事件函数表里;
分别根据各文件描述符上的事件处理函数指针在事件函数表里查出函数名称,再根据函数名称,将事件处理函数指针改成指向新版本内核对应的动态库中相应的函数。
其它实现方式中,也可以采用其它方式来重设事件处理函数指针。
一种实现方式中,所述重设对象中的函数指针可以包括:
将字典或列表函数对应的包装函数的函数指针,改成指向新版本内核对应的动态库中相应的函数;其中,所述字典或列表函数都指向对应的包装函数。
其它实现方式中,也可以采用其它方式来重设字典或列表函数的指针。
下面用一个例子说明本实施例。本例中,通过接收到用户发送的升级指令来确定升级,触发执行热升级代码,完成Redis进程的热升级过程。
本例子中,Redis进程热升级的过程如图2所示,包括步骤201~207:
201、Redis进程正常运行时收到客户端发来的升级指令,本例中可以是updateRedis targetVersion命令;
202、退出当前版本内核的异步事件主函数(aeMain)中的异步事件循环(aeloop),打开新版本内核对应的动态库new_so,可以通过dlopen(new_so)打开new_so;
203、获取当前Redis实例中的内核环境数据,包括:数据对象和环境变量;本例中可以通过当前版本内核中的函数void*data=getRedisDataForUpdate()获取上述内核环境数据;
204、通过试运行的方式验证所获取的内核环境数据是否符合新版本的内核升级要求;本例中可以调用新版本动态库中的接口函数dryRunUpdateRedis(data)来进行试运行;
若不符合,Redis进程继续以当前版本的代码运行;
若符合,则关闭当前版本内核对应的动态库old_so中创建的后台线程和Lua环境;将所获取的内核环境数据传给新版本的内核,本例中通过调用新版本内核对应的动态库中的updateRedis(void*data)实现;进行步骤205;
205、新版本内核使用所述内核环境数据(old_data)进行初始化,过程包括复制或重设全局变量和函数,浅拷贝实例数据,重设对象中的函数指针,重新绑定文件/时间处理函数,重启后台线程任务,重启Lua环境。
206、释放当前版本的内核环境数据,释放当前版本内核对应的动态库;比如通过以下函数实现本步骤:
freeRedisDataAfterUpdate(old_data);
dlclose(old_so);
这两个函数也是当前版本(即更新前的版本)内核中的。
207、进入新版本内核对应的动态库中的ae loop,完成整个热升级动作;此时的runRedis是新版本内核中的函数,由其中的aeMain函数进行ae loop。
本例中,步骤201前还可以包括:
打开当前版本内核对应的动态库old_so,当前版本内核启动Redis,比如通过以下语句实现:
dlopen(old_so);
dlsym(old_so,runRedis)
这样可以开始运行当前版本内核中的runRedis。
另外,本例中还可以通过当前版本内核中的函数进行初始化,包括:
初始化Redis数据函数包装表(initRedisDataFuncWrapperTable);
初始化Redis数据函数接口表(initRedisDataFuncImplTable);
初始化Redis(initRedis)。
本例中,在步骤205前还可以包括:
在更新前清除环境(clearEnvironmentBeforeUpdate);比如可以通过当前版本内核的函数实现:safelyKillBioThreads和scriptingClose。
本例中,步骤205由新版本内核的函数实现,可以包括:
初始化Redis数据函数接口表(initRedisDataFuncImplTable);
采用内核环境数据(old_data)更新Redis(updateRedis(old_data)),即步骤205中的初始化新版本内核,包括:
初始化或重设全局变量或函数(init/resetGlobalVar/Func);
浅拷贝实例数据(shallow copy old data);
重设对象中的函数指针,包括重设字典/列表类型函数(resetDict/ListTypeFunc);
重新绑定文件/时间处理函数(rebindFile/TimeEventProc);
重启后台线程任务(restartBioThreads);
重启Lua环境(restartScripting)。
本例中,当前版本和新版本的runRedis函数中可以均包含异步事件主函数aemain,aemain中的逻辑如图3所示,包括步骤301~303:
301、判断是否停止事件循环(!eventloop->stop),如果不停止(!stop),则进行步骤302;
302、处理事件(aeProcessEvents);
303、如果收到升级指令(updateRedisCommand),则跳出ae loop(aeStop),如果没收到则返回步骤301。
步骤203中,可以通过void*data=getRedisDataForUpdate()获取上述内核环境数据。
其中,所述内核环境数据包括当前Redis实例中的数据对象和环境变量,具体可以包括:
(1)业务逻辑所需的全局变量和静态变量,比如dict_hash_function_seed,zmalloc_thread_safe等,可以是通过全局grep extern,static等关键字搜索到的结果;
(2)用户数据,比如可以是通过redisServer变量搜索到的结果;
(3)后台线程任务,比如可以是bio_jobs等;
(4)已缓存的Lua脚本,比如可以是script_dicts等。
本例中,新版本的内核复制数据时,按照以下原则进行复制:
简单变量采用值拷贝方式进行复制,数组通过memcpy函数复制,动态分配的变量采用浅拷贝方式进行复制。
其中,memcpy函数是c和c++使用的内存拷贝函数,memcpy函数的功能是从源所指的内存地址的起始位置开始复制一定数量的字节到目标所指的内存地址的起始位置中。
本例中,在执行热升级代码之前,必须关闭后台线程,因此需要将后台线程任务保存在新版本内核中,比如可以保存为任务队列的形式;在新版本内核启动后,使用所保存的任务队列重新开始后台线程。
本例中,热升级时支持Lua版本的升级,具体实现方式为保留已缓存的Lua脚本,比如script_dict,关闭当前版本的Lua虚拟机,在新版本中新建Lua虚拟机之后,将script_dict浅拷贝过来,并重新创建全局函数。全局函数是指Redis除了在script_dict中缓存的每个Lua脚本之外,还会在Lua环境中对应的建立一个名为f_[脚本SHA1值]的全局函数。新版本内核除了保留script_dict之外,还需要对应的为每个脚本重新创建全局函数。
除了全局变量和静态变量之外,Redis的数据中还存在大量的函数指针。这些函数指针指向当前版本内核对应的动态库的函数,因此在当前版本内核对应的动态库关闭之后将会失效,需要在热升级过程中替换为新版本中相应的函数。
这些函数指针包括两类:
(1)事件处理函数指针,所述事件包括文件描述符(fd)事件、定时器事件。
ae loop中有多种事件处理函数,由于相同类型的fd上可能绑定不同的事件处理函数,无法通过fd名称或者类型来追踪事件处理函数,因此必须要额外将每个事件处理函数指针对应的函数名称记录在事件函数表里;
在热升级过程中,新版本内核根据当前fd上的事件处理函数指针在事件函数表里查出函数名称,再根据函数名称,将事件处理函数指针改成指向新版本内核对应的动态库中相应的函数。
(2)字典(dict)、列表(list)中的函数指针;
dict和list是Redis中的两种基本数据结构,它们的结构定义中都包含了一系列的函数指针用于查找/复制/释放数据,而这些函数指针指向的大部分是动态库内部的函数,因此需要在升级过程中动态的替换掉这些函数。
这两种数据结构在Redis中使用的非常广泛,导致追踪所有的dict,list类型数据变得异常困难和低效。然而,这些函数指针的种类实际上并不是很多,最多的list free函数也只有decrRefCountVoid,freePubsubPattern,slowlogFreeEntry,zfree,sdsfree这五种,因此可以在源代码文件(比如本例是redis-server.c)中预先定义一些包装(wrapper)函数,比如可以包括分别对应于dictType、listDupFunc、listFreeFunc、listMatchFunc函数的包装函数:dictTypeWrapper、listDupFuncWrappe、listFreeFuncWrapper、listMatchFunc Wrapper。其中,wrapper函数的实现可以由内核对应的动态库中实现的初始化Redis数据函数接口表(initRedisDataFuncImplTable)填充。
本例中,dictType、listDupFunc、listFreeFunc、listMatchFunc函数在创建时都指向对应的wrapper函数,这些wrapper函数在热升级过程中是不变的,所以只需要更新有限的几个wrapper函数内部的接口(impl)函数指针(将函数指针改成指向新版本内核对应的动态库中相应的函数)即可,而无需为每个dict,list更新对应的函数指针。
本例中,在源代码文件中定义包装(wrapper)函数的代码可参见下文:
Figure BDA0001423045640000141
Figure BDA0001423045640000151
本例可以平滑地将当前版本的Redis服务的数据无缝的切换到新版本上;通过对流程的改造和涉及到数据及其处理流程的设计,突破了传统linux进程热升级只能替换独立功能(与当前数据,业务状态)无关功能模块的限制,达到无缝热升级,用户无感知的目的。
实施例二、一种Redis进程的升级装置,如图4所示,包括:
触发模块41,用于确定升级后,退出当前版本内核对应的动态库的异步事件循环;其中,所述动态库包含Redis进程的各业务逻辑;
传递模块42,用于将当前Redis实例中的内核环境数据传给新版本内核;
初始化模块43,用于触发新版本内核使用所述内核环境数据进行初始化;
启动模块44,用于进入新版本内核对应的动态库中的异步事件循环。
本实施例中,所述触发模块41是上述升级装置中负责在确定升级后退出当前版本内核的ae loop的部分,可以是软件、硬件或两者的结合。
本实施例中,所述传递模块42是上述升级装置中负责传递内核环境数据到新版本内核的部分,可以是软件、硬件或两者的结合。
本实施例中,所述初始化模块43是上述升级装置中负责触发新版本内核进行初始化的部分,可以是软件、硬件或两者的结合。
本实施例中,所述启动模块44是上述升级装置中负责进入新版本内核的ae loop的部分,可以是软件、硬件或两者的结合。
一种实现方式中,所述传递模块将当前Redis实例中的内核环境数据传给新版本内核可以包括:
所述传递模块获取当前Redis实例中的内核环境数据;通过试运行的方式验证所获取的内核环境数据是否符合新版本内核的升级要求;如果符合,则关闭当前版本内核对应的动态库中创建的后台线程任务和Lua环境;将所获取的内核环境数据传给新版本内核。
一种实现方式中,所述的升级装置还可以包括:
释放模块,用于在所述启动模块进入新版本内核对应的动态库中的异步事件循环前,释放已传给新版本内核的内核环境数据,释放当前版本内核对应的动态库。
一种实现方式中,所述内核环境数据可以包括:
业务逻辑所需的全局变量和静态变量、用户数据、后台线程任务、已缓存的Lua脚本。
本实现方式中,所述初始化模块触发新版本内核使用所述内核环境数据进行初始化可以包括:
所述初始化模块触发新版本内核复制或重设全局变量和函数,浅拷贝实例数据,重设对象中的函数指针,重新绑定文件/时间处理函数,重启后台线程任务,重启Lua环境。
其中,所述重设对象中的函数指针可以包括:
将每个事件处理函数指针对应的函数名称记录在事件函数表里;
分别根据各文件描述符上的事件处理函数指针在事件函数表里查出函数名称,再根据函数名称,将事件处理函数指针改成指向新版本内核对应的动态库中相应的函数。
其中,所述重设对象中的函数指针可以包括:
将字典或列表函数对应的包装函数的函数指针,改成指向新版本内核对应的动态库中相应的函数;其中,所述字典或列表函数都指向对应的包装函数。
本实施例中,Redis进程的升级装置的各模块的操作可以分别对应于实施例一中的步骤S110~S140,各模块操作的其它实现细节可参见实施例一。
实施例三、一种进行Redis进程升级的电子设备,包括:存储器和处理器;
所述存储器用于保存用于进行Redis进程升级的程序;所述用于进行Redis进程升级的程序在被所述处理器读取执行时,执行以下操作:
确定升级后,退出当前版本内核对应的动态库的异步事件循环;其中,所述动态库包含Redis进程的各业务逻辑;
将当前Redis实例中的内核环境数据传给新版本内核;
触发新版本内核使用所述内核环境数据进行初始化;
进入新版本内核对应的动态库中的异步事件循环。
一种实现方式中,所述将当前Redis实例中的内核环境数据传给新版本内核可以包括:
获取当前Redis实例中的内核环境数据;
通过试运行的方式验证所获取的内核环境数据是否符合新版本内核的升级要求;
如果符合,则关闭当前版本内核对应的动态库中创建的后台线程任务和Lua环境;将所获取的内核环境数据传给新版本内核。
一种实现方式中,所述用于进行Redis进程升级的程序在被所述处理器读取执行时,在进入新版本内核对应的动态库中的异步事件循环前还可以执行以下操作:
释放已传给新版本内核的内核环境数据,释放当前版本内核对应的动态库。
一种实现方式中,所述内核环境数据可以包括:
业务逻辑所需的全局变量和静态变量、用户数据、后台线程任务、已缓存的Lua脚本。
本实现方式中,所述触发新版本内核使用所述内核环境数据进行初始化可以包括:
触发新版本内核复制或重设全局变量和函数,浅拷贝实例数据,重设对象中的函数指针,重新绑定文件/时间处理函数,重启后台线程任务,重启Lua环境。
其中,所述重设对象中的函数指针可以包括:
将每个事件处理函数指针对应的函数名称记录在事件函数表里;
分别根据各文件描述符上的事件处理函数指针在事件函数表里查出函数名称,再根据函数名称,将事件处理函数指针改成指向新版本内核对应的动态库中相应的函数。
其中,所述重设对象中的函数指针可以包括:
将字典或列表函数对应的包装函数的函数指针,改成指向新版本内核对应的动态库中相应的函数;其中,所述字典或列表函数都指向对应的包装函数。
本实施例中,所述用于进行Redis进程升级的程序在被所述处理器读取执行时,所执行的操作对应于实施例一中的步骤S110~S140;该程序所执行的操作的其它细节可参见实施例一。
实施例四、一种进程的升级方法,包括:
退出当前版本内核对应的动态库的异步事件循环;其中,所述动态库包含所述进程的各业务逻辑;
将当前实例中的内核环境数据传给新版本内核;
触发新版本内核使用所述内核环境数据进行初始化;
进入新版本内核对应的动态库中的异步事件循环。
本实施例中,所述进程可以但不限于包括Redis进程等;当所述进程为Redis进程时,其它实现细节可参考实施例一。
本领域普通技术人员可以理解上述方法中的全部或部分步骤可通过程序来指令相关硬件完成,所述程序可以存储于计算机可读存储介质中,如只读存储器、磁盘或光盘等。可选地,上述实施例的全部或部分步骤也可以使用一个或多个集成电路来实现。相应地,上述实施例中的各模块/单元可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。本申请不限制于任何特定形式的硬件和软件的结合。
当然,本申请还可有其他多种实施例,在不背离本申请精神及其实质的情况下,熟悉本领域的技术人员当可根据本申请作出各种相应的改变和变形,但这些相应的改变和变形都应属于本申请的权利要求的保护范围。

Claims (10)

1.一种Redis进程的升级方法,包括:
确定升级后,退出当前版本内核对应的动态库的异步事件循环;其中,所述动态库包含Redis进程的各业务逻辑;
将当前Redis实例中的内核环境数据传给新版本内核;
触发新版本内核使用所述内核环境数据进行初始化;
进入新版本内核对应的动态库中的异步事件循环。
2.如权利要求1所述的升级方法,其特征在于,所述将当前Redis实例中的内核环境数据传给新版本内核包括:
获取当前Redis实例中的内核环境数据;
通过试运行的方式验证所获取的内核环境数据是否符合新版本内核的升级要求;
如果符合,则关闭当前版本内核对应的动态库中创建的后台线程任务和Lua环境;将所获取的内核环境数据传给新版本内核。
3.如权利要求1所述的升级方法,其特征在于,所述进入新版本内核对应的动态库中的异步事件循环前还包括:
释放已传给新版本内核的内核环境数据,释放当前版本内核对应的动态库。
4.如权利要求1所述的升级方法,其特征在于,所述内核环境数据包括:
业务逻辑所需的全局变量和静态变量、用户数据、后台线程任务、已缓存的Lua脚本。
5.如权利要求4所述的升级方法,其特征在于,所述新版本内核使用所述内核环境数据进行初始化包括:
触发新版本内核复制或重设全局变量和函数,浅拷贝实例数据,重设对象中的函数指针,重新绑定文件/时间处理函数,重启后台线程任务,重启Lua环境。
6.如权利要求5所述的升级方法,其特征在于,所述重设对象中的函数指针包括:
将每个事件处理函数指针对应的函数名称记录在事件函数表里;
分别根据各文件描述符上的事件处理函数指针在事件函数表里查出函数名称,再根据函数名称,将事件处理函数指针改成指向新版本内核对应的动态库中相应的函数。
7.如权利要求5所述的升级方法,其特征在于,所述重设对象中的函数指针包括:
将字典或列表函数对应的包装函数的函数指针,改成指向新版本内核对应的动态库中相应的函数;其中,所述字典或列表函数都指向对应的包装函数。
8.一种Redis进程的升级装置,其特征在于,包括:
触发模块,用于确定升级后,退出当前版本内核对应的动态库的异步事件循环;其中,所述动态库包含Redis进程的各业务逻辑;
传递模块,用于将当前Redis实例中的内核环境数据传给新版本内核;
初始化模块,用于触发新版本内核使用所述内核环境数据进行初始化;
启动模块,用于进入新版本内核对应的动态库中的异步事件循环。
9.一种进行Redis进程升级的电子设备,包括:存储器和处理器;
其特征在于:
所述存储器用于保存用于进行Redis进程升级的程序;所述用于进行Redis进程升级的程序在被所述处理器读取执行时,执行以下操作:
确定升级后,退出当前版本内核对应的动态库的异步事件循环;其中,所述动态库包含Redis进程的各业务逻辑;
将当前Redis实例中的内核环境数据传给新版本内核;
触发新版本内核使用所述内核环境数据进行初始化;
进入新版本内核对应的动态库中的异步事件循环。
10.一种进程的升级方法,包括:
退出当前版本内核对应的动态库的异步事件循环;其中,所述动态库包含所述进程的各业务逻辑;
将当前实例中的内核环境数据传给新版本内核;
触发新版本内核使用所述内核环境数据进行初始化;
进入新版本内核对应的动态库中的异步事件循环。
CN201710900544.7A 2017-09-28 2017-09-28 一种进程的升级方法、装置及电子设备 Active CN109597631B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201710900544.7A CN109597631B (zh) 2017-09-28 2017-09-28 一种进程的升级方法、装置及电子设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201710900544.7A CN109597631B (zh) 2017-09-28 2017-09-28 一种进程的升级方法、装置及电子设备

Publications (2)

Publication Number Publication Date
CN109597631A CN109597631A (zh) 2019-04-09
CN109597631B true CN109597631B (zh) 2022-04-05

Family

ID=65955461

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201710900544.7A Active CN109597631B (zh) 2017-09-28 2017-09-28 一种进程的升级方法、装置及电子设备

Country Status (1)

Country Link
CN (1) CN109597631B (zh)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112333471A (zh) * 2020-11-05 2021-02-05 上海网达软件股份有限公司 音视频在线转码器的热升级方法、装置、设备及存储介质
US20220147636A1 (en) * 2020-11-12 2022-05-12 Crowdstrike, Inc. Zero-touch security sensor updates
CN113296822B (zh) * 2021-05-27 2023-11-03 北京思特奇信息技术股份有限公司 一种基于动态库的数据库系统在线升级方法和系统
CN113535215B (zh) * 2021-07-20 2024-05-28 抖音视界有限公司 一种虚拟机热升级方法、装置、设备以及存储介质
CN117806686A (zh) * 2022-09-26 2024-04-02 华为技术有限公司 应用程序的更新方法、装置、设备及计算机可读存储介质

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101964725A (zh) * 2010-09-01 2011-02-02 中兴通讯股份有限公司 业务不中断升级的方法和系统
CN102508713A (zh) * 2011-10-12 2012-06-20 杭州华三通信技术有限公司 进程启动方法及内核、进程
CN105159738A (zh) * 2015-08-20 2015-12-16 上海斐讯数据通信技术有限公司 一种热补丁实现方法及系统
CN106557347A (zh) * 2016-11-24 2017-04-05 泰康保险集团股份有限公司 软件更新方法及装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8997047B2 (en) * 2012-12-13 2015-03-31 International Business Machines Corporation Dynamically updating code without requiring processes to restart

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101964725A (zh) * 2010-09-01 2011-02-02 中兴通讯股份有限公司 业务不中断升级的方法和系统
CN102508713A (zh) * 2011-10-12 2012-06-20 杭州华三通信技术有限公司 进程启动方法及内核、进程
CN105159738A (zh) * 2015-08-20 2015-12-16 上海斐讯数据通信技术有限公司 一种热补丁实现方法及系统
CN106557347A (zh) * 2016-11-24 2017-04-05 泰康保险集团股份有限公司 软件更新方法及装置

Also Published As

Publication number Publication date
CN109597631A (zh) 2019-04-09

Similar Documents

Publication Publication Date Title
CN109597631B (zh) 一种进程的升级方法、装置及电子设备
CN107636612B (zh) 应用迁移装置、方法与存储介质
US8739147B2 (en) Class isolation to minimize memory usage in a device
US8914785B2 (en) Providing virtual appliance system firmware images
US8032740B2 (en) Update in-use flash memory without external interfaces
JP2022550446A (ja) 個々のアプリケーション用のカスタマイズされたルートプロセス
JP2022550447A (ja) アプリケーションのグループ向けにカスタマイズされたルートプロセス
WO2020019993A1 (en) Virtual machine container for applications
CN111273965B (zh) 一种容器应用启动方法、系统、装置及电子设备
US10552135B1 (en) Reducing a size of an application package
US9032199B1 (en) Systems, devices, and methods for capturing information, creating loadable images, and providing for restarts in a computer system
US11307839B2 (en) Updating of container-based applications
US11720348B2 (en) Computing node allocation based on build process specifications in continuous integration environments
CN113938527B (zh) Api网关的扩展处理方法、计算设备及存储介质
US11461131B2 (en) Hosting virtual machines on a secondary storage system
WO2022140376A1 (en) Software defined build infrastructure for hybrid, virtualized and native build environments
CN113867776A (zh) 中台应用的发布方法、装置、电子设备和存储介质
WO2023138453A1 (zh) 一种容器加载方法及装置
RU2718235C1 (ru) Архитектура операционной системы для обеспечения поддержки поколений микроядер
US11762672B2 (en) Dynamic linker for loading and running an application over a plurality of nodes
CN112948062B (zh) 设备文件的透传方法、设备及计算机存储介质
CN115827120B (zh) 用户态网络栈调用、用户态接口设置方法和装置
CN115543486B (zh) 面向无服务器计算的冷启动延迟优化方法、装置和设备
US20240152371A1 (en) Dynamic re-execution of parts of a containerized application pipeline
EP4290376A1 (en) Reducing deployment time for container clones in computing environments

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant