CN112241398A - 一种数据迁移方法和系统 - Google Patents

一种数据迁移方法和系统 Download PDF

Info

Publication number
CN112241398A
CN112241398A CN201910655766.6A CN201910655766A CN112241398A CN 112241398 A CN112241398 A CN 112241398A CN 201910655766 A CN201910655766 A CN 201910655766A CN 112241398 A CN112241398 A CN 112241398A
Authority
CN
China
Prior art keywords
asynchronous
task
command
data
thread
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.)
Pending
Application number
CN201910655766.6A
Other languages
English (en)
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.)
Beijing Jingdong Century Trading Co Ltd
Beijing Jingdong Shangke Information Technology Co Ltd
Original Assignee
Beijing Jingdong Century Trading Co Ltd
Beijing Jingdong Shangke Information 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 Beijing Jingdong Century Trading Co Ltd, Beijing Jingdong Shangke Information Technology Co Ltd filed Critical Beijing Jingdong Century Trading Co Ltd
Priority to CN201910655766.6A priority Critical patent/CN112241398A/zh
Publication of CN112241398A publication Critical patent/CN112241398A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/21Design, administration or maintenance of databases
    • G06F16/214Database migration support
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4843Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
    • G06F9/4881Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/48Indexing scheme relating to G06F9/48
    • G06F2209/486Scheduler internals

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Databases & Information Systems (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Data Mining & Analysis (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种数据迁移方法和系统,涉及计算机技术领域。该方法的一具体实施方式包括:启动设定数量的异步线程,由至少一个所述异步线程执行异步DUMP命令,以将源数据库的待迁移数据进行序列化,得到序列化对象;由至少一个所述异步线程执行异步RESTORE命令,以将所述序列化对象进行反序列化,将得到的反序列化对象写入目标数据库;删除所述源数据库的待迁移数据,完成数据迁移。该方法通过异步线程执行序列化、反序列化操作,将数据迁移对源数据库和目标数据库的阻塞时间优化至常量时间,避免了待迁移数据的数据量大小对阻塞时间的影响。

Description

一种数据迁移方法和系统
技术领域
本发明涉及计算机领域,尤其涉及一种数据迁移方法和系统。
背景技术
目前在实现Redis数据库的数据迁移时,主要依赖Redis数据库提供的原生命令,包括DUMP命令、RESTORE命令、DEL命令和MIGRATE命令。其中,MIGRATE命令是DUMP命令、RESTORE命令和DEL命令的封装。在迁移的数据量比较大时,DUMP命令中的序列化操作、RESTORE命令中的反序列化操作和内存申请、DEL命令中的内存释放都是比较耗时的操作。由于Redis数据库的原生命令为单线程运行,一旦出现耗时的操作,会导致数据迁移出现阻塞,影响正常业务请求。
现有技术中一般通过下述两种方式节省命令的耗时,方式一:重写DUMP命令和RESTORE命令,修改序列化的方式,提高序列化和反序列化的效率;方式二:模拟Redis主从复制的过程,将从源数据库获取序列化数据的操作在Fork(复刻)出的子进程中完成,与主进程独立,避免了对主进程处理正常业务请求造成影响。
在实现本发明过程中,发明人发现现有技术中至少存在如下问题:
(1)方式一会增加序列化后的字节流的体积,在网络带宽比较小的情况下,会导致网络拥堵;另外,其对序列化和反序列化的处理速度只能提升一个固定比例,由于原处理速度与数据大小基本成正比例关系,随着数据大小的增加,即便是提升后的处理速度,仍旧可能会造成阻塞。
(2)方式二在Fork子进程时,数据库可能会出现短时间阻塞,导致所有访问该数据库的请求耗时出现短时间升高后又快速回落,形成耗时尖刺;另外,在Fork出子进程之后到其被回收期间,如果数据库接收到比较多的写请求,操作系统的内存会出现明显增长,且会产生大量的内存拷贝操作,增加操作系统的负荷;而且其只能解决源数据库阻塞的问题,不能解决目标数据库的阻塞,不适用于使用MIGRATE命令的场景。
发明内容
有鉴于此,本发明实施例提供一种数据迁移方法和系统,通过异步线程执行序列化、反序列化操作,将数据迁移对源数据库和目标数据库的阻塞时间优化至常量时间,避免了待迁移数据的数据量大小对阻塞时间的影响。
为实现上述目的,根据本发明实施例的一个方面,提供了一种数据迁移方法。
本发明实施例的一种数据迁移方法,包括:启动设定数量的异步线程,由至少一个所述异步线程执行异步DUMP命令,以将源数据库的待迁移数据进行序列化,得到序列化对象;由至少一个所述异步线程执行异步RESTORE命令,以将所述序列化对象进行反序列化,将得到的反序列化对象写入目标数据库;删除所述源数据库的待迁移数据,完成数据迁移。
可选地,所述方法还包括:分析数据迁移所使用的原生命令对应的命令实现逻辑,把所述命令实现逻辑中允许同步执行的子逻辑和允许并发执行的子逻辑进行拆分;将允许同步执行的子逻辑作为同步任务分配至主线程,将允许并发执行的子逻辑作为异步任务分配至所述异步线程。
可选地,所述异步DUMP命令的实现逻辑包括:所述主线程创建异步DUMP任务,将所述异步DUMP任务传输至所述异步线程;所述异步线程获取所述异步DUMP任务后,将所述待迁移数据进行序列化,将得到的所述序列化对象传输至所述主线程;所述主线程释放所述异步DUMP任务。
可选地,所述异步DUMP命令的实现逻辑包括:所述主线程计算所述待迁移数据的数据量,判断所述待迁移数据的数据量是否大于等于预设第一阈值;若所述待迁移数据的数据量小于所述第一阈值,则由所述主线程将所述待迁移数据进行序列化;若所述待迁移数据的数据量大于等于所述第一阈值,则由所述主线程创建异步DUMP任务,将所述异步DUMP任务传输至所述异步线程;所述异步线程获取所述异步DUMP任务后,将所述待迁移数据进行序列化,将得到的所述序列化对象传输至所述主线程;所述主线程释放所述异步DUMP任务。
可选地,由所述主线程创建异步DUMP任务的步骤之前,所述异步DUMP命令的实现逻辑,还包括:若所述待迁移数据的数据量大于等于所述第一阈值,则按照预设第一步长,由所述主线程递增所述待迁移数据的引用计数;释放所述异步DUMP任务的步骤之前,所述异步DUMP命令的实现逻辑,还包括:按照所述第一步长,由所述主线程递减所述待迁移数据的引用计数。
可选地,所述异步RESTORE命令的实现逻辑包括:所述主线程创建异步RESTORE任务,将所述异步RESTORE任务传输至所述异步线程;所述异步线程获取所述异步RESTORE任务后,将所述序列化对象进行反序列化,将得到的所述反序列化对象传输至所述主线程;所述主线程将所述反序列化对象插入所述目标数据库,释放所述异步RESTORE任务。
可选地,所述异步RESTORE命令的实现逻辑包括:所述主线程判断所述序列化对象的数据量是否大于等于预设第二阈值;若所述序列化对象的数据量小于所述第二阈值,则由所述主线程将所述序列化对象进行反序列化,将得到的所述反序列化对象插入所述目标数据库;若所述序列化对象的数据量大于等于所述第二阈值,则由所述主线程创建异步RESTORE任务,将所述异步RESTORE任务传输至所述异步线程;所述异步线程获取所述异步RESTORE任务后,将所述序列化对象进行反序列化,将得到的所述反序列化对象传输至所述主线程;所述主线程将所述反序列化对象插入所述目标数据库,释放所述异步RESTORE任务。
可选地,由所述主线程创建异步RESTORE任务,所述异步RESTORE命令的实现逻辑,还包括:若所述序列化对象的数据量大于等于所述第二阈值,则按照预设第二步长,由所述主线程递增所述异步RESTORE命令中键的引用计数,以及所述序列化对象的引用计数;释放所述异步RESTORE任务的步骤之前,所述异步RESTORE命令的实现逻辑,还包括:按照所述第二步长,由所述主线程递减所述异步RESTORE命令中键的引用计数,以及所述序列化对象的引用计数。
可选地,将所述反序列化对象插入所述目标数据库,包括:判断所述目标数据库的相应位置是否存在旧数据对象;若存在,则删除所述旧数据对象,在所述位置插入所述反序列化对象;若不存在,则直接在所述位置插入所述反序列化对象。
可选地,所述主线程递增引用计数的步骤之后,异步命令的实现逻辑,还包括:由所述主线程按照下述实现逻辑进行写保护:遍历所述当前写命令中包含的所有键;其中,所述异步命令包括所述异步DUMP命令和所述异步RESTORE命令,所述异步任务包括异步DUMP任务和异步RESTORE任务;判断当前键指向的数据对象是否存在且为非共享对象,且所述数据对象的引用计数大于初始值;若所述当前键指向的数据对象存在且为非共享对象,且引用计数大于所述初始值,则终止遍历,返回错误提示信息至所述客户端,拒绝访问;否则,继续判断下一键,直至遍历结束后,调用所述当前写命令对应的原生命令;所述主线程递减引用计数的步骤之后,所述异步命令的实现逻辑,还包括:取消写保护。
可选地,通过执行异步MIGRATE命令完成所述数据迁移;其中,所述异步MIGRATE命令的实现逻辑包括:所述主线程根据所述目标数据库的IP地址和端口号,在所述源数据库中查找所述目标数据库的套接字;所述主线程创建异步MIGRATE任务,将所述异步MIGRATE任务传输至所述异步线程;所述异步线程获取所述异步MIGRATE任务后,生成所述异步DUMP命令的字节流和所述异步RESTORE命令的字节流,将所述字节流发送至所述套接字,阻塞并等待所述目标数据库依次执行所述异步DUMP命令和所述RESTORE命令后的响应数据;在所述响应数据指示所述异步线程处理成功的情况下,由所述主线程删除所述源数据库的待迁移数据,释放所述异步MIGRATE任务。
可选地,通过执行异步MIGRATE命令完成所述数据迁移;其中,所述异步MIGRATE命令的实现逻辑包括:所述主线程计算所述待迁移数据的数据量,若所述待迁移数据的数据量大于等于预设第一阈值,则创建异步MIGRATE任务,将所述异步MIGRATE任务传输至所述异步线程;所述异步线程获取所述异步MIGRATE任务后,生成所述异步DUMP命令的字节流和所述异步RESTORE命令的字节流,将所述字节流发送至所述套接字,阻塞并等待所述目标数据库依次执行所述异步DUMP命令和所述RESTORE命令后的响应数据;在所述响应数据指示所述异步线程处理成功的情况下,由所述主线程删除所述源数据库的待迁移数据,释放所述异步MIGRATE任务。
可选地,所述异步MIGRATE命令的实现逻辑,还包括:在所述字节流发送失败,或者所述字节流发送成功但未接收到所述响应数据,或者所述响应数据指示所述异步线程处理失败的情况下,由所述主线程关闭所述套接字,返回数据迁移失败信息至所述客户端,释放所述异步MIGRATE任务。
可选地,所述异步MIGRATE命令的实现逻辑,还包括:若所述待迁移数据的数据量小于所述第一阈值,则由所述主线程将所述待迁移数据进行序列化;生成所述异步RESTORE命令的字节流,将所述字节流发送至所述套接字,阻塞并等待所述目标数据库执行所述RESTORE命令后的响应数据;在所述响应数据指示所述异步线程处理成功的情况下,删除所述源数据库的待迁移数据。
可选地,所述方法还包括:根据创建的异步任务的数量,调整当前异步线程的数量;其中,所述异步任务包括异步DUMP任务、异步RESTORE任务和异步MIGRATE任务。
可选地,所述主线程将异步任务传输至所述异步线程,包括:获取互斥锁,将所述异步任务推入任务队列,通过条件变量唤醒所述异步线程,释放所述互斥锁;其中,所述异步任务包括异步DUMP任务、异步RESTORE任务和异步MIGRATE任务;所述异步线程获取异步任务包括:获取所述互斥锁,判断所述任务队列中是否存在所述异步任务;若所述任务队列中不存在所述异步任务,则所述异步线程阻塞,等待再次被所述主线程唤醒;若所述任务队列中存在所述异步任务,则在所述主线程释放所述互斥锁后,所述异步线程获取所述异步任务,释放所述互斥锁,判断所述异步任务的类型,以根据所述类型执行相应的处理。
为实现上述目的,根据本发明实施例的另一方面,提供了一种数据迁移系统。
本发明实施例的一种数据迁移系统,包括:序列化模块,用于启动设定数量的异步线程,由至少一个所述异步线程执行异步DUMP命令,以将源数据库的待迁移数据进行序列化,得到序列化对象;写入模块,用于由至少一个所述异步线程执行异步RESTORE命令,以将所述序列化对象进行反序列化,将得到的反序列化对象写入目标数据库;删除模块,用于删除所述源数据库的待迁移数据,完成数据迁移。
可选地,所述系统还包括:分析分配模块,用于分析数据迁移所使用的原生命令对应的命令实现逻辑,把所述命令实现逻辑中允许同步执行的子逻辑和允许并发执行的子逻辑进行拆分;以及将允许同步执行的子逻辑作为同步任务分配至主线程,将允许并发执行的子逻辑作为异步任务分配至所述异步线程。
可选地,所述异步DUMP命令的实现逻辑包括:所述主线程创建异步DUMP任务,将所述异步DUMP任务传输至所述异步线程;所述异步线程获取所述异步DUMP任务后,将所述待迁移数据进行序列化,将得到的所述序列化对象传输至所述主线程;所述主线程释放所述异步DUMP任务。
可选地,所述异步DUMP命令的实现逻辑,还包括:在所述主线程创建所述异步DUMP任务之前,若所述待迁移数据的数据量大于等于所述第一阈值,则按照预设第一步长,由所述主线程递增所述待迁移数据的引用计数;在所述主线程释放所述异步DUMP任务之前,按照所述第一步长,由所述主线程递减所述待迁移数据的引用计数。
可选地,所述异步RESTORE命令的实现逻辑包括:所述主线程创建异步RESTORE任务,将所述异步RESTORE任务传输至所述异步线程;所述异步线程获取所述异步RESTORE任务后,将所述序列化对象进行反序列化,将得到的所述反序列化对象传输至所述主线程;所述主线程将所述反序列化对象插入所述目标数据库,释放所述异步RESTORE任务。
可选地,所述异步RESTORE命令的实现逻辑,还包括:在所述主线程创建异步RESTORE任务之前,若所述序列化对象的数据量大于等于所述第二阈值,则按照预设第二步长,由所述主线程递增所述异步RESTORE命令中键的引用计数,以及所述序列化对象的引用计数;在所述主线程释放所述异步RESTORE任务之前,按照所述第二步长,由所述主线程递减所述异步RESTORE命令中键的引用计数,以及所述序列化对象的引用计数。
可选地,所述系统还包括:命令保护模块,用于在所述主线程递增引用计数后,由所述主线程按照下述实现逻辑进行写保护:遍历所述当前写命令中包含的所有键;其中,所述异步命令包括所述异步DUMP命令和所述异步RESTORE命令,所述异步任务包括异步DUMP任务和异步RESTORE任务;判断当前键指向的数据对象是否存在且为非共享对象,且所述数据对象的引用计数大于初始值;若所述当前键指向的数据对象存在且为非共享对象,且引用计数大于所述初始值,则终止遍历,返回错误提示信息至所述客户端,拒绝访问;否则,继续判断下一键,直至遍历结束后,调用所述当前写命令对应的原生命令;以及在所述主线程递减引用计数后,取消写保护。
可选地,所述系统还包括:异步MIGRATE命令实现模块,用于按照所述异步MIGRATE命令的实现逻辑进行数据迁移;所述异步MIGRATE命令的实现逻辑包括:所述主线程根据所述目标数据库的IP地址和端口号,在所述源数据库中查找所述目标数据库的套接字;所述主线程创建异步MIGRATE任务,将所述异步MIGRATE任务传输至所述异步线程;所述异步线程获取所述异步MIGRATE任务后,生成所述异步DUMP命令的字节流和所述异步RESTORE命令的字节流,将所述字节流发送至所述套接字,阻塞并等待所述目标数据库依次执行所述异步DUMP命令和所述RESTORE命令后的响应数据;在所述响应数据指示所述异步线程处理成功的情况下,由所述主线程删除所述源数据库的待迁移数据,释放所述异步MIGRATE任务。
为实现上述目的,根据本发明实施例的再一方面,提供了一种电子设备。
本发明实施例的一种电子设备,包括:一个或多个处理器;存储系统,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现本发明实施例的一种数据迁移方法。
为实现上述目的,根据本发明实施例的再一方面,提供了一种计算机可读介质。
本发明实施例的一种计算机可读介质,其上存储有计算机程序,所述程序被处理器执行时实现本发明实施例的一种数据迁移方法。
上述发明中的一个实施例具有如下优点或有益效果:通过异步线程执行序列化、反序列化操作,将数据迁移对源数据库和目标数据库的阻塞时间优化至常量时间,避免了待迁移数据的数据量大小对阻塞时间的影响;按照子逻辑是否允许同步执行,将数据迁移所使用的原生命令进行拆分,并将拆分结果置于主线程或者异步线程中运行,节省命令的耗时;基于引用计数的值确定数据对象是否被异步命令占用,在被占用时,对相应数据进行写保护,避免破坏数据;数据迁移过程中不会产生额外的内存占用,保证了内存的可用率,且不影响常规操作;根据异步任务数量调整异步线程的数量,提高数据迁移的效率。
上述的非惯用的可选方式所具有的进一步效果将在下文中结合具体实施方式加以说明。
附图说明
附图用于更好地理解本发明,不构成对本发明的不当限定。其中:
图1是根据本发明实施例的数据迁移方法的主要步骤的示意图;
图2是根据本发明实施例的数据迁移方法的主要流程示意图;
图3是根据本发明实施例的数据迁移方法的异步模块结构示意图;
图4为本发明实施例三中异步DUMP命令的命令实现逻辑流程图;
图5为本发明实施例三中异步RESTORE命令的命令实现逻辑流程图;
图6为本发明实施例三中写保护操作的实现流程图;
图7为本发明实施例三中异步MIGRATE命令的命令实现逻辑流程图;
图8为本发明实施例三中主线程与异步线程之间进行异步任务交互的实现流程图;
图9是根据本发明实施例的数据迁移系统的主要模块的示意图;
图10是本发明实施例可以应用于其中的示例性系统架构图;
图11是适用于来实现本发明实施例的电子设备的计算机装置的结构示意图。
具体实施方式
以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
图1是根据本发明实施例的数据迁移方法的主要步骤的示意图。如图1所示,本发明实施例的数据迁移方法,主要包括如下步骤:
步骤S101:启动设定数量的异步线程,由至少一个所述异步线程执行异步DUMP命令,以将源数据库的待迁移数据进行序列化,得到序列化对象。预先分析数据迁移所使用的原生命令对应的命令实现逻辑,把命令实现逻辑中允许同步执行的子逻辑和允许并发执行的子逻辑进行拆分;将允许同步执行的子逻辑作为同步任务分配至主线程,将允许并发执行的子逻辑作为异步任务分配至异步线程。由于序列化、反序列化操作耗时较长,且运行并发执行,故可以将其分配至异步线程。本步骤中由异步线程执行异步DUMP命令中的序列化子逻辑,以将源数据库的待迁移数据进行序列化,得到序列化对象。此时,待迁移数据只存在于源数据库中。
步骤S102:由至少一个所述异步线程执行异步RESTORE命令,以将所述序列化对象进行反序列化,将得到的反序列化对象写入目标数据库。实施例中,异步RESTORE命令的实现逻辑包括:主线程创建异步RESTORE任务,将异步RESTORE任务传输至异步线程;异步线程获取异步RESTORE任务后,将序列化对象进行反序列化,将得到的反序列化对象传输至主线程;主线程将反序列化对象插入目标数据库,释放异步RESTORE任务。按照上述实现逻辑执行异步RESTORE命令,即可将序列化对象进行反序列化,将得到的反序列化对象写入目标数据库。此时,待迁移数据既存在于源数据库中,也存在于目标数据库中。
步骤S103:删除所述源数据库的待迁移数据,完成数据迁移。此时,待迁移数据只存在于目标数据库中,数据迁移完成。上述步骤中源数据库和目标数据库均可以是一个Redis实例。本方法通过异步线程执行序列化、反序列化等耗时的操作,能够将数据迁移对源数据库和目标数据库的阻塞时间优化至常量时间,避免了待迁移数据的数据量大小对阻塞时间的影响。
图2是根据本发明实施例的数据迁移方法的主要流程示意图。如图2所示,本发明实施例的数据迁移方法,主要包括如下步骤:
步骤S201:基于Redis数据库的Module功能,实现异步模块。其中,异步模块包括异步命令模块、异步线程管理模块和命令保护模块。异步命令模块包括:异步DUMP命令实现模块、异步RESTORE命令实现模块和异步MIGRATE命令实现模块。在异步命令模块中,将数据迁移中使用的DUMP命令、RESTORE命令和MIGRATE命令的命令实现逻辑,按照其子逻辑允许同步执行还是允许并发执行分别进行拆分。将允许同步执行的子逻辑作为同步任务分配至主线程,将允许并发执行的子逻辑作为异步任务分配至异步线程。
实施例中,分析原生命令的命令实现逻辑(即代码逻辑),若某个子逻辑涉及到全局变量读写,则其属于只允许同步执行的子逻辑,否则为允许并发执行的子逻辑。按照此原则这样即可拆分原生命令的命令实现逻辑,进而将原生命令改写为对应的异步命令。此处的原生命令即DUMP命令、RESTORE命令和MIGRATE命令,对应的异步命令即异步DUMP命令、异步RESTORE命令和异步MIGRATE命令。
异步线程管理模块用于根据创建的异步任务的数量,调整当前异步线程的数量。在异步任务的数量较多时,适当增加异步线程数量;在异步任务的数量较少时,适当回收部分异步线程,减少操作系统的资源占用。实施例中,还可以由管理员判断是否需要调整当前异步线程的数量。如果并发执行的异步任务的数量超过当前工作的异步线程的数量,则可以通过AsyncThreadSet接口增加当前异步线程的数量。该模块提供调整当前异步线程的数量的接口。另外,该模块虽然无法提升单个数据的迁移速度,但是提高了多个数据迁移的并发性,从整体上来看,提高了数据迁移速率。
命令保护模块用于实现写保护操作。在异步命令执行过程中,如果出现正常的写命令尝试修改异步命令正在访问的数据对象,则有可能会导致异步命令所访问的数据被破坏,使异步命令出现逻辑异常,严重时,会导致Redis服务停止运行。因此,可以在异步命令的实现逻辑中增加写保护操作,当正常写命令尝试访问一个被异步命令处理的数据对象时,拒绝正常写命令对该数据对象的访问。该模块的具体实现见后续关于图6的描述。
图3是根据本发明实施例的数据迁移方法的异步模块结构示意图。如图3所示,异步命令模块中包括异步DUMP命令、异步RESTORE命令和异步MIGRATE命令的实现逻辑。异步线程管理模块中包括异步ThreadGet命令和异步ThreadSet命令的实现逻辑。命令保护模块中包括CommandReplace命令和CommandRecover命令的实现逻辑。异步ThreadGet命令用于设置启动的异步线程的数量。异步ThreadSet命令用于查询当前异步线程的线程号,便于确认异步ThreadSet命令的执行结果。CommandReplace命令用于在Redis原生的写命令前增加一层保护判断。CommandRecover命令用于将Redis的写命令恢复为原生命令。
下面对异步命令模块中各命令的实现逻辑进行说明。
实施例一中,异步DUMP命令的实现逻辑可以包括:主线程创建异步DUMP任务,将异步DUMP任务传输至异步线程;异步线程获取异步DUMP任务后,将待迁移数据进行序列化,将得到的序列化对象传输至主线程;主线程释放异步DUMP任务。
异步RESTORE命令的实现逻辑可以包括:主线程创建异步RESTORE任务,将异步RESTORE任务传输至异步线程;异步线程获取异步RESTORE任务后,将序列化对象进行反序列化,将得到的反序列化对象传输至主线程;主线程将反序列化对象插入目标数据库,释放异步RESTORE任务。
异步MIGRATE命令的实现逻辑可以包括:主线程根据目标数据库的IP地址和端口号,在源数据库中查找目标数据库的套接字;主线程创建异步MIGRATE任务,将异步MIGRATE任务传输至异步线程;异步线程获取异步MIGRATE任务后,生成异步DUMP命令的字节流和异步RESTORE命令的字节流,将字节流发送至套接字,阻塞并等待目标数据库依次执行异步DUMP命令和RESTORE命令后的响应数据;在响应数据指示异步线程处理成功的情况下,由主线程删除源数据库的待迁移数据,释放异步MIGRATE任务。
实施例一中,不考虑待迁移数据的数据量(即占用存储空间的大小),以及序列化对象的数据量,直接由异步线程执行序列化和反序列化操作。但是在数据量较小时,数据迁移不会对Redis服务造成明显影响,故可以设定相应阈值,在数据量超过阈值时,再通过步线程执行序列化和反序列化操作,具体实现见实施例二。
实施例二中,异步DUMP命令的实现逻辑可以包括:主线程计算待迁移数据的数据量,判断待迁移数据的数据量是否大于等于预设第一阈值;若待迁移数据的数据量小于第一阈值,则由主线程将待迁移数据进行序列化;若待迁移数据的数据量大于等于第一阈值,则执行实施例一的异步DUMP命令实现逻辑。
异步RESTORE命令的实现逻辑可以包括:主线程判断序列化对象的数据量是否大于等于预设第二阈值;若序列化对象的数据量小于第二阈值,则由主线程将序列化对象进行反序列化,将得到的反序列化对象插入目标数据库;若序列化对象的数据量大于等于第二阈值,则执行实施例一的异步RESTORE命令实现逻辑。
在异步命令执行过程中,还可以在异步命令的实现逻辑中增加一层写保护,根据引用计数这个变量对数据迁移过程中的数据进行写保护,避免破坏数据。具体实现见实施例三。
图4为本发明实施例三中异步DUMP命令的命令实现逻辑流程图。如图4所示,实施例三中,异步DUMP命令的命令实现逻辑如下:
(1)主线程判断输入参数是否符合异步DUMP命令的要求,如果符合要求,则执行(2);否则,返回输入参数错误的提示信息。该步骤用于判断输入参数是否合法。
(2)主线程判断输入参数指定的待迁移数据是否存在,如果存在,则执行(3);否则,返回表征空对象的信息。实施例中,若输入参数指定的待迁移数据不存在,则可以向客户端返回“NOKEY”。
(3)主线程估算待迁移数据占用存储空间的大小,判断待迁移数据占用的存储空间是否大于等于设定的第一阈值,如果小于第一阈值,则执行(4);如果大于等于第一阈值,则执行(5)。如果待迁移数据占用的存储空间小于第一阈值,说明待迁移数据较小,直接执行DUMP命令不会对数据库服务造成明显影响。如果待迁移数据占用的存储空间大于等于第一阈值,说明待迁移数据较大,需要做异步处理。
实施例中,使用Redis数据库提供的应用程序接口(API)估算待迁移数据占用存储空间的大小。
(4)主线程序列化待迁移数据,返回得到的序列化对象至客户端,结束本流程。实施例中,使用Redis数据库提供的序列化方法,对待迁移数据进行序列化。
(5)主线程按照预设第一步长,递增该待迁移数据的引用计数,进行写保护。该步骤将待迁移数据的引用计数由初始值增加第一步长,实施例中第一步长可以为1。
(6)主线程创建异步DUMP任务,将异步DUMP任务通过同步队列传输至异步线程。
(7)异步线程获取异步DUMP任务,对异步DUMP任务传输的待迁移数据进行序列化。实施例中,通过指针传输待迁移数据,不会产生大量数据拷贝。
(8)异步线程将得到的序列化对象传输给主线程。实施例中,通过指针传输序列化对象,不会产生大量数据拷贝。
(9)主线程将序列化对象反馈至客户端。
(10)主线程按照第一步长,递减将该待迁移数据的引用计数,取消写保护。
(11)主线程释放异步DUMP任务,结束本流程。
图5为本发明实施例三中异步RESTORE命令的命令实现逻辑流程图。如图5所示,实施例三中,异步RESTORE命令的命令实现逻辑如下:
(1)主线程判断输入参数是否符合异步RESTORE命令的要求,如果符合要求,则执行(2);否则,返回输入参数错误的提示信息,结束本流程。该步骤用于判断输入参数是否合法。
(2)主线程判断输入参数指定的序列化对象是否存在,是否允许替换,如果序列化对象存在且不允许替换,则向客户端反馈错误提示信息,结束本流程;否则,执行(3)。如果序列化对象存在且不允许替换,则可以向客户端反馈“BUSYKEY”的错误提示信息。
(3)主线程判断输入参数中序列化对象的占用存储空间的大小是否大于等于设定的第二阈值,如果小于第二阈值,则执行(4);如果大于等于第二阈值,则执行(9)。如果序列化对象的占用的存储空间大于等于第二阈值,说明需要做异步处理。
(4)主线程反序列化输入参数中的序列化对象。实施例中,使用Redis数据库提供的反序列化方法,对输入参数中的序列化对象进行反序列化操作。
(5)主线程判断目标数据库的相应位置是否存在旧数据对象,如果存在,则删除旧数据对象,插入反序列化得到的反序列化对象;如果不存在,则直接在目标数据库的该位置插入反序列化对象。其中,相应位置是指反序列化对象准备插入的目标数据库的位置。
(6)主线程判断输入参数是否包含反序列化对象的过期时间,如果不包含过期时间,则执行(7);如果包含过期时间,则执行(8)。该过期时间是反序列化对象的过期时间。
(7)主线程设置反序列化对象的过期时间,执行(8)。根据需求,在必要时设置反序列化对象的过期时间。
(8)主线程触发复制机制,向客户端返回处理成功的提示信息。根据需求,主线程可以触发必要的复制机制,比如AOF(Append Only File)、RDB(Redis DataBase)、主从复制等。AOF和RDB是Redis支持的两种持久化方案。
(9)主线程按照设定的第二步长,递增输入参数中键的引用计数和序列化对象的引用计数,进行写保护。该步骤能够在客户端主动断开或者由于网络原因断开与数据库的连接的情况下,在Redis服务端的client对象被回收时,避免释放掉输入参数中的键和序列化对象。
(10)主线程创建异步RESTORE任务,将异步RESTORE任务通过同步队列传输至异步线程。
(11)异步线程获取异步RESTORE任务,对异步RESTORE任务传输的序列化对象进行反序列化。
(12)异步线程将得到的反序列化对象传输给主线程。异步线程在反序列化完成后,将得到的反序列化对象通过指针传输给主线程。
(13)主线程判断目标数据库的相应位置是否存在旧数据对象,如果存在,则判断旧数据对象是否允许被替换,如果允许,则执行(14);如果不允许,则执行(20);如果不存在,则执行(15)。在异步线程进行反序列化的过程中,主线程可能又创建了一个相同的数据对象,故需要在该步骤中再次判断目标数据库的相应位置是否存在有数据对象。
(14)主线程删除旧数据对象,在目标数据库中插入反序列化对象,执行(16)。
(15)主线程直接在目标数据库的相应位置插入反序列化对象,执行(16)。
(16)主线程判断输入参数是否包含反序列化对象的过期时间,如果不包含过期时间,则执行(17);如果包含过期时间,则执行(18)。
(17)设置反序列化对象的过期时间,执行(18)。根据需求,在必要时设置反序列化对象的过期时间。
(18)主线程触发复制机制,向客户端返回处理成功的提示信息。根据需求,主线程可以触发必要的复制机制,比如AOF、RDB、主从复制等。
(19)主线程按照第二步长,递减输入参数中键的引用计数和序列化对象的引用计数,取消写保护,执行(21)。
(20)主线程向客户端反馈错误提示信息,执行(21)。如果旧数据对象存在且不允许替换,则可以向客户端反馈“BUSYKEY”的错误提示信息。
(21)主线程释放异步RESTORE任务,结束本流程。
实施例三中,异步DUMP命令和异步RESTORE命令的实现逻辑中,在主线程递增相应的引用计数后,均涉及写保护操作,下面结合图6对写保护操作的实现过程进行说明。
图6为本发明实施例三中写保护操作的实现流程图。如图6所示,异步DUMP命令和异步RESTORE命令中的写保护操作由主线程实现,具体实现过程为:
(1)主线程判断是否已经遍历完当前写命令中包含的所有键,如果未遍历完成,则执行(2);如果已遍历完成,则执行(5)。本实现逻辑中的写命令是指受到保护的所有写命令,包括set、lpushx、lpop、restore命令等。
(2)主线程判断当前键指向的数据对象是否存在,如果该数据对象存在,且为非共享对象,且该数据对象的引用计数大于初始值,则执行(3);否则,执行(4)。Redis维护键指向的数据对象时,除了数据对象本身,还会维护数据对象的类型和编码格式,实施例中,通过数据对象的类型和编码格式判断其是否为共享对象。如果数据对象的引用计数初始值为1,若当前引用计数的值大于1,说明数据对象被异步命令占用。
(3)主线程终止遍历当前写命令中的所有键,向客户端反馈错误提示信息,拒绝访问,结束本流程。比如向客户端反馈“BUSYKEY”的错误提示信息。
(4)主线程将下一键作为当前键,执行(1)。
(5)主线程将来自客户端的输入参数传输给对应的原生命令,由原生命令进行响应,结束本流程。
图7为本发明实施例三中异步MIGRATE命令的命令实现逻辑流程图。如图7所示,实施例三中,异步MIGRATE命令的实现逻辑如下:
(1)主线程判断输入参数是否符合异步MIGRATE命令的要求,如果符合要求,则执行(2);否则,返回输入参数错误的提示信息。该步骤用于判断输入参数是否合法。
(2)主线程判断输入参数指定的待迁移数据是否存在,如果存在,则执行(3);否则,返回表征空对象的信息。实施例中,若输入参数指定的待迁移数据不存在,则可以向客户端返回“NOKEY”。
(3)主线程根据目标数据库的IP地址和端口号,在源数据库中查找目标数据库的套接字socket。socket是一个四元组(源IP地址,源端口号,目标IP地址,目标端口号),故可以由目标IP地址和目标端口号唯一检索出socket。如果源数据库中不存在目标数据库的socket,则创建一个socket,并建立源数据库和目标数据库之间的连接。
(4)主线程估算待迁移数据占用存储空间的大小,判断待迁移数据占用的存储空间是否大于等于设定第一阈值,如果小于第一阈值,则执行(5);如果大于等于第一阈值,则执行(9)。
(5)主线程将源数据库中的待迁移数据进行序列化,生成异步RESTORE命令的字节流,准备网络传输。
(6)主线程向查找到的socket发送字节流。如果发送失败,则关闭当前连接,并删除该socket在源数据库的缓存,数据迁移失败。
(7)主线程阻塞,等待目标数据库的响应。如果接收不到响应,则关闭当前连接,并删除该socket在源数据库的缓存,数据迁移失败。如果接收到响应,但响应提示目标数据库执行异步RESTORE命令失败,则数据迁移失败。
(8)主线程接收到响应,且响应提示目标数据库执行异步RESTORE命令成功,则删除源数据库的待迁移数据,向客户端返回数据迁移成功信息,结束本流程。如果前面步骤未出现任何失败,则说明数据已成功迁移到目标数据库。
(9)主线程按照设定步长递增参数的引用计数,创建异步MIGRATE任务,将异步MIGRATE任务传输至异步线程。此处的参数可以是待迁移数据、序列化对象。为不同的参数设定的步长相同,也可以不同。
(10)异步线程获取异步MIGRATE任务,生成实施例一对应的异步DUMP命令的字节流,以及异步RESTORE命令的字节流,准备网络传输。
(11)异步线程向查找到的socket发送字节流。如果发送失败,则进行错误标记。
(12)异步线程阻塞,等待目标数据库的响应。如果接收不到响应,则进行错误标记。目标数据库依次执行实施例一中的异步DUMP命令和RESTORE命令后,将响应数据发送至主线程。步骤(10)和步骤(11)的错误标记有两类,一类是socket error,表征出现网路错误,该错误要求主线程关闭socket,等到下次使用时再重新创建;另一类是非socketerror,表征网络正常但出现逻辑错误,主线程只需要将目标数据库返回的错误信息原样返回给客户端,无需做额外处理。
(13)主线程根据异步线程的错误标记,确定需要响应给客户端的信息。如果异步线程处理成功,则删除源数据库的待迁移数据,响应客户端数据迁移成功信息;否则,响应客户端数据迁移失败信息。
(14)主线程释放异步MIGRATE任务,结束本流程。若异步线程处理成功,先按照设定步长递减参数的引用计数后,再释放异步MIGRATE任务。
实施例三中,异步DUMP命令、异步RESTORE命令和异步MIGRATE命令中均涉及由主线程将异步任务传输至异步线程的操作,以及异步线程获取异步任务的操作,下面结合图8对上述过程进行详细说明。
图8为本发明实施例三中主线程与异步线程之间进行异步任务交互的实现流程图。如图8所示,主线程与异步线程之间进行异步任务交互,具体为:
(1)主线程创建异步任务。创建的异步任务可以有3种类型,分别为异步DUMP任务、异步RESTORE任务和异步MIGRATE任务。
(2)主线程获取互斥锁。工作线程与主线程通过一个任务队列和一组锁进行交互。该组锁包括互斥锁和条件变量。互斥锁有两个作用,作用一是保护任务队列在同一时间只有1个线程(无论是主线程还是异步线程)能够访问,避免破坏任务队列;作用二是保护条件变量同一时间只有1个线程(无论是主线程还是异步线程)能够访问,避免破坏条件变量。同一个互斥锁,同一时间只能被一个线程持有,其他尝试获取该互斥锁的线程将陷入阻塞状态,直至该互斥锁被持有线程释放。
(3)主线程将步骤(1)创建的异步任务推入任务队列。
(4)主线程唤醒条件变量,通过条件变量唤醒当前异步线程。假如此时有多个异步线程在监听该条件变量,则只有1个条件变量会被唤醒,实际唤醒哪个异步线程,由操作系统决定。
(5)主线程释放互斥锁。被唤醒的异步线程才能获取到互斥锁,从而继续工作。主线程释放互斥锁后,完成了自己的工作,可以随时开始下一个命令的处理。
(6)创建当前异步线程。实施例中,由异步ThreadSet命令创建当前异步线程。
(7)当前异步线程获取互斥锁。该步骤用于保证访问权的唯一性。
(8)当前异步线程判断任务队列中是否有异步任务,如果没有异步任务,则执行(9);如果有异步任务,则执行(10)。
(9)当前异步线程阻塞,等待条件变量唤醒。异步线程在等待条件变量唤醒的过程中,会暂时释放其持有的互斥锁,直到成功被条件变量唤醒,才会尝试重新获取互斥锁。
(10)当前异步线程从任务队列中取出异步任务。主线程释放互斥锁后,异步线程才能取出任务。异步任务被取出后,其他的异步线程将无法再获取到该异步任务。
(11)当前异步线程释放互斥锁。异步线程执行具体的异步任务是一个比较耗时的过程,因此避免在其持有互斥锁的期间执行异步任务。
(12)当前异步线程根据异步任务的类型,执行相应的处理流程。异步任务有异步DUMP任务、异步RESTORE任务和异步MIGRATE任务3种类型,相应的处理流程可以为异步DUMP命令的实现流程、异步RESTORE命令的实现流程和异步MIGRATE命令的实现流程。图中的虚线框表示后续会按照相应命令的实现逻辑进行处理。
该步骤借助Redis数据库的Module功能所提供的Blocked Client接口,创建异步线程,将DUMP命令的序列化操作、RESTORE命令的反序列化操作和MIGRATE命令中可并行执行的操作变为异步操作。无论待迁移数据的数据量大小,执行异步DUMP命令、异步RESTORE命令和异步MIGRATE命令时,对Redis数据库的阻塞为微秒级(<300微秒)。迁移数据量大的待迁移数据时,Redis服务仍旧保持可用。
步骤S202:客户端加载异步模块。实施例中,使用Redis服务提供的MODULE LOAD命令加载已经编译好的异步模块。
步骤S203:客户端开启命令保护模式。调用命令保护模块的COMMAND.REPLACE命令(即CommandReplace命令),在Redis原生的写命令前增加一层保护判断。
步骤S204:客户端启动设定数量的异步线程。调用异步线程管理模块的ASYNC.THREAD.SET命令(即异步ThreadSet命令),设置一个大于0的整数,该数字表示要启动的异步线程的数量。实际应用中,异步线程的数量一般与部署机器的内核数量一致,比如8核机器,则启动8个异步线程,保证线程得到最大限度的利用。
步骤S205:客户端执行异步命令。通过前述步骤异步环境已经准备就绪,可以安全且快速地执行异步命令了。在此期间,可以以任意顺序任意数量执行异步命令模块中的异步命令。该步骤中的异步命令可以是异步DUMP命令、异步RESTORE命令、异步MIGRATE命令。
步骤S206:客户端确认异步命令执行完成后,关闭异步线程。执行异步命令的客户端,所发出的所有异步命令都接收到响应,并且不需要再发送新的异步命令时,则认为异步命令已全部执行完成。实际工程应用中,是指源数据库上所有需要迁移的Key(键)都已完成迁移,通常使用Redis的Scan命令进行判断。确认异步命令执行完成后,可以再次调用ASYNC.THREAD.SET命令,将异步线程的数量设置为0,以关闭所有异步线程。
步骤S207:客户端关闭命令保护模式。调用命令保护模块的COMMAND.RECOVER命令(即CommandRecover命令),将Redis的写命令恢复为原生命令。
步骤S208:客户端卸载异步模块。实施例中,使用Redis服务提供的MODULE UNLOAD命令卸载异步模块。该实施例中,数据迁移速度相比Redis原生命令的迁移速度基本一致,且数据迁移过程中,额外需要的内存是很小的常量值,与待迁移数据的数据量大小无关,保证了内存的可用率。另外,数据迁移通常具有临时性、短时性的特点,并不需要持续地运行,因此异步模块采用“即用即插,用完即销”的基本原则。
通过本发明实施例的数据迁移方法可以看出,通过异步线程执行序列化、反序列化操作,将数据迁移对源数据库和目标数据库的阻塞时间优化至常量时间,避免了待迁移数据的数据量大小对阻塞时间的影响,同时不会增加序列化后字节流的体积,不会增加网络带宽的负荷,避免网络拥堵。
图9是根据本发明实施例的数据迁移系统的主要模块的示意图。如图9所示,本发明实施例的数据迁移系统900,主要包括:
序列化模块901,用于启动设定数量的异步线程,由至少一个所述异步线程执行异步DUMP命令,以将源数据库的待迁移数据进行序列化,得到序列化对象。预先分析数据迁移所使用的原生命令对应的命令实现逻辑,把命令实现逻辑中允许同步执行的子逻辑和允许并发执行的子逻辑进行拆分;将允许同步执行的子逻辑作为同步任务分配至主线程,将允许并发执行的子逻辑作为异步任务分配至异步线程。由于序列化、反序列化操作耗时较长,且运行并发执行,故可以将其分配至异步线程。本模块中由异步线程执行异步DUMP命令中的序列化子逻辑,以将源数据库的待迁移数据进行序列化,得到序列化对象。此时,待迁移数据只存在于源数据库中。
写入模块902,用于由至少一个所述异步线程执行异步RESTORE命令,以将所述序列化对象进行反序列化,将得到的反序列化对象写入目标数据库。实施例中,异步RESTORE命令的实现逻辑包括:主线程创建异步RESTORE任务,将异步RESTORE任务传输至异步线程;异步线程获取异步RESTORE任务后,将序列化对象进行反序列化,将得到的反序列化对象传输至主线程;主线程将反序列化对象插入目标数据库,释放异步RESTORE任务。按照上述实现逻辑执行异步RESTORE命令,即可将序列化对象进行反序列化,将得到的反序列化对象写入目标数据库。此时,待迁移数据既存在于源数据库中,也存在于目标数据库中。
删除模块903,用于删除所述源数据库的待迁移数据,完成数据迁移。上述模块中源数据库和目标数据库均可以是一个Redis实例。本方法通过异步线程执行序列化、反序列化等耗时的操作,能够将数据迁移对源数据库和目标数据库的阻塞时间优化至常量时间,避免了待迁移数据的数据量大小对阻塞时间的影响。
另外,本发明实施例的数据迁移系统900还可以包括:分析分配模块、命令保护模块、异步MIGRATE命令实现模块。其中,分析分配模块,用于分析数据迁移所使用的原生命令对应的命令实现逻辑,把所述命令实现逻辑中允许同步执行的子逻辑和允许并发执行的子逻辑进行拆分;以及将允许同步执行的子逻辑作为同步任务分配至主线程,将允许并发执行的子逻辑作为异步任务分配至所述异步线程。
命令保护模块,用于在所述主线程递增引用计数后,由所述主线程按照下述实现逻辑进行写保护:遍历所述当前写命令中包含的所有键;其中,所述异步命令包括所述异步DUMP命令和所述异步RESTORE命令,所述异步任务包括异步DUMP任务和异步RESTORE任务;判断当前键指向的数据对象是否存在且为非共享对象,且所述数据对象的引用计数大于初始值;若所述当前键指向的数据对象存在且为非共享对象,且引用计数大于所述初始值,则终止遍历,返回错误提示信息至所述客户端,拒绝访问;否则,继续判断下一键,直至遍历结束后,调用所述当前写命令对应的原生命令;以及在所述主线程递减引用计数后,取消写保护。
异步MIGRATE命令实现模块,用于按照所述异步MIGRATE命令的实现逻辑进行数据迁移。该命令的具体实现逻辑如前所述。
从以上描述可以看出,通过异步线程执行序列化、反序列化操作,将数据迁移对源数据库和目标数据库的阻塞时间优化至常量时间,避免了待迁移数据的数据量大小对阻塞时间的影响,同时不会增加序列化后字节流的体积,不会增加网络带宽的负荷,避免网络拥堵。
图10示出了可以应用本发明实施例的数据迁移方法或数据迁移系统的示例性系统架构1000。
如图10所示,系统架构1000可以包括终端设备1001、1002、1003,网络1004和服务器1005。网络1004用以在终端设备1001、1002、1003和服务器1005之间提供通信链路的介质。网络1004可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
用户可以使用终端设备1001、1002、1003通过网络1004与服务器1005交互,以接收或发送消息等。终端设备1001、1002、1003上可以安装有各种通讯客户端应用。
终端设备1001、1002、1003可以是具有显示屏并且支持网页浏览的各种电子设备,包括但不限于智能手机、平板电脑、膝上型便携计算机和台式计算机等等。
服务器1005可以是提供各种服务的服务器,例如对用户利用终端设备1001、1002、1003所发送的命令提供支持的数据库服务器。数据库服务器可以根据接收的命令对数据进行存储、删除等处理,并将处理结果(例如响应信息)反馈给终端设备。
需要说明的是,本申请实施例所提供的数据迁移方法一般由终端设备1001、1002、1003执行,相应地,数据迁移系统一般设置于终端设备1001、1002、1003中。
应该理解,图10中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。
根据本发明的实施例,本发明还提供了一种电子设备和一种计算机可读介质。
本发明的电子设备包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现本发明实施例的一种数据迁移方法。
本发明的计算机可读介质,其上存储有计算机程序,所述程序被处理器执行时实现本发明实施例的一种数据迁移方法。
下面参考图11,其示出了适用于来实现本发明实施例的电子设备的计算机系统1100的结构示意图。图11示出的电子设备仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
如图11所示,计算机系统1100包括中央处理单元(CPU)1101,其可以根据存储在只读存储器(ROM)1102中的程序或者从存储部分1108加载到随机访问存储器(RAM)1103中的程序而执行各种适当的动作和处理。在RAM 1103中,还存储有计算机系统1100操作所需的各种程序和数据。CPU 1101、ROM 1102以及RAM 1103通过总线1104彼此相连。输入/输出(I/O)接口1105也连接至总线1104。
以下部件连接至I/O接口1105:包括键盘、鼠标等的输入部分1106;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分1107;包括硬盘等的存储部分1108;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分1109。通信部分1109经由诸如因特网的网络执行通信处理。驱动器1110也根据需要连接至I/O接口1105。可拆卸介质1111,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器1110上,以便于从其上读出的计算机程序根据需要被安装入存储部分1108。
特别地,根据本发明公开的实施例,上文主要步骤图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行主要步骤图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分1109从网络上被下载和安装,和/或从可拆卸介质1111被安装。在该计算机程序被中央处理单元(CPU)1101执行时,执行本发明的系统中限定的上述功能。
需要说明的是,本发明所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本发明中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本发明中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本发明实施例中所涉及到的模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的模块也可以设置在处理器中,例如,可以描述为:一种处理器包括序列化模块、写入模块和删除模块。其中,这些模块的名称在某种情况下并不构成对该模块本身的限定,例如,序列化模块还可以被描述为“启动设定数量的异步线程,由至少一个所述异步线程执行异步DUMP命令,以将源数据库的待迁移数据进行序列化,得到序列化对象的模块”。
作为另一方面,本发明还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的设备中所包含的;也可以是单独存在,而未装配入该设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该设备执行时,使得该设备包括:启动设定数量的异步线程,由至少一个所述异步线程执行异步DUMP命令,以将源数据库的待迁移数据进行序列化,得到序列化对象;由至少一个所述异步线程执行异步RESTORE命令,以将所述序列化对象进行反序列化,将得到的反序列化对象写入目标数据库;删除所述源数据库的待迁移数据,完成数据迁移。
从以上描述可以看出,通过异步线程执行序列化、反序列化操作,将数据迁移对源数据库和目标数据库的阻塞时间优化至常量时间,避免了待迁移数据的数据量大小对阻塞时间的影响,同时不会增加序列化后字节流的体积,不会增加网络带宽的负荷,避免网络拥堵。
上述产品可执行本发明实施例所提供的方法,具备执行方法相应的功能模块和有益效果。未在本实施例中详尽描述的技术细节,可参见本发明实施例所提供的方法。
上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。

Claims (18)

1.一种数据迁移方法,其特征在于,包括:
启动设定数量的异步线程,由至少一个所述异步线程执行异步DUMP命令,以将源数据库的待迁移数据进行序列化,得到序列化对象;
由至少一个所述异步线程执行异步RESTORE命令,以将所述序列化对象进行反序列化,将得到的反序列化对象写入目标数据库;
删除所述源数据库的待迁移数据,完成数据迁移。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
分析数据迁移所使用的原生命令对应的命令实现逻辑,把所述命令实现逻辑中允许同步执行的子逻辑和允许并发执行的子逻辑进行拆分;
将允许同步执行的子逻辑作为同步任务分配至主线程,将允许并发执行的子逻辑作为异步任务分配至所述异步线程。
3.根据权利要求2所述的方法,其特征在于,所述异步DUMP命令的实现逻辑包括:
所述主线程创建异步DUMP任务,将所述异步DUMP任务传输至所述异步线程;
所述异步线程获取所述异步DUMP任务后,将所述待迁移数据进行序列化,将得到的所述序列化对象传输至所述主线程;
所述主线程释放所述异步DUMP任务。
4.根据权利要求2所述的方法,其特征在于,所述异步DUMP命令的实现逻辑包括:
所述主线程计算所述待迁移数据的数据量,判断所述待迁移数据的数据量是否大于等于预设第一阈值;
若所述待迁移数据的数据量小于所述第一阈值,则由所述主线程将所述待迁移数据进行序列化;
若所述待迁移数据的数据量大于等于所述第一阈值,则由所述主线程创建异步DUMP任务,将所述异步DUMP任务传输至所述异步线程;所述异步线程获取所述异步DUMP任务后,将所述待迁移数据进行序列化,将得到的所述序列化对象传输至所述主线程;所述主线程释放所述异步DUMP任务。
5.根据权利要求4所述的方法,其特征在于,由所述主线程创建异步DUMP任务的步骤之前,所述异步DUMP命令的实现逻辑,还包括:
若所述待迁移数据的数据量大于等于所述第一阈值,则按照预设第一步长,由所述主线程递增所述待迁移数据的引用计数;
释放所述异步DUMP任务的步骤之前,所述异步DUMP命令的实现逻辑,还包括:
按照所述第一步长,由所述主线程递减所述待迁移数据的引用计数。
6.根据权利要求2所述的方法,其特征在于,所述异步RESTORE命令的实现逻辑包括:
所述主线程创建异步RESTORE任务,将所述异步RESTORE任务传输至所述异步线程;
所述异步线程获取所述异步RESTORE任务后,将所述序列化对象进行反序列化,将得到的所述反序列化对象传输至所述主线程;
所述主线程将所述反序列化对象插入所述目标数据库,释放所述异步RESTORE任务。
7.根据权利要求2所述的方法,其特征在于,所述异步RESTORE命令的实现逻辑包括:
所述主线程判断所述序列化对象的数据量是否大于等于预设第二阈值;
若所述序列化对象的数据量小于所述第二阈值,则由所述主线程将所述序列化对象进行反序列化,将得到的所述反序列化对象插入所述目标数据库;
若所述序列化对象的数据量大于等于所述第二阈值,则由所述主线程创建异步RESTORE任务,将所述异步RESTORE任务传输至所述异步线程;所述异步线程获取所述异步RESTORE任务后,将所述序列化对象进行反序列化,将得到的所述反序列化对象传输至所述主线程;所述主线程将所述反序列化对象插入所述目标数据库,释放所述异步RESTORE任务。
8.根据权利要求7所述的方法,其特征在于,由所述主线程创建异步RESTORE任务,所述异步RESTORE命令的实现逻辑,还包括:
若所述序列化对象的数据量大于等于所述第二阈值,则按照预设第二步长,由所述主线程递增所述异步RESTORE命令中键的引用计数,以及所述序列化对象的引用计数;
释放所述异步RESTORE任务的步骤之前,所述异步RESTORE命令的实现逻辑,还包括:
按照所述第二步长,由所述主线程递减所述异步RESTORE命令中键的引用计数,以及所述序列化对象的引用计数。
9.根据权利要求5或8所述的方法,其特征在于,所述主线程递增引用计数的步骤之后,异步命令的实现逻辑,还包括:由所述主线程按照下述实现逻辑进行写保护:
遍历所述当前写命令中包含的所有键;其中,所述异步命令包括所述异步DUMP命令和所述异步RESTORE命令,所述异步任务包括异步DUMP任务和异步RESTORE任务;
判断当前键指向的数据对象是否存在且为非共享对象,且所述数据对象的引用计数大于初始值;
若所述当前键指向的数据对象存在且为非共享对象,且引用计数大于所述初始值,则终止遍历,返回错误提示信息至所述客户端,拒绝访问;否则,继续判断下一键,直至遍历结束后,调用所述当前写命令对应的原生命令;
所述主线程递减引用计数的步骤之后,所述异步命令的实现逻辑,还包括:取消写保护。
10.根据权利要求2所述的方法,其特征在于,通过执行异步MIGRATE命令完成所述数据迁移;其中,所述异步MIGRATE命令的实现逻辑包括:
所述主线程根据所述目标数据库的IP地址和端口号,在所述源数据库中查找所述目标数据库的套接字;
所述主线程创建异步MIGRATE任务,将所述异步MIGRATE任务传输至所述异步线程;
所述异步线程获取所述异步MIGRATE任务后,生成所述异步DUMP命令的字节流和所述异步RESTORE命令的字节流,将所述字节流发送至所述套接字,阻塞并等待所述目标数据库依次执行所述异步DUMP命令和所述RESTORE命令后的响应数据;
在所述响应数据指示所述异步线程处理成功的情况下,由所述主线程删除所述源数据库的待迁移数据,释放所述异步MIGRATE任务。
11.根据权利要求3所述的方法,其特征在于,通过执行异步MIGRATE命令完成所述数据迁移;其中,所述异步MIGRATE命令的实现逻辑包括:
所述主线程计算所述待迁移数据的数据量,若所述待迁移数据的数据量大于等于预设第一阈值,则创建异步MIGRATE任务,将所述异步MIGRATE任务传输至所述异步线程;
所述异步线程获取所述异步MIGRATE任务后,生成所述异步DUMP命令的字节流和所述异步RESTORE命令的字节流,将所述字节流发送至所述套接字,阻塞并等待所述目标数据库依次执行所述异步DUMP命令和所述RESTORE命令后的响应数据;
在所述响应数据指示所述异步线程处理成功的情况下,由所述主线程删除所述源数据库的待迁移数据,释放所述异步MIGRATE任务。
12.根据权利要求10或11所述的方法,其特征在于,所述异步MIGRATE命令的实现逻辑,还包括:
在所述字节流发送失败,或者所述字节流发送成功但未接收到所述响应数据,或者所述响应数据指示所述异步线程处理失败的情况下,由所述主线程关闭所述套接字,返回数据迁移失败信息至所述客户端,释放所述异步MIGRATE任务。
13.根据权利要求11所述的方法,其特征在于,所述异步MIGRATE命令的实现逻辑,还包括:
若所述待迁移数据的数据量小于所述第一阈值,则由所述主线程将所述待迁移数据进行序列化;
生成所述异步RESTORE命令的字节流,将所述字节流发送至所述套接字,阻塞并等待所述目标数据库执行所述RESTORE命令后的响应数据;
在所述响应数据指示所述异步线程处理成功的情况下,删除所述源数据库的待迁移数据。
14.根据权利要求3至8或者10至11的任一项所述的方法,其特征在于,所述方法还包括:根据创建的异步任务的数量,调整当前异步线程的数量;其中,所述异步任务包括异步DUMP任务、异步RESTORE任务和异步MIGRATE任务。
15.根据权利要求3至8或者10至11的任一项所述的方法,其特征在于,所述主线程将异步任务传输至所述异步线程,包括:
获取互斥锁,将所述异步任务推入任务队列,通过条件变量唤醒所述异步线程,释放所述互斥锁;其中,所述异步任务包括异步DUMP任务、异步RESTORE任务和异步MIGRATE任务;
所述异步线程获取异步任务包括:
获取所述互斥锁,判断所述任务队列中是否存在所述异步任务;
若所述任务队列中不存在所述异步任务,则所述异步线程阻塞,等待再次被所述主线程唤醒;
若所述任务队列中存在所述异步任务,则在所述主线程释放所述互斥锁后,所述异步线程获取所述异步任务,释放所述互斥锁,判断所述异步任务的类型,以根据所述类型执行相应的处理。
16.一种数据迁移系统,其特征在于,包括:
序列化模块,用于启动设定数量的异步线程,由至少一个所述异步线程执行异步DUMP命令,以将源数据库的待迁移数据进行序列化,得到序列化对象;
写入模块,用于由至少一个所述异步线程执行异步RESTORE命令,以将所述序列化对象进行反序列化,将得到的反序列化对象写入目标数据库;
删除模块,用于删除所述源数据库的待迁移数据,完成数据迁移。
17.一种电子设备,其特征在于,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-15中任一所述的方法。
18.一种计算机可读介质,其上存储有计算机程序,其特征在于,所述程序被处理器执行时实现如权利要求1-15中任一所述的方法。
CN201910655766.6A 2019-07-19 2019-07-19 一种数据迁移方法和系统 Pending CN112241398A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910655766.6A CN112241398A (zh) 2019-07-19 2019-07-19 一种数据迁移方法和系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910655766.6A CN112241398A (zh) 2019-07-19 2019-07-19 一种数据迁移方法和系统

Publications (1)

Publication Number Publication Date
CN112241398A true CN112241398A (zh) 2021-01-19

Family

ID=74167951

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910655766.6A Pending CN112241398A (zh) 2019-07-19 2019-07-19 一种数据迁移方法和系统

Country Status (1)

Country Link
CN (1) CN112241398A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114077602A (zh) * 2022-01-13 2022-02-22 中兴通讯股份有限公司 数据迁移方法和装置、电子设备、存储介质
CN116980641A (zh) * 2023-09-22 2023-10-31 江西云眼视界科技股份有限公司 视频迁移的异步处理方法、系统、计算机及存储介质

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114077602A (zh) * 2022-01-13 2022-02-22 中兴通讯股份有限公司 数据迁移方法和装置、电子设备、存储介质
CN116980641A (zh) * 2023-09-22 2023-10-31 江西云眼视界科技股份有限公司 视频迁移的异步处理方法、系统、计算机及存储介质
CN116980641B (zh) * 2023-09-22 2023-12-15 江西云眼视界科技股份有限公司 视频迁移的异步处理方法、系统、计算机及存储介质

Similar Documents

Publication Publication Date Title
US11042501B2 (en) Group-based data replication in multi-tenant storage systems
EP3667496B1 (en) Distributed computing system, data transmission method and device in distributed computing system
WO2020048391A1 (zh) 基于多租户技术的web服务的部署、调用方法和装置
US9332083B2 (en) High performance, distributed, shared, data grid for distributed Java virtual machine runtime artifacts
US8904386B2 (en) Running a plurality of instances of an application
US8996811B2 (en) Scheduler, multi-core processor system, and scheduling method
CN112650576B (zh) 资源调度方法、装置、设备、存储介质及计算机程序产品
CN107515783B (zh) 基于应用容器集群工具的应用容器管控方法及装置
US20140181831A1 (en) DEVICE AND METHOD FOR OPTIMIZATION OF DATA PROCESSING IN A MapReduce FRAMEWORK
EP3688598B1 (en) Method for reading data stored in a non-volatile cache using rdma
US8719845B2 (en) Sharing and synchronization of objects
CN109032796B (zh) 一种数据处理方法和装置
US20150254113A1 (en) Lock Spin Wait Operation for Multi-Threaded Applications in a Multi-Core Computing Environment
EP2945072A1 (en) Method and apparatus for processing redo data of database
US10620871B1 (en) Storage scheme for a distributed storage system
CN112241398A (zh) 一种数据迁移方法和系统
WO2023124422A1 (zh) 一种数据读写的控制方法及电子设备
CN113885780A (zh) 数据同步方法、装置、电子设备、系统和存储介质
CN109284177B (zh) 一种数据更新方法和装置
CN110325980B (zh) 用于数据库绑定型应用的用户界面后端集群的扩展方法
US10678453B2 (en) Method and device for checking false sharing in data block deletion using a mapping pointer and weight bits
CN115268909A (zh) 一种web前端创建并运行构建任务的方法、系统和终端
CN115934585A (zh) 内存管理方法、装置和计算机设备
CN113778910A (zh) 一种数据缓存的处理方法及装置
CN108376104B (zh) 节点调度方法及装置、计算机可读存储介质

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