数据库集群的数据迁移方法、装置及电子设备
技术领域
本发明涉及数据库技术,尤其涉及一种数据库集群的数据迁移方法、装置、电子设备及计算机可读存储介质。
背景技术
在如远程字典服务(Redis,Remote dictionary server)的内存数据库中,通常使用数据库集群的方式来实现分布式部署。数据库集群往往由多个分片(shard)构成,其中每个分片包括若干个节点。存储单元是数据库集群中管理数据的基本单位,当对数据库集群进行扩容或缩容时,分片的数量会增加或减少,故需要将某些分片中的存储单元迁移到其它分片,以维持各分片中存储单元数量的均衡。
在相关技术提供的方案中,通常是将节点内存储单元的数据分批迁移至另一节点,每迁移一批,在迁出数据的节点上删除相应的数据,直到存储单元内的所有数据迁移完毕。但是,数据迁移的过程会阻塞线程,即节点在进行数据迁移时无法向外提供读写服务,若某个数据所占空间较大,则可能因阻塞线程的时长较长,导致延迟过高,无法及时提供数据服务。
发明内容
本发明实施例提供一种数据库集群的数据迁移方法、装置、电子设备及计算机可读存储介质,能够在数据迁移过程中及时提供数据服务,提升线上服务的稳定性。
本发明实施例的技术方案是这样实现的:
本发明实施例提供一种数据库集群的数据迁移方法,所述方法包括:
所述数据库集群中的源节点对待迁移的存储单元中的全量数据进行复制处理;其中,所述源节点为所述数据库集群的多个节点中需要将所存储的数据迁移出的节点;
将复制的所述全量数据异步发送至目标节点,以使所述目标节点加载所述全量数据;其中,所述目标节点为所述数据库集群中用于接收所述数据的节点;
确定所述待迁移的存储单元的当前数据量与所述目标节点的已接收数据量之间的数据量差值;
当所述数据量差值为零时,将所述待迁移的存储单元分配至所述目标节点。
本发明实施例提供一种数据库集群的数据迁移装置,所述装置包括:
复制模块,用于对源节点中待迁移的存储单元中的全量数据进行复制处理;其中,所述源节点为所述数据库集群的多个节点中需要将所存储的数据迁移出的节点;
异步发送模块,用于将复制的所述全量数据异步发送至目标节点,以使所述目标节点加载所述全量数据;其中,所述目标节点为所述数据库集群中用于接收所述数据的节点;
差值确定模块,用于确定所述待迁移的存储单元的当前数据量与所述目标节点的已接收数据量之间的数据量差值;
分配模块,用于当所述数据量差值为零时,将所述待迁移的存储单元分配至所述目标节点。
本发明实施例提供一种电子设备,包括:
存储器,用于存储可执行指令;
处理器,用于执行所述存储器中存储的可执行指令时,实现本发明实施例提供的数据库集群的数据迁移方法。
本发明实施例提供一种计算机可读存储介质,存储有可执行指令,用于引起处理器执行时,实现本发明实施例提供的数据库集群的数据迁移方法。
本发明实施例具有以下有益效果:
本发明实施例通过对源节点待迁移的存储单元中的全量数据进行复制处理,将复制的全量数据以异步方式发送至目标节点,并以数据量差值作为是否分配待迁移的存储单元的标准,降低了数据迁移期间数据服务的延迟,提升了数据库集群线上服务的稳定性。
附图说明
图1是相关技术提供的迁移方案的一个流程示意图;
图2是相关技术提供的源节点故障的一个数据分布示意图;
图3是相关技术提供的目标节点故障的一个数据分布示意图;
图4是本发明实施例提供的数据库集群的数据迁移系统的一个可选的架构示意图;
图5是本发明实施例提供的结合区块链网络的数据迁移系统的一个可选的架构示意图;
图6是本发明实施例提供的服务器的一个可选的架构示意图;
图7A是本发明实施例提供的数据库集群的数据迁移方法的一个可选的流程示意图;
图7B是本发明实施例提供的数据库集群的数据迁移方法的一个可选的流程示意图;
图7C是本发明实施例提供的数据库集群的数据迁移方法的一个可选的流程示意图;
图8是本发明实施例提供的数据库集群的一个可选的示意图;
图9是本发明实施例提供的数据库集群的一个可选的示意图;
图10是本发明实施例提供的数据库集群的数据迁移方法的一个可选的示意图;
图11是本发明实施例提供的数据库集群的扩容示意图;
图12是本发明实施例提供的数据库集群的缩容示意图;
图13是本发明实施例提供的数据库集群的数据迁移方法的一个可选的流程示意图;
图14A是本发明实施例提供的Redis数据库集群扩容的一个可选的前端web界面示意图;
图14B是本发明实施例提供的配置变更界面的一个可选的示意图;
图14C是本发明实施例提供的扩容后的一个可选的前端web界面示意图;
图14D是本发明实施例提供的实例信息界面的一个可选的示意图;
图15A是本发明实施例提供的Redis数据库集群缩容的一个可选的前端web界面示意图;
图15B是本发明实施例提供的配置变更界面的一个可选的示意图;
图15C是本发明实施例提供的订单生成界面的一个可选的示意图;
图15D是本发明实施例提供的实例信息界面的一个可选的示意图。
具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,所描述的实施例不应视为对本发明的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。
除非另有定义,本文所使用的所有的技术和科学术语与属于本发明的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本发明实施例的目的,不是旨在限制本发明。
对本发明实施例进行进一步详细说明之前,对本发明实施例中涉及的名词和术语进行说明,本发明实施例中涉及的名词和术语适用于如下的解释。
1)数据库集群:数据库的分布式解决方案,通常通过多个节点来提供数据服务,在本发明实施例中,数据库集群可以是云数据库集群。
2)分片:一个数据库集群往往由多个分片组成,其中每个分片由一个主节点和至少一个从节点组成,从节点仅仅是主节点的备份。
3)存储单元:数据库集群的逻辑划分,也是数据管理和数据迁移的基本单位,数据库集群中的每一个节点拥有若干个存储单元。举例来说,Redis数据库集群在逻辑上被划分为16384个槽(存储单元)。
4)源节点:指需要将存储单元中的数据迁出的节点。
5)目标节点:指需要迁入存储单元及其中数据的节点。
6)区块链(Blockchain):由区块(Block)形成的加密的、链式的交易的存储结构。
7)区块链网络(Blockchain Network):通过共识的方式将新区块纳入区块链的一系列的节点的集合。
存储单元是数据库集群中进行数据管理的基本单位,对数据库集群进行扩容或缩容的过程,实际上是存储单元在分片之间迁移的过程。在相关技术提供的方案中,通常是以分批迁移的方式来实现数据迁移,为了便于说明,以Redis数据库集群举例,Redis官方提供的数据迁移方案如图1所示,这里将待迁出槽的主节点称为源节点,将待迁入槽的主节点称为目标节点,以步骤形式说明图1所示的数据迁移过程:
①管控端向目标节点发送命令cluster setslot{slot}importing{sourceNodeId},将目标节点待迁入的slot标记为importing状态。其中,管控端可以是终端设备,也可以是Redis数据库集群的管理服务器(管理系统)。
②管控端向源节点发送命令cluster setslot{slot}migrating{targetNodeId},将源节点中待迁出的槽标记为migrating状态。
③在源节点上执行命令cluster getkeysinslot{slot}{count},即确定源节点中待迁出的槽中的count个键(key)。
④在源节点上执行命令migrate{targetIp}{targetPort}“”0{timeout}KE YS{key}命令,将步骤③中确定出的key从源节点迁移到目标节点,并在源节点上删除相应的key。
⑤重复步骤③和步骤④,直到将源节点待迁出的槽中所有的key迁移到目标节点。
⑥向源节点和目标节点发送cluster setslot{slot}node{targetNodeId},通知已经将槽重新分配到了目标节点。
相关技术提供的数据迁移方案主要存在两个方面的问题,在第一方面,Redis是单线程架构,通过migrate命令迁移key时,图1中的第<4>至<8>步会阻塞住线程,即源节点无法对外提供读写服务。在此基础上,Redis使用键-值(key-value)形式来存储数据,其中value可以是string、list、hash、set及zset等复杂数据结构,故Redis的一个key-value可能会非常大,即存在大key。而通过migrate命令迁移一个大key的时间会比较长,经测试发现,迁移600兆(MB)大小的list类型key-value数据需要6.7秒,导致Redis本身具有的高吞吐低延迟特性无法实现,并且,在扩容或缩容过程中,Redis服务对外出现秒级的延迟显然是一个重大问题。同时,如果迁移key时阻塞线程的时长超出了Redis数据库集群节点间心跳消息的超时时长,也会导致节点被判死,整个Redis数据库集群出现不稳定。
第二方面,通过相关技术提供的方案,无法有效地保证数据一致性。具体地,如图2所示,源节点(节点2-1)的槽slot-x中的keyx1、keyx2及keyx3这3个key已被迁移到目标节点(节点2-3),若此时节点2-1故障,则节点2-1的从节点(节点2-2)会被自动提升为新的主节点,然而,节点2-2并不会继承节点2-1上的migrating标记,导致节点2-2无法获知本属于slot-x的keyx1、keyx2及keyx3这三个key存在于节点2-3上。当客户端发起这三个key中的任意一个或多个进行更新操作(包括删除操作)的请求时,该请求会被路由到源节点(节点2-1)上,但是在节点2-1上并不存在keyx1、keyx2及keyx3,即会导致该更新操作丢失。综上,在数据迁移的过程,若源节点发生故障,则slot迁移过程被终止,但此时slot上的key已经分布到了两个节点上,故需要手工修复将源节点上剩余的key搬迁到目标节点。然而,对于数据一致性要求较高的场景,由于整个流程已经出现了更新丢失,数据已经不一致,这种情形属于不可修复状态。
本发明实施例还提供了如图3所示的目标节点故障的示意图,在图3中,源节点(节点3-1)的slot-x上的keyx1、keyx2及keyx3这3个key已被迁移到目标节点(节点3-3),若此时节点3-3故障,则节点3-3的从节点(节点3-4)会被自动提升为新的主节点。但当客户端发起对keyx1、keyx2及keyx3这三个key中任意一个或多个进行更新操作(包括删除操作)的请求时,该请求会被重定向到原目标节点(节点3-3)上,然而节点3-3受故障影响,已无法访问,故同样会出现丢失更新的问题。
本发明实施例提供一种数据迁移方法、装置、电子设备及计算机可读存储介质,能够在数据迁移期间实现数据服务的及时响应,并提升数据迁移过程中的数据一致性,下面说明本发明实施例提供的电子设备的示例性应用。本发明实施例提供的电子设备可以是物理服务器,也可以是部署在云端的虚拟服务器。
参见图4,图4是本发明实施例提供的数据库集群的数据迁移系统100的一个可选的架构示意图,为实现支撑一个数据库集群的数据迁移应用,终端设备400(示例性示出了终端设备400-1和终端设备400-2)通过网络300连接服务器200,网络300可以是广域网或者局域网,又或者是二者的组合。值得说明的是,这里的服务器200可以是物理服务器,也可以是虚拟服务器。图4示出了服务器200-1、服务器200-2、服务器200-3及服务器200-4,其中,服务器200-1、服务器200-2及服务器200-3运行在集群模式下,通过将服务器的资源(如存储资源)进行抽象而形成数据库集群中的节点,例如通过虚拟化技术(如虚拟机技术及容器技术等)对服务器资源进行抽象。也即是说,数据库集群中的节点可以是对一个或多个服务器的资源进行虚拟化的封装而形成,当然,一个服务器也可对该服务器内的资源进行抽象,而形成一个或多个节点。本发明实施例中的多个指的是至少两个。
终端设备400通过与服务器200连接,从而访问数据库集群500所提供的数据服务,具体可包括数据写入及数据读取等服务。数据库集群500可为不同的终端设备提供不同容量上限的数据服务,例如为终端设备400-1提供容量上限为15吉字节(GB)的数据服务(即终端设备400-1在数据库集群500中,存储数据的容量上限15GB),为终端设备400-2提供容量上限为20GB的数据服务。
当终端设备400的用户发现容量上限与实际的业务需求不符时,可通过终端设备400生成容量更新请求,从而实现对数据库集群500的扩容或缩容。数据库集群500的管控端根据容量更新请求,确定数据库集群500中的源节点及待迁移的存储单元,同时在数据库集群500中创建目标节点,这里的管控端可以是终端设备400,也可以是数据库集群500中的管理服务器(管理系统),管理服务器可以是服务器200-1~服务器200-4中的任意一个服务器,也可以是新增的服务器。在图4中,以扩容的情况进行举例,将对服务器200-1、服务器200-2及服务器200-3的资源进行抽象所形成的节点作为源节点,同时启动服务器200-4,将服务器200-4加入数据库集群500,并将对服务器200-4的资源进行抽象所形成的节点,作为新创建的目标节点。
在数据迁移的过程中,源节点首先对待迁移的存储单元中的全量数据进行复制,并将复制的全量数据以异步形式发送至目标节点。源节点在发送复制的全量数据期间,将因更新操作产生的增量数据保存至复制积压缓冲区,并在发送完成复制的全量数据后,同样以异步方式发送复制积压缓冲区的增量数据,在源节点待迁移的存储单元中的当前数据量与目标节点的已接收数据量相等时,将源节点待迁移的存储单元分配至目标节点。服务器200在完成容量更新后,可将更新结果返回至终端设备400,以使终端设备400的用户获知。
在图4中,若每个服务器对应一个主节点,则对数据库集群500进行扩容的结果为,从包括三个主节点的数据库集群500更新为了包括四个主节点的数据库500。终端设备400可以在图形界面410(示例性示出了图形界面410-1和图形界面410-2)中显示数据迁移过程中的各种结果,在图4中以将15GB的容量上限扩容为20GB的情况进行举例说明。
本发明实施例的数据库集群500具有高吞吐低延迟的特性,可应用于需要数据服务的各种应用场景,例如可作为即时通信应用的后台数据库,以分布式的存储架构,存储因即时通信而产生的通信记录及即时通信应用的用户信息等,又例如可作为游戏应用的后台数据库,以存储游戏应用中的帐号信息及游戏装备信息等。当用户需要访问数据库集群500中的数据时,可通过数据库集群500对应的前端界面发起包括键的访问请求,其中,键如某个即时通信帐号或游戏帐号的账号名。数据库集群500的管控端对访问请求中的键进行映射处理,得到该键对应的目标存储单元,并将访问请求定位到数据库集群500中包括该目标存储单元的节点,由该节点在对应的数据库中查询与该键对应的值,并将该值发送至前端界面呈现,其中,值如即时通信帐号对应的通信记录,或者游戏帐号对应的金币信息等。值得说明的是,数据库集群500内通常具有主节点和作为备份的从节点,为了减少主节点的处理压力,可设定从节点用于响应访问请求,主节点用于响应写入数据的请求,实现读写分离。
本发明实施例也可结合区块链技术实现,区块链(Blockchain)是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。区块链本质上是一个去中心化的数据库,是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一批次网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块。区块链可以包括区块链底层平台、平台产品服务层以及应用服务层。
区块链底层平台可以包括用户管理、基础服务、智能合约以及运营监控等处理模块。其中,用户管理模块负责所有区块链参与者的身份信息管理,包括维护公私钥生成(账户管理)、密钥管理以及用户真实身份和区块链地址对应关系维护(权限管理)等,并且在授权的情况下,监管和审计某些真实身份的交易情况,提供风险控制的规则配置(风控审计);基础服务模块部署在所有区块链节点设备上,用来验证业务请求的有效性,并对有效请求完成共识后记录到存储上,对于一个新的业务请求,基础服务先对接口适配解析和鉴权处理(接口适配),然后通过共识算法将业务信息加密(共识管理),在加密之后完整一致的传输至共享账本上(网络通信),并进行记录存储;智能合约模块负责合约的注册发行以及合约触发和合约执行,开发人员可以通过某种编程语言定义合约逻辑,发布到区块链上(合约注册),根据合约条款的逻辑,调用密钥或者其它的事件触发执行,完成合约逻辑,同时还提供对合约升级注销的功能;运营监控模块主要负责产品发布过程中的部署、配置的修改、合约设置、云适配以及产品运行中的实时状态的可视化输出,例如:告警、监控网络情况、监控节点设备健康状态等。
参见图5,图5是本发明实施例提供的结合区块链网络的数据迁移系统110的一个可选的架构示意图,包括区块链网络600(示例性地示出了节点610-1至节点610-3)、认证中心700及数据库集群500(示出了归属于数据库集群500的电子设备,电子设备可以是服务器,这里以电子设备包括图4中的服务器200-1及服务器200-4为例),下面分别进行说明。
区块链网络600的类型是灵活多样的,例如可以为公有链、私有链或联盟链中的任意一种。以公有链为例,任何数据库集群500的电子设备例如终端设备和服务器,都可以在不需要授权的情况下接入区块链网络600;以联盟链为例,数据库集群500在获得授权后其下辖的电子设备(例如服务器)可以接入区块链网络600,此时,成为区块链网络600中的一类特殊的节点即客户端节点。
需要指出地,客户端节点可以只提供支持业务系统发起交易(例如,用于上链存储数据或查询链上数据)功能,对于区块链网络600的原生节点的功能,例如下文的排序功能、共识服务和账本功能等,客户端节点可以缺省或者有选择性(例如,取决于业务系统的具体业务需求)地实现。从而,可以将数据库集群500的数据和业务处理逻辑最大程度迁移到区块链网络600中,通过区块链网络600实现数据和业务处理过程的可信和可追溯。
区块链网络600接收来自数据库集群(例如图5中示出的数据库集群500)的客户端节点(例如,图5中示出的归属于数据库集群500的服务器200-1及服务器200-4)提交的交易,执行交易以更新账本或者查询账本。
下面以数据库集群接入区块链网络以实现当前数据量的上链为例,说明区块链网络的示例性应用。
数据库集群500的服务器200-1接入区块链网络600,成为区块链网络600的客户端节点,同时,在数据库集群500内,服务器200-1对应数据迁出的源节点。服务器200-1在向对应目标节点的服务器200-4发送待迁移的存储单元中的数据时,可每隔固定的时间间隔(如1秒),将当前时间戳及待迁移的存储单元中的当前数据量以交易形式发送至区块链网络,在交易中指定实现提交操作需要调用的智能合约以及向智能合约传递的参数,交易还携带了服务器200-1签署的数字签名(例如,使用服务器200-1的数字证书中的私钥,对交易的摘要进行加密得到),并将交易广播到区块链网络600。其中,当前时间戳可以是网络时间或服务器200-1的本地时间,数字证书可由服务器200-1向认证中心700进行登记注册得到。
区块链网络600中的节点610在接收到交易时,对交易携带的数字签名进行验证,数字签名验证成功后,根据交易中携带的服务器200-1的身份标识,确认服务器200-1是否是具有交易权限,数字签名和权限验证中的任何一个验证判断都将导致交易失败。验证成功后签署节点610自己的数字签名,并继续在区块链网络600中广播。
区块链网络600中具有排序功能的节点610接收到验证成功的交易后,将交易填充到新的区块中,并广播到区块链网络中600提供共识服务的节点。
区块链网络600中的提供共识服务的节点610对新区块进行共识过程以达成一致,提供账本功能的节点将新区块追加到区块链的尾部,并执行新区块中的交易:对于提交当前时间戳及当前数据量的交易,将当前时间戳及当前数据量以键值对的形式存储至状态数据库。同理,数据库集群500的服务器200-4也可每隔固定的时间间隔,将当前时间戳及已接收数据量以交易形式发送至区块链网络,以使区块链网络600的节点610将包括该交易的新区块追加至区块链的尾部,并将当前时间戳及已接收数据量以键值对的形式存储至状态数据库。
下面以数据库集群500接入区块链网络以实现数据量差值的查询为例,说明区块链网络的示例性应用。
区块链网络600的节点610根据预先部署的智能合约,将区块链中存储的符合同一时间戳的当前数据量减去已接收数据量,得到数据量差值,并将数据量差值与该时间戳存储至区块链及状态数据库中。服务器200-1或服务器200-4在需要获取数据量差值时,生成查询数据量差值的交易,同时在交易中指定了实现查询操作需要调用的智能合约以及向智能合约传递的参数,交易还携带了当前时间戳及数字签名(由服务器200-1或服务器200-4签署)。然后,服务器200-1或服务器200-4将交易广播到区块链网络600,区块链网络的节点610经验证、区块填充及共识一致后,提供账本功能的节点610将形成的新区块追加到区块链的尾部,并执行新区块中的交易:对于查询数据量差值的交易,根据交易携带的当前时间戳,从状态数据库中查询与该当前时间戳对应的数据量差值,并将该数据量差值发送至服务器200-1或服务器200-4。值得说明的是,状态数据库中存储的数据通常与区块链存储的数据相同,在响应查询交易时,优先根据状态数据库中的数据进行响应,从而提升响应效率。此外,当在状态数据库及区块链中均未查询到与交易中的当前时间戳对应的数据量差值时,将最近存储的数据量差值及对应的时间戳返回至交易的发起方。
下面继续说明本发明实施例提供的电子设备的示例性应用。电子设备可以实施为笔记本电脑,平板电脑,台式计算机,机顶盒,移动设备(例如,移动电话,便携式音乐播放器,个人数字助理,专用消息设备,便携式游戏设备)等各种类型的终端设备,也可以实施为各种类型的服务器,例如物理服务器,又例如使用虚拟化技术搭建的虚拟服务器。
下面,以电子设备为服务器为例进行说明。参见图6,图6是本发明实施例提供的服务器200(例如,可以是图4所示的服务器200)的架构示意图,图6所示的服务器200包括:至少一个处理器210、存储器240和至少一个网络接口220。服务器200中的各个组件通过总线系统230耦合在一起。可理解,总线系统230用于实现这些组件之间的连接通信。总线系统230除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图6中将各种总线都标为总线系统230。
处理器210可以是一种集成电路芯片,具有信号的处理能力,例如通用处理器、数字信号处理器(DSP,Digital Signal Processor),或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等,其中,通用处理器可以是微处理器或者任何常规的处理器等。
存储器240可以是可移除的,不可移除的或其组合。示例性的硬件设备包括固态存储器,硬盘驱动器,光盘驱动器等。存储器240可选地包括在物理位置上远离处理器210的一个或多个存储设备。
存储器240包括易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。非易失性存储器可以是只读存储器(ROM,Read Only Memory),易失性存储器可以是随机存取存储器(RAM,Random Access Memory)。本发明实施例描述的存储器240旨在包括任意适合类型的存储器。
在一些实施例中,存储器240能够存储数据以支持各种操作,这些数据的示例包括程序、模块和数据结构或者其子集或超集,下面示例性说明。
操作系统241,包括用于处理各种基本系统服务和执行硬件相关任务的系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务;
网络通信模块242,用于经由一个或多个(有线或无线)网络接口220到达其他计算设备,示例性的网络接口220包括:蓝牙、无线相容性认证(WiFi)、和通用串行总线(USB,Universal Serial Bus)等。
在一些实施例中,本发明实施例提供的数据库集群的数据迁移装置可以采用软件方式实现,图6示出了存储在存储器240中的数据库集群的数据迁移装置243,其可以是程序和插件等形式的软件,包括以下软件模块:复制模块2431、异步发送模块2432、差值确定模块2433及分配模块2434,这些模块是逻辑上的,因此根据所实现的功能可以进行任意的组合或进一步拆分。将在下文中说明各个模块的功能。
在另一些实施例中,本发明实施例提供的数据库集群的数据迁移装置可以采用硬件方式实现,作为示例,本发明实施例提供的数据库集群的数据迁移装置可以是采用硬件译码处理器形式的处理器,其被编程以执行本发明实施例提供的数据库集群的数据迁移方法,例如,硬件译码处理器形式的处理器可以采用一个或多个应用专用集成电路(ASIC,Application Specific Integrated Circuit)、DSP、可编程逻辑器件(PLD,ProgrammableLogic Device)、复杂可编程逻辑器件(CPLD,Complex Programmable Logic Device)、现场可编程门阵列(FPGA,Field-Programmable Gate Array)或其他电子元件。
本发明实施例提供的数据库集群的数据迁移方法可以由上述的服务器执行,或者由服务器和终端设备共同执行。
下面将结合上文记载的电子设备的示例性应用和结构,说明电子设备中通过嵌入的数据库集群的数据迁移装置,而实现数据库集群的数据迁移方法的过程。
参见图7A,图7A是本发明实施例提供的数据库集群的数据迁移方法的一个可选的流程示意图,为了便于理解,以图4中服务器200-1对应源节点,服务器200-4对应目标节点的情况举例,并结合图7A示出的步骤进行说明。
在步骤101中,源节点对待迁移的存储单元中的全量数据进行复制处理。
数据库集群由多个分片构成,其中每个分片由一个主节点和至少一个从节点组成,其中,从节点仅是主节点的备份,且每一个主节点包括若干个存储单元。在数据库集群中,每个分片拥有的存储单元数量遵循均衡原则,如此使得每个分片上分布的key数量尽量相当。当对数据库集群进行容量更新时,分片的数量会增加或减少,故需要将某些分片上的存储单元迁移到其它分片,即进行数据迁移,以维持各分片上存储单元数量的均衡。
数据迁移涉及到数据库集群中的源节点及目标节点,其中,源节点是数据库集群的多个节点中需要将所存储的数据迁移出的节点,目标节点是数据库集群中用于接收迁出的数据的节点。在进行数据迁移时,源节点对待迁移的存储单元中的全量数据进行复制处理,以在数据迁移期间,保证源节点待迁移的存储单元中的数据的完整性。值得说明的是,数据可以是键值对数据。
在步骤102中,源节点将复制的全量数据异步发送至目标节点。
这里,源节点将复制的全量数据以异步形式发送至目标节点,通过异步发送的方式,可有效避免线程阻塞,使得在数据迁移期间,源节点仍能向外提供读写服务。
在一些实施例中,可以通过这样的方式来实现上述的源节点将复制的全量数据异步发送至目标节点:将复制的全量数据写入至发送缓冲区,直至发送缓冲区被写满;其中,发送缓冲区用于将写入的数据发送至目标节点;对发送缓冲区进行监测,并当发送缓冲区可写时,将未写入的全量数据写入至发送缓冲区,直至所有的全量数据写入完毕。
这里,异步发送的一种具体实现方式为,源节点将复制的全量数据写入至网络发送缓冲区,在发送缓冲区被写满时返回。同时,源节点对发送缓冲区进行监测,当监测到发送缓冲区可写时,将未写入的全量数据写入至发送缓冲区,重复上述过程,直至所有的全量数据写入完毕。通过上述方式,源节点将发送数据交由发送缓冲区完成,源节点本身只需将数据异步写入发送缓冲区即可,如此,在源节点不会发生线程阻塞的情况,提升了源节点提供服务的稳定性。
在步骤103中,目标节点将接收到的全量数据加载至内存。
目标节点在接收到复制的全量数据时,将复制的全量数据加载至内存。
在步骤104中,源节点确定待迁移的存储单元的当前数据量与目标节点的已接收数据量之间的数据量差值。
这里,源节点确定待迁移的存储单元的当前数据量与目标节点的已接收数据量之间的数据量差值,并根据数据量差值来确定数据迁移的进度,数据量差值可以实时确定,也可以每隔固定的时间间隔确定。值得说明的是,本发明实施例中数据量的单位可以是字节数。举例来说,当待迁移的存储单元的当前数据量为1GB,目标节点的已接收数据量为256MB时,可确定数据迁移的进度为25%。
在一些实施例中,可以通过这样的方式来实现上述的确定待迁移的存储单元的当前数据量与目标节点的已接收数据量之间的数据量差值:源节点获取目标节点反馈的已接收数据量;将待迁移的存储单元的当前数据量减去已接收数据量,得到数据量差值。
这里,目标节点在接收源节点发送的数据时,可以实时或间隔性地向源节点反馈已接收数据量。源节点将待迁移的存储单元的当前数据量,减去获取到的已接收数据量,得到数据量差值。通常来说,当前数据量总是大于或等于已接收数据量,即数据量差值存在正数及零两种数值情况。通过计算数据量差值,可有效地确定数据迁移的情况,进而判断是否执行相应的操作。
在一些实施例中,可以通过这样的方式来实现上述的确定待迁移的存储单元的当前数据量与目标节点的已接收数据量之间的数据量差值:将当前时间戳及待迁移的存储单元的当前数据量发送至区块链网络,以使区块链网络的节点将当前时间戳及当前数据量填充至新区块,并在对新区块共识一致后,将新区块追加至区块链的尾部;向区块链网络发送差值查询请求,以获取区块链存储的数据量差值;其中,区块链网络的节点用于根据部署的智能合约,将当前数据量减去区块链中符合当前时间戳的已接收数据量,得到数据量差值。
本发明实施例还提供了通过区块链网络确定数据量差值的方式,具体地,在源节点向目标节点发送了数据后,源节点可以间隔性地将当前时间戳及待迁移的存储单元的当前数据量以交易形式发送至区块链网络,区块链网络的节点对交易进行验证、区块填充及共识,在共识一致时,区块链网络的节点将包括该交易的新区块追加至区块链的尾部,同时在状态数据库中以键值对的形式存储当前时间戳及当前数据量。同时,目标节点也可以间隔性地将当前时间戳及已接收数据量以交易形式发送至区块链网络,区块链网络同样将包括当前时间戳及已接收数据量的新区块追加至区块链的尾部,同时在状态数据库中以键值对的形式存储当前时间戳及已接收数据量。
区块链网络的节点根据预先部署的智能合约,将区块链中同一时间戳对应的当前数据量减去已接收数据量,得到数据量差值,并将该时间戳及数据量差值存储至区块链及状态数据库中。源节点或目标节点可根据当前时间戳向区块链网络发送差值查询请求,区块链网络的节点在接收到差值查询请求时,优先从状态数据库中查询与当前时间戳对应的数据量差值,当未查询到时,从区块链中查询与当前时间戳对应的数据量差值,若还未查询到(如某个节点未及时向区块链网络反馈数据量,或区块链网络的节点未及时计算数据量差值),则将区块链中最近存储的数据量差值及对应的时间戳发送至差值查询请求的发起方。通过结合区块链网络的方式确定数据量差值,提升了计算出的数据量差值的准确性,并且,区块链中存储了当前数据量、已接收数据量、数据量差值以及时间戳,存储数据的全面性高,可便于相关人员查看并验证不同时间戳的数据迁移状态,方便进一步对数据迁移的相关设置进行调整,如增大发送缓冲区的容量等。
在步骤105中,当数据量差值为零时,源节点将待迁移的存储单元分配至目标节点。
当确定出的数据量差值为零时,证明待迁移的存储单元中的所有数据都迁移完毕,源节点将待迁移的存储单元分配至目标节点。由于源节点在步骤101中发送的是复制的数据,故即使在数据迁移过程中出现源节点或目标节点故障的情况,客户端(终端设备)访问的也都是完整的存储单元,提升了数据一致性。
在一些实施例中,在任意步骤之间,还包括:管控端获取对数据库集群中数据的访问请求;对访问请求中的键进行映射处理,得到键对应的目标存储单元;将访问请求定位至包括目标存储单元的节点,以使包括目标存储单元的节点确定目标存储单元中与键对应的值。
这里,管控端可以是终端设备,也可以是数据库集群中的服务器。管控端在获取到对数据库集群中数据的访问请求时,对访问请求中的键进行映射处理,得到键对应的目标存储单元。以Redis数据库集群为例,映射公式为:slot=CRC16(key)&16383,其中,CRC是指循环冗余校验。管控端可以在本地维护数据库集群中存储单元与节点之间的映射关系,并根据数据迁移的情况实时更新该映射关系,在确定出目标存储单元后,管控端根据映射关系,将访问请求定位至包括目标存储单元的节点,以使包括目标存储单元的节点确定目标存储单元中与键对应的值,并将该值返回。
值得说明的是,若目标存储单元是源节点中待迁移的存储单元,则在步骤104之前,管控端将访问请求定位至源节点;在步骤104之后,管控端将访问请求定位至目标节点。通过上述方式,实现了访问请求的针对性路由,提升了数据访问的准确性。
通过发明实施例对于图7A的上述示例性实施可知,本发明实施例通过异步发送的方式,在源节点与目标节点之间同步数据,使得源节点能在数据迁移期间向外提供读写服务,同时也提升了待迁移的存储单元中的数据完整性。
在一些实施例中,参见图7B,图7B是本发明实施例提供的数据迁移方法的一个可选的流程示意图,基于图7A,在步骤102之前,还可以在步骤201中,创建复制积压缓冲区,以存储对源节点进行更新操作所产生的增量数据。
在发送全量数据的期间,源节点待迁移的存储单元中的数据可能会更新,故在本发明实施例中,为了提升数据迁移的准确性,在源节点创建复制积压缓冲区(outputbuffer),以存储在复制全量数据之后的、对源节点进行更新操作所产生的增量数据,其中,更新操作如写入操作。
基于图7A,在步骤102之后,还可以在步骤202中,当目标节点加载完成复制的全量数据时,将复制积压缓冲区内的增量数据异步发送至目标节点。
当目标节点加载完成复制的全量数据时,可向源节点发送加载完成的提示。源节点在接收到该提示时,将复制积压缓冲区内的增量数据同样以异步形式发送至目标节点。
在步骤203中,目标节点将接收到的增量数据加载至内存。
这里,目标节点将增量数据加载至内存。
基于图7A,在步骤105之前,还可以在步骤204中,当数据量差值小于数据量阈值时,暂停执行对源节点的写入操作。
当数据量差值小于数据量阈值时,源节点准备进行待迁移的存储单元的分配,暂停执行对源节点的写入操作,从而避免产生新的增量数据。
在图7B中,图7A示出的步骤105可更新为步骤205~步骤206,在步骤205中,当数据量差值为零时,源节点删除待迁移的存储单元。
当源节点完成待迁移的存储单元中所有数据的迁移,即数据量差值为零时,源节点删除其拥有的待迁移的存储单元以及该存储单元中的数据。
在步骤206中,目标节点导入待迁移的存储单元。
这里,目标节点导入待迁移的存储单元,以使对待迁移的存储单元中的数据的访问请求能被成功地路由至目标节点。
通过发明实施例对于图7B的上述示例性实施可知,本发明实施例通过异步方式发送全量数据及增量数据,提升了数据迁移的完整性,并且,通过在源节点删除待迁移的存储单元,在目标节点导入待迁移的存储单元,实现了待迁移的存储单元的有效分配。
在一些实施例中,参见图7C,图7C是本发明实施例提供的数据迁移方法的一个可选的流程示意图,为了便于理解,以服务器200-1对应源节点,服务器200-4对应目标节点,管控端为终端设备400的情况举例,当然,管控端还可为数据库集群中的服务器,例如服务器200-1~200-4中的任意一个服务器,还可以是新增的用于管理数据库集群的服务器。基于图7A,在图7A示出的步骤101之前,还可以在步骤301中,管控端获取对数据库集群的容量更新请求。
这里,数据库集群的用户可根据实际的业务情况,发起容量更新请求。例如,当数据库集群提供的数据容量上限不足,无法满足业务需求时,在终端设备发起扩容请求;当数据库集群提供的数据容量上限过高时,在终端设备发起缩容请求。
在步骤302中,管控端根据容量更新请求确定源节点及待迁移的存储单元。
这里,管控端基于存储单元的均衡原则,在数据库集群中选取至少一个主节点作为源节点,并确定源节点中待迁移的存储单元,在图8中以选取的主节点为服务器200-1举例。
在一些实施例中,可以通过这样的方式来实现上述的管控端根据容量更新请求确定源节点及待迁移的存储单元:管控端确定容量更新请求对应的请求分片数量;确定数据库集群的存储单元总数,并将存储单元总数除以请求分片数量,得到平均存储单元数量;在数据库集群包括的多个主节点中选取至少一个主节点以作为源节点,并在源节点中确定待迁移的存储单元,以使在对待迁移的存储单元的分配完成后,数据库集群中各主节点的存储单元数量为平均存储单元数量。
这里,容量更新请求可能包括有请求分片数量,也可能包括的是请求容量上限,对于后一种情况,管控端将请求容量上限除以每个分片的分片规格容量,得到请求分片数量,例如请求容量上限为20GB,分片规格容量为4GB,则请求分片数量为5个。然后,管控端确定数据库集群内已有的存储单元总数,其中,已有的存储单元是指已提供数据服务的存储单元。遵循存储单元的均衡原则,管控端将存储单元总数除以请求分片数量,得到每个主节点应当拥有的平均存储单元数量。
根据平均存储单元数量,管控端在数据库集群包括的多个主节点中选取至少一个主节点以作为源节点,并在源节点中确定待迁移的存储单元,以使在对待迁移的存储单元的分配完成后,数据库集群中各主节点的存储单元数量为平均存储单元数量。通过上述方式,有效地实现了存储单元均衡。
在一些实施例中,可以通过这样的方式来实现上述的在数据库集群包括的多个主节点中选取至少一个主节点以作为源节点,并在源节点中确定待迁移的存储单元:当请求分片数量大于数据库集群的已有分片数量时,管控端将存储单元数量超过平均存储单元数量的主节点,确定为源节点,并在源节点中选取待迁移的存储单元,直至源节点中剩余的存储单元数量为平均存储单元数量;当请求分片数量小于已有分片数量时,将数据库集群中各分片的主节点确定为源节点,并将源节点中的存储单元均确定为待迁移的存储单元。
根据不同的容量更新请求,管控端执行不同的源节点选取方式。具体地,当请求分片数量大于数据库集群的已有分片数量时,证明容量更新请求为扩容请求,管控端将存储单元数量超过平均存储单元数量的主节点,确定为源节点,并在源节点中选取待迁移的存储单元,直至源节点中剩余的存储单元数量为平均存储单元数量。例如,数据库集群包括主节点1、2和3,存储单元数量依次为3、3和4,当请求分片数量为5时,得到平均存储单元数量为2,将主节点1、2和3均确定为源节点,并在主节点1和2中均选取1个存储单元作为待迁移的存储单元,在主节点3中选取2个存储单元作为待迁移的存储单元。选取待迁移的存储单元的方式可以是随机选取。
在另一种情况,即请求分片数量小于已有分片数量,容量更新请求为缩容请求时,与相关技术提供的方案(选取数据库集群原有的部分主节点作为源节点)不同的是,在本发明实施例中,将数据库集群中各分片的主节点均确定为源节点,并将源节点中的存储单元均确定为待迁移的存储单元,以保证数据库集群原有的主节点提供服务的稳定性,避免将大量数据加载至数据库集群原有的主节点所导致的线程阻塞。通过上述方式,提升了对于不同容量更新请求的灵活性,特别对于缩容请求,提升了数据迁移期间线上服务的稳定性。
在一些实施例中,步骤105之后,还包括:当请求分片数量小于已有分片数量时,管控端对已分配待迁移的存储单元的源节点进行删除处理。
对于容量更新请求是缩容请求的情况,在完成待迁移的存储单元的分配后,源节点不再拥有存储单元,故管控端对源节点进行删除处理,以提升数据库集群的精简程度,提升数据维护的简易性。
在步骤303中,管控端在数据库集群中创建符合容量更新请求的目标节点。
与步骤302同时地,管控端在数据库集群中创建符合容量更新请求的目标节点,以使得在完成待迁移的存储单元的分配后,数据库集群中各主节点的存储单元数量相同。值得说明的是,这里的相同指的是尽量相同,例如在数据库集群包括13个存储单元及4个主节点的情况下,无法实现存储单元的严格均衡,即某个主节点会拥有4个存储单元。
在一些实施例中,可以通过这样的方式来实现上述的管控端在数据库集群中创建符合容量更新请求的目标节点:管控端确定容量更新请求对应的请求分片数量;当请求分片数量大于数据库集群的已有分片数量时,将请求分片数量减去已有分片数量,得到扩容分片数量,并在数据库集群中,创建数量与扩容分片数量相符的新节点以作为目标节点;当请求分片数量小于已有分片数量时,在数据库集群中,创建数量与请求分片数量相符的新节点以作为目标节点。
同样地,管控端确定容量更新请求对应的请求分片数量,当请求分片数量大于数据库集群的已有分片数量,即容量更新请求为扩容请求时,将请求分片数量减去已有分片数量,得到扩容分片数量,并在数据库集群中,创建数量与扩容分片数量相符的新节点以作为目标节点,这里的新节点为主节点。
当请求分片数量小于数据库集群的已有分片数量,即容量更新请求为缩容请求时,与相关技术提供的方案(将数据库集群原有的部分主节点作为目标节点)不同的是,在本发明实施例中,创建数量与请求分片数量相符的新节点以作为目标节点。由于创建的目标节点不需要立刻提供数据服务,故就算目标节点因加载大量数据而导致线程阻塞,数据库集群所提供的数据服务也不会受到不利影响。
在确定源节点及待迁移的存储单元,并创建目标节点后,进行的步骤101~步骤105与图7A对应的内容类似,在此不做赘述。
通过发明实施例对于图7C的上述示例性实施可知,本发明实施例根据均衡原则在数据库集群确定源节点,并创建目标节点,提升了线上数据服务的稳定性,使得数据迁移过程无缝、隐性地进行。
下面,将说明本发明实施例在一个实际的应用场景中的示例性应用。为了便于理解,以Redis数据库集群进行举例说明。
Redis是一种基于内存的key-value数据库,Redis数据库集群(cluster)是Redis的分布式解决方案。一个Redis数据库集群由多个分片构成,其中每个分片由一个主节点和至少一个从节点组成,其中从节点仅仅是主节点的备份,本发明实施例提供了如图8所示的数据库集群示意图,示出了一个3分片的Redis数据库集群。
一个Redis数据库集群在逻辑上被划分为16384个槽(slot),写入到Redis中的每个key都会映射到其中的一个slot上,映射公式为:slot=CRC16(key)&16383,故一个slot不可能同时存在于多个节点上,在图8中,将Redis数据库集群示例性地划分为10个slot。
Redis数据库集群的每个分片上分布的slot数量基本均衡,如此,能够使每个分片上分布的key数量尽量相当。当对Redis数据库集群进行扩容或缩容时,分片的数量会增加或减少,故需要将某些分片上的slot迁移到其它分片以维持各分片上slot数量的均衡,slot也可以看作是Redis数据库集群管理的基本单位。
在将图8所示的数据库集群扩展至5分片时,为了保持每个分片上的slot数量相同,将slot2和slot5迁移到新创建的分片-3上,将slot-8和slot-9迁移到新创建的分片-4上,得到如图9所示的数据库集群。当然图8的3分片数据库集群也可看作是图9的5分片数据库集群进行缩容的结果。综上,扩容与缩容在本质上都是slot在分片之间迁移的过程。
在相关技术提供的方案中,存在线程阻塞以及数据不一致的问题,针对于此,本发明实施例提供了基于slot全量同步与增量同步相结合的数据迁移方法,如图10所示,下面以步骤形式进行说明:
①目标节点向源节点发出待同步slot的请求,其中,待迁移的slot对应上文中待迁移的存储单元,在图10中以slot-x举例。
②源节点启动子进程,并在子进程中将slot-x上的所有key-value数据生成RDB格式的全量数据文件,其中,RDB格式是Redis提供的一种数据持久化技术,指在固定的时间间隔内将内存中的数据快照写入磁盘所得到的文件格式。同时,源节点创建output buffer(对应上文的复制积压缓冲区),将生成全量数据文件之后,对源节点的slot-x进行更新操作所产生的增量数据,缓存一份至output buffer中。
③全量数据文件准备好后,源节点以异步的方式向目标节点发送全量数据文件,即每次将网络发送缓冲区写满后就立即返回,等到下次网络发送缓冲区可写时再发送一部分数据,直到发送完整个全量数据文件。通过该种方式,发送全量数据文件的过程不会阻塞线程,也不会影响源节点对外提供的读写服务。
④目标节点接收到全量数据文件后,加载全量数据文件到内存。加载全量数据文件的过程相对而言用时较长,但数据库集群中的目标节点都是新创建(新加入)的节点,目标节点不需要立刻对外提供读写服务,故不会对数据库集群的线上服务造成不利影响。
⑤目标节点加载完全量数据文件后,源节点开始与目标节点之间同步增量数据,即持续以异步的方式将源节点的output buffer中的增量数据发送到目标节点。
⑥当源节点与目标节点完全同步后,将slot-x分配到目标节点,客户端对该slot的读写访问请求也会自动地路由到目标节点。
本发明实施例提供的数据迁移方式是完全异步迁移,并不会因大key问题而阻塞线程。在slot迁移完成前,客户端对待迁移的slot上key的访问只会路由到源节点,待迁移的slot成功迁移后,客户端对待迁移的slot上key的访问才会路由到目标节点。在slot迁移的过程中,仅仅是复制源节点的key,而不会删除源节点的key,故即使在slot迁移的过程中源节点或目标节点故障,客户端所访问的都是完整的slot,不会出现同一个slot上的部分key分布在一个节点,另一部分key分布在另一节点这样的情况,即不会出现相关技术提供的方案中的数据不一致的情况。
下面以图示说明数据库集群扩容及缩容的过程,本发明实施例提供了如图11所示的扩容示意图,在图11中,仅示出了各分片的主节点。对于扩容场景,先增加新节点,根据最终每个分片上slot数量的均衡原则,确定出哪些slot需要从原节点迁移到新的节点,然后依次迁移完成slot。例如在图11中,增加的新节点为主节点4和主节点5,并根据均衡原则,确定出需要将节点1、节点2及节点3中的部分slot迁移至节点4,同时也需要将节点1、节点2及节点3中的部分slot迁移至节点5。
本发明实施例提供了如图12所示的缩容示意图,同样仅示出了各分片的主节点。对于缩容场景,相较于相关技术中将原有的主节点确定为目标节点,在本发明实施例中,先增加新的主节点作为目标节点,再将slot从原节点迁移到新的主节点。例如在图12中,目标是将5分片的数据库集群缩容到3分片,则先创建新节点1、新节点2及新节点3,再根据slot数量的均衡原则,确定将原节点1、原节点2及原节点3中的slot迁移至新节点1,将原节点3及原节点4中的slot迁移至新节点2,将原节点4及原节点5中的slot迁移至新节点3。如此,由于新节点不需要立刻向外提供数据服务,故就算新节点因加载全量数据文件导致线程阻塞,其也不会对数据库集群的数据服务造成不利影响。
为了便于理解数据迁移的过程,本发明实施例提供如图13所示的数据迁移时序图,为了便于理解,以步骤形式进行说明:
(0)管控端添加新节点,确定待迁移的slot。
这里,管控端可以是终端设备,也可以是用于管理Redis数据库集群的服务器。在获取到对Redis数据库集群的容量更新请求时,管控端根据槽数量均衡的原则,将Redis数据库集群内的至少一个主节点确定为源节点,并进一步确定源节点中待迁移的slot,同时,管控端在数据库集群中添加新的主节点作为目标节点。
(1)管控端向目标节点下发slot同步命令。
管控端发起异步迁移操作,具体地,管控端向目标节点下发cluster slotsync[slot……]的同步命令。
(2)在目标节点上将要导入的slot标记为importing状态。
目标节点在接收到slot同步命令后,将待迁移的slot标记为importing状态。
(3)反馈。
目标节点完成标记后,反馈相应的成功消息至管控端。
(4)目标节点向源节点发送命令,请求同步slot数据。
从步骤(4)开始,进入全量数据同步阶段。目标节点向源节点发送sync[slot……]的命令,以请求源节点中待迁移的slot中的数据。
(5)创建复制积压缓冲区。
源节点在本地创建复制积压缓冲区,即createReplicationBacklog,用于存储增量数据。
(6)源节点生成指定slot数据的一致性快照全量数据。
这里,源节点对待迁移的slot中的全量数据进行复制处理,即startBgsaveForReplication,得到一致性快照全量数据。
(7)向目标节点异步发送全量数据。
源节点以异步形式,向目标节点发送一致性快照全量数据。其中,源节点可以每次将网络发送缓冲区写满后就立即返回,等到下次网络发送缓冲区可写时再发送一部分数据,直到发送完一致性快照全量数据,实现异步发送。
(8)目标节点加载全量数据。
目标节点将接收到的一致性快照全量数据加载至内存中。
(9)开始持续发送增量数据。
从步骤(9)开始,进入增量数据同步阶段。源节点开始持续向目标节点发送复制积压缓冲区中的增量数据。
(10)定期反馈已接收的字节数(read_bytes)。
源节点在接收数据的同时,定期向源节点反馈已接收的字节数,这里以read_bytes表示,已接收的字节数即相当于上文的已接收数据量。
(11)定期反馈目标节点与源节点相差的字节数(diff_bytes)。
源节点将待迁移的slot中的当前字节数,减去目标节点的已接收的字节数,得到相差的字节数,这里以diff_bytes表示,并将相差的字节数反馈至目标节点,相差的字节数即为上文的数据量差值。
(12)定期获取diff_bytes。
管控端定期获取目标节点上的相差的字节数。
(13)发起切换slot命令。
当判断出diff_bytes小于某个特定的阈值(即上文的数据量阈值)时,管控端向目标节点发起切换待迁移的slot的命令,即cluster slotfailover。值得说明的是,步骤(9)至步骤(13)构成了一个循环,即在循环过程中不断地进行增量数据的传输以及相差的字节数是否小于阈值的判断。
(14)目标节点通知源节点准备切换待迁移的slot。
这里,目标节点向源节点发送通知,以通知源节点准备切换待迁移的slot,即sendREPLCONF SLOTFAILOVER。
(15)源节点暂停客户端写入。
在准备切换时,源节点不再接受客户端的写入操作,即pauseClients(),以保证迁移的数据的准确性。
(16)定期反馈已接收的字节数(read_bytes)。
目标节点仍然定期向源节点反馈已接收到的字节数据(read_bytes),即SendREPLCONF SLOTACK read_bytes。
(17)如果源节点与目标节点的相差的字节数为0,则源节点通知目标节点已准备好切换。
源节点在计算出相差的字节数后,执行判断,若相差的字节数为0,则源节点通知目标节点已准备好切换,即send REPLCONF SLOTREADY。其中,步骤(16)至步骤(17)构成了一个循环,即在循环过程中目标节点不断反馈已接收的字节数,源节点不断地进行相差的字节数是否为零的判断。
(18)将slot从源节点上删除。
这里,将待迁移的slot从源节点上删除,即DelSlotFromSrcNode。
(19)将slot分配到目标节点。
将待迁移的slot分配至目标节点,即AddSlotToDstNode。
(20)管控端删除多余老节点。
针对于数据库集群缩容的情况,在完成从源节点到目标节点的数据迁移后,管控端删除老的源节点。当然,如果是扩容的情况,则无需删除老的源节点。
通过上述的步骤(0)至步骤(20),以全量数据+增量数据的异步形式进行数据迁移,如此,在数据迁移期间,源节点仍能向外正常提供读写服务,并且能够有效地保证数据库集群中的数据一致性。
本发明实施例还提供了如图14A所示的Redis扩容的前端web界面示意图,在图14A中,以部署在云端的Redis数据库集群说明扩容的流程。如图14A所示,在用户需要对数据库集群进行扩容时,在web界面选择Redis的实例列表,并在出现的实例信息中,确定需要扩容的Redis实例。例如用户在实例名1的配置变更选项中点击增加分片的功能。此外,配置变更选项还提供了删除分片、扩容节点、缩容节点、增加副本及删除副本的功能,其中,副本指的是从节点。图14A示出的总容量即为上文的容量上限。
本发明实施例提供了如图14B所示的配置变更界面示意图,当用户触发了增加分片的功能后,前端可呈现如图14B的配置变更界面,例如在图14A的前端web界面中以弹窗的形式呈现。用户可选择请求分片数量,在图14B中以将3分片12GB的数据库集群扩容到5分片20GB的数据库集群举例,其中,每个分片的分片规格容量为4GB。在扩容后,数据库集群的服务提供商会给用户提供更高的容量上限,故相应地也会向用户收取更多的费用。当用户在配置变更界面中进行确认,并支付相应费用后,数据库集群的管控端即可自动完成对实例名1的数据库集群的扩容。本发明实施例提供了如图14C所示的扩容后的前端web界面示意图,如图14C所示,对实例名1的数据库集群进行扩容后,在其实例信息中,总容量更新为了20GB。
本发明实施例还提供了如图14D所示的实例信息界面示意图,具体地,数据库集群的实例信息包括基本信息、规格信息、网络信息、配置信息及架构图,基本信息包括实例名、实例ID、实例状态及读写状态等,规格信息包括数据库集群的引擎版本、内存容量及内存配置等,网络信息包括数据库集群所用的网络名称、地址及端口等,配置信息包括计费模式、创建时间、服务到期时间及连接密码等,架构图示出了实例对应的数据库集群的架构,其中,Proxy指的是Redis数据库集群的代理服务器,实例名1对应的数据库集群在扩容后,包括5个分片。
本发明实施例还提供了如图15A所示的Redis缩容的前端web界面示意图。如图15A所示,在用户需要对数据库集群进行缩容时,在web界面选择Redis的实例列表,并在出现的实例信息中,确定需要缩容的Redis实例。例如用户在实例名1的配置变更选项中点击删除分片的功能。
本发明实施例提供了如图15B所示的配置变更界面示意图,当用户触发了删除分片的功能后,前端可呈现如图15B的配置变更界面,例如在图15A的前端web界面中以弹窗的形式呈现。用户可选择请求分片数量,在图15B中以将5分片20GB的数据库集群缩容到3分片12GB的数据库集群举例。与扩容不同的是,数据库集群的服务提供商对缩容请求不收取费用。此外,为了避免缩容失败,可限定缩容后的实例容量(容量上限)大于或等于现有数据量(用户在数据库集群中已存储的数据量)的1.3倍。当用户在配置变更界面中进行确认后,数据库集群的管控端即可自动完成对实例名1的数据库集群的缩容。在用户确认后,可在前端呈现订单已生成的提示,如图15C所示的订单生成示意图,在图15C中,提示用户的降配(缩容)订单已生成,并呈现进入控制台的按钮,便于用户在控制台查看相关费用以及进行发票申请。
本发明实施例还提供了如图15D所示的实例信息界面示意图,具体地,在完成缩容后,实例名1的内存容量更新为了12GB,最大连接数更新为了30000个,最大网络吞吐更新为了72MB/s,在图15D示出的架构图中,示出了包括3个分片的数据库集群架构。
弹性伸缩是云服务最关键的能力之一,通过本发明实施例提供的数据迁移方法,用户可根据自身需求在web端实现一键式扩容或缩容。在用户存储量不足时,通过web端,在几分钟内完成扩容;当用户需求量降低时,通过缩容快速降低成本。整个扩缩容过程无缝、隐性性地完成,不影响用户的线上业务。
采用相关技术提供的方案(Redis官方方案)时,扩缩容的整体成功率低于80%。并且,若数据迁移的过程中涉及到大key,则失败率高达100%,相关的开发或运维人员需经常手工修复,处理扩缩容失败的问题,即使修复后,也可能导致数据库集群中的数据不一致,数据库集群的服务质量较低。经发明人实验验证,通过本发明实施例提供的数据迁移方法,扩缩容成功率为100%,相较于相关技术提供的方案提升20%,尤其解决了大key场景下扩缩容成功率较低的问题以及数据不一致的问题。
下面继续说明本发明实施例提供的数据库集群的数据迁移装置243实施为软件模块的示例性结构,在一些实施例中,如图6所示,存储在存储器240的数据库集群的数据迁移装置243中的软件模块可以包括:复制模块2431,用于对源节点中待迁移的存储单元中的全量数据进行复制处理;其中,源节点为数据库集群的多个节点中需要将所存储的数据迁移出的节点;异步发送模块2432,用于将复制的全量数据异步发送至目标节点,以使目标节点加载全量数据;其中,目标节点为数据库集群中用于接收数据的节点;差值确定模块2433,用于确定待迁移的存储单元的当前数据量与目标节点的已接收数据量之间的数据量差值;分配模块2434,用于当数据量差值为零时,将待迁移的存储单元分配至目标节点。
在一些实施例中,数据库集群的数据迁移装置243还包括:缓冲区创建模块,用于在源节点创建复制积压缓冲区,以存储对源节点进行更新操作所产生的增量数据;
数据库集群的数据迁移装置243还包括:增量数据发送模块,用于当目标节点加载完成复制的全量数据时,将复制积压缓冲区内的增量数据异步发送至目标节点,以使目标节点加载增量数据。
在一些实施例中,数据库集群的数据迁移装置243还包括:暂停写入模块,用于当数据量差值小于数据量阈值时,暂停执行对源节点的写入操作;
在一些实施例中,分配模块2434,还用于:在源节点中删除待迁移的存储单元,以使目标节点导入待迁移的存储单元。
在一些实施例中,差值确定模块2433,还用于:获取目标节点反馈的已接收数据量;将待迁移的存储单元的当前数据量减去已接收数据量,得到数据量差值。
在一些实施例中,差值确定模块2433,还用于:将当前时间戳及待迁移的存储单元的当前数据量发送至区块链网络,以使区块链网络的节点将当前时间戳及当前数据量填充至新区块,并在对新区块共识一致后,将新区块追加至区块链的尾部;向区块链网络发送差值查询请求,以获取区块链存储的数据量差值;其中,区块链网络的节点用于根据部署的智能合约,将当前数据量减去区块链中符合当前时间戳的已接收数据量,得到数据量差值。
在一些实施例中,数据库集群的数据迁移装置243还包括:请求获取模块,用于获取对数据库集群的容量更新请求;节点确定模块,用于根据容量更新请求确定源节点及待迁移的存储单元;目标节点创建模块,用于在数据库集群中创建符合容量更新请求的目标节点。
在一些实施例中,节点确定模块,还用于:确定容量更新请求对应的请求分片数量;确定数据库集群的存储单元总数,并将存储单元总数除以请求分片数量,得到平均存储单元数量;在数据库集群包括的多个主节点中选取至少一个主节点以作为源节点,并在源节点中确定待迁移的存储单元,以使在对待迁移的存储单元的分配完成后,数据库集群中各主节点的存储单元数量为平均存储单元数量。
在一些实施例中,节点确定模块,还用于:当请求分片数量大于数据库集群的已有分片数量时,将存储单元数量超过平均存储单元数量的主节点,确定为源节点,并在源节点中选取待迁移的存储单元,直至源节点中剩余的存储单元数量为平均存储单元数量;当请求分片数量小于已有分片数量时,将数据库集群中各分片的主节点确定为源节点,并将源节点中的存储单元均确定为待迁移的存储单元。
在一些实施例中,分配模块2434,还用于:当请求分片数量小于已有分片数量时,对已分配待迁移的存储单元的源节点进行删除处理。
在一些实施例中,目标节点创建模块,还用于:确定容量更新请求对应的请求分片数量;当请求分片数量大于数据库集群的已有分片数量时,将请求分片数量减去已有分片数量,得到扩容分片数量,并在数据库集群中,创建数量与扩容分片数量相符的新节点以作为目标节点;当请求分片数量小于已有分片数量时,在数据库集群中,创建数量与请求分片数量相符的新节点以作为目标节点。
在一些实施例中,异步发送模块2432,还用于:将复制的全量数据写入至发送缓冲区,直至发送缓冲区被写满;其中,发送缓冲区用于将写入的数据发送至目标节点;对发送缓冲区进行监测,并当发送缓冲区可写时,将未写入的全量数据写入至发送缓冲区,直至所有的全量数据写入完毕。
在一些实施例中,数据库集群的数据迁移装置243还包括:访问请求获取模块,用于获取对数据库集群中数据的访问请求;映射模块,用于对访问请求中的键进行映射处理,得到键对应的目标存储单元;定位模块,用于将访问请求定位至包括目标存储单元的节点,以使包括目标存储单元的节点确定目标存储单元中与键对应的值。
本发明实施例提供一种存储有可执行指令的计算机可读存储介质,其中存储有可执行指令,当可执行指令被处理器执行时,将引起处理器执行本发明实施例提供的方法,例如,如图7A、图7B或图7C示出的数据库集群的数据迁移方法。值得说明的是,计算机包括终端设备和服务器在内的各种计算设备。
在一些实施例中,计算机可读存储介质可以是FRAM、ROM、PROM、EPROM、EEPROM、闪存、磁表面存储器、光盘、或CD-ROM等存储器;也可以是包括上述存储器之一或任意组合的各种设备。
在一些实施例中,可执行指令可以采用程序、软件、软件模块、脚本或代码的形式,按任意形式的编程语言(包括编译或解释语言,或者声明性或过程性语言)来编写,并且其可按任意形式部署,包括被部署为独立的程序或者被部署为模块、组件、子例程或者适合在计算环境中使用的其它单元。
作为示例,可执行指令可以但不一定对应于文件系统中的文件,可以可被存储在保存其它程序或数据的文件的一部分,例如,存储在超文本标记语言(HTML,Hyper TextMarkup Language)文档中的一个或多个脚本中,存储在专用于所讨论的程序的单个文件中,或者,存储在多个协同文件(例如,存储一个或多个模块、子程序或代码部分的文件)中。
作为示例,可执行指令可被部署为在一个计算设备上执行,或者在位于一个地点的多个计算设备上执行,又或者,在分布在多个地点且通过通信网络互连的多个计算设备上执行。
综上,通过本发明实施例能够实现以下技术效果:
1)通过在源节点与目标节点之间以异步形式迁移数据,使得在数据迁移期间,源节点能够向外正常提供读写服务,实现高吞吐低延迟,就算是迁移大key,也不会出现相关技术提供的方案中节点被判死的情况。
2)本发明实施例是将待迁移的存储单元中数据进行复制,再向目标节点发送复制的数据,保证了待迁移的存储单元中数据的完整性,即使在数据迁移期间源节点或目标节点发生了故障,客户端所访问的也是完整的存储单元,提升了数据库集群的数据一致性。
3)本发明实施例提出了全量数据+增量数据的数据迁移方式,提升了数据迁移的准确性。
4)基于区块链网络确定数据量差值,提升了数据量差值的准确性,并且,区块链中的数据均附带有时间戳,便于相关人员追溯不同时间戳的数据迁移情况,以进一步对数据迁移的相关设置进行调整,如增大发送缓冲区的容量。
5)无论是针对扩容请求还是缩容请求,本发明实施例均是创建新的主节点作为目标节点,由于新的主节点不需要立刻提供数据服务,故就算目标节点在加载数据的过程中发生线程阻塞的情况,也不会对数据库集群提供服务的稳定性造成不利影响。
以上,仅为本发明的实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和范围之内所作的任何修改、等同替换和改进等,均包含在本发明的保护范围之内。