本发明涉及互联网技术领域,尤其涉及一种数据迁移方法和装置。
背景技术:
在任何传统的工程代码中,为了重新设计数据模型以支持清晰准确的服务和更为复杂的功能的时候,将这些工程代码应用在实际的生产环境中,就需要迁移数以百万千万计的活跃数据对象,并需要重构上千行代码,这种代码的重构和数据的迁移过程,会影响用户的在线使用感受。
例如,在ktv使用的erp系统中,对用户消费订单的管理是很重要的一个需求,为了实现对用户消费订单的管理,最初的业务逻辑是非常简单的,即,每个用户对象对应一个关于点歌的例如,用户消费订单管理是非常重要的一项的功能.最初的业务逻辑非常简单,每个对象(customer)最多只有一个关于点歌的订单(subscription)。因此,这个数据模型是很简单的。然而,随着业务的发展,一般会引入新的更为复杂的计费模式,例如:包场订单、试用订单、优惠券和酒水订单等,再采用原本的数据模型进行数据的管理,将很难实现,这就需要进行数据模型的更改,也就必然会设计到新旧数据的迁移。
如何实现用户无感知的数据迁移,目前尚未提出有效的解决方案。
技术实现要素:
本发明实施例提供一种数据迁移方法和装置,以实现用户无感知的数据迁移的目的。
一方面,本发明实施例提供了一种数据迁移方法,包括:
接收新的订单信息,其中,所述新的订单信息对应于发起所述订单信息的用户身份信息;
将所述新的订单信息写入第一数据表和所述第二数据表中,其中,所述第一数据表中记录有用户身份信息和订单信息,所述第二数据表中仅记录有第一订单信息,其中,所述第二数据表对应于第三数据表,所述第三数据表中存储有用户身份信息;
在将所述新的订单信息写入所述第一数据表和所述第二数据表中之后,将所述第一数据表中存储的与所述新的订单信息对应的用户身份信息所对应的历史订单信息迁移至所述第二数据表中。
在一个实施方式中,将所述新的订单信息写入第一数据表和所述第二数据表中,包括:
将所述新的订单信息写入所述第二数据表中;
在写入所述第二数据表中之后,使用消息队列,采用异步的方式将所述新的订单信息更新到所述第一数据表中。
在一个实施方式中,所述将所述第一数据表中存储的与所述新的订单信息对应的用户身份信息所对应的历史订单信息迁移至所述第二数据表中包括:
采用离线的方式,将所述第一数据表中存储的与所述新的订单信息对应的用户身份信息所对应的历史订单信息迁移至所述第二数据表中。
在一个实施方式中,采用离线的方式,将所述第一数据表中存储的与所述新的订单信息对应的用户身份信息所对应的历史订单信息迁移至所述第二数据表中,包括:
通过hadoop集群的数据库快照方式,使用mapreduce以离线分布式的方式对所述第一数据表和所述第二数据表进行快速查询;
在查询之后,将所述第二数据表中缺失的数据,映射到所述第二数据表中。
在一个实施方式中,使用mapreduce以离线分布式的方式对所述第一数据表和所述第二数据表进行快速查询,包括:
编写一份scalding作业,以生成所有需要复制的订单信息的列表;
通过一组进程并行执行来将所述第一数据表中的数据复制到第二数据表中。
另一方面,本发明实施例提供了一种数据迁移装置,包括:
接收模块,用于接收新的订单信息,其中,所述新的订单信息对应于发起所述订单信息的用户身份信息;
写入模块,用于将所述新的订单信息写入第一数据表和所述第二数据表中,其中,所述第一数据表中记录有用户身份信息和订单信息,所述第二数据表中仅记录有第一订单信息,其中,所述第二数据表对应于第三数据表,所述第三数据表中存储有用户身份信息;
迁移模块,用于在将所述新的订单信息写入所述第一数据表和所述第二数据表中之后,将所述第一数据表中存储的与所述新的订单信息对应的用户身份信息所对应的历史订单信息迁移至所述第二数据表中。
在一个实施方式中,所述迁移模块包括:
写入单元,用于将所述新的订单信息写入所述第二数据表中;
更新单元,用于在写入所述第二数据表中之后,使用消息队列,采用异步的方式将所述新的订单信息更新到所述第一数据表中。
在一个实施方式中,所述迁移模块具体用于采用离线的方式,将所述第一数据表中存储的与所述新的订单信息对应的用户身份信息所对应的历史订单信息迁移至所述第二数据表中。
在一个实施方式中,所述迁移模块包括:
查询单元,用于通过hadoop集群的数据库快照方式,使用mapreduce以离线分布式的方式对所述第一数据表和所述第二数据表进行快速查询;
映射单元,用于在查询之后,将所述第二数据表中缺失的数据,映射到所述第二数据表中。
在一个实施方式中,所述查询单元包括:
编写单元,用于编写一份scalding作业,以生成所有需要复制的订单信息的列表;
复制单元,用于通过一组进程并行执行来将所述第一数据表中的数据复制到第二数据表中。
上述技术方案具有如下有益效果:建立了新的数据表(即,第二数据表和第三数据表),通过第二数据表存储订单信息,并且在存在新的订单信息的情况下,将新的订单信息写入旧的数据表和新的数据表,且采用离线的方式将旧表的数据同步到新表中,从而解决了现有的数据迁移过程中所存在的迁移效率低,影响用户体验的问题,达到了高效的数据迁移和用户无感知的技术效果。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是根据本发明实施例的数据迁移方法的方法流程图;
图2是根据本发明实施例的迁移前的数据存储模式示意图;
图3是根据本发明实施例的钱以后的数据存储模式示意图;
图4是根据本发明实施例的数据迁移装置的结构框图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在本说明书中,诸如第一和第二这样的形容词仅可以用于将一个元素或动作与另一元素或动作进行区分,而不必要求或暗示任何实际的这种关系或顺序。在环境允许的情况下,参照元素或部件或步骤(等)不应解释为局限于仅元素、部件、或步骤中的一个,而可以是元素、部件、或步骤中的一个或多个等。
图1为本申请实施例提供的一种数据迁移方法。虽然下文描述流程包括以特定顺序出现的多个操作,但是应该清楚了解,这些过程可以包括更多或更少的操作,这些操作可以顺序执行或并行执行(例如使用并行处理器或多线程环境)。如图1所示,所述方法包括:
步骤101:接收新的订单信息,其中,所述新的订单信息对应于发起所述订单信息的用户身份信息;
例如,用户小明,增加了一个新的订单“点一个果盘”,那么就相当于生成了一个新的订单信息。对于该新的订单信息而言,用户身份就是小明,订单信息就是:一个果盘50元。
步骤102:将所述新的订单信息写入第一数据表和所述第二数据表中,其中,所述第一数据表中记录有用户身份信息和订单信息,所述第二数据表中仅记录有第一订单信息,其中,所述第二数据表对应于第三数据表,所述第三数据表中存储有用户身份信息;
其中,原本旧的数据表就是第一数据表,可以如图2所示,即,用户身份信息和订单信息在一个数据表中。新的数据表如图3所示,就是第二数据表和第三数据表,其中,第二数据表中存订单信息,第三数据表中存用户身份信息。
步骤103:在将所述新的订单信息写入所述第一数据表和所述第二数据表中之后,将所述第一数据表中存储的与所述新的订单信息对应的用户身份信息所对应的历史订单信息迁移至所述第二数据表中。
具体的,在将新的订单信息写入新旧表的时候,按照如下方式将所述新的订单信息写入第一数据表和所述第二数据表中:
s1:将所述新的订单信息写入所述第二数据表中;
s2:在写入所述第二数据表中之后,使用消息队列,采用异步的方式将所述新的订单信息更新到所述第一数据表中。
即,先将新的订单信息写入到新表中,然后再采用消息队列,采用异步的方式写入到旧表中,从而保证新旧表中都有新的数据。
为了缓解线上数据同步和数据迁移的压力,可以采用离线的方式,实现历史订单信息的迁移,具体的,将所述第一数据表中存储的与所述新的订单信息对应的用户身份信息所对应的历史订单信息迁移至所述第二数据表中可以包括:采用离线的方式,将所述第一数据表中存储的与所述新的订单信息对应的用户身份信息所对应的历史订单信息迁移至所述第二数据表中。
在一个实施方式中,采用离线的方式,将所述第一数据表中存储的与所述新的订单信息对应的用户身份信息所对应的历史订单信息迁移至所述第二数据表中,可以包括:通过hadoop集群的数据库快照方式,使用mapreduce以离线分布式的方式对所述第一数据表和所述第二数据表进行快速查询;在查询之后,将所述第二数据表中缺失的数据,映射到所述第二数据表中。
其中,使用mapreduce以离线分布式的方式对所述第一数据表和所述第二数据表进行快速查询,可以包括:
s1:编写一份scalding作业,以生成所有需要复制的订单信息的列表;
s2:通过一组进程并行执行来将所述第一数据表中的数据复制到第二数据表中。
进一步的,为了保证数据都已经迁移到新表中,在通过一组进程并行执行来将所述第一数据表中的数据复制到第二数据表中之后,在数据都复制到第二数据表中之后,还可以再次运行scalding作业,以确保所有订单信息数据都已存在于第二数据表中。
下面结合一个具体实施例对上述数据迁移方法进行说明,然而,值得注意的是,该具体实施例仅是为了更好地说明本申请,并不构成对本申请的不当限定。
在本例中,考虑到对于ktv中所使用的erp系统而言,原本的数据模型如图2所示,每个customer对象最多只有一个关于点歌的subscription,即每个客户仅仅拥有一个点歌的订单信息。随着业务的发展,增加了一些功能来支持更复杂的计费模式,例如包场订单、试用订单、优惠券和酒水订单等,因此,对用户订单存储的数据模型进行了修改,更改为了如图3所示的数据模型,即,将subscription从一个item更改为一个list,将订单信息单独的存储在一个表中。即,修改后的数据模型存在两张表,一张是用于存储用户(customer)信息的,一张表示用于存储订单信息的。
具体的,为了数据存储模型的修改和数据迁移,可以采用如下操作执行:
s1:创建两张新的数据库表,即:用户customer表和订单subscription表。将创建的两张表作为迁移的开始,即将旧表的用户名和订单信息分开在两个表中进行存储。
s2:新数据双写旧新两表:
具体的,将所有新创建的subscriptions先写入customer后更新至subscription表。在开始双写两张表前,可以首先确定额外的写入操作(即,对新表的更新写入操作)对生产环境数据库性能的潜在影响,然后,先写新表,再使用消息队列采用异步的方式将新的订单信息更新到旧表,具体的,可以通过缓慢提高重复对象的百分比来缓解性能问题,同时持续关注系统运行指标。
s3:新表数据缺失数据的补全:
通过上述步骤s1和s2,新创建的订单信息已同时存在于旧表和两张新表中,然而,因为旧的订单信息只能在旧表中找到。因此,可以通过懒惰方式(lazyfashion)每当旧的订单信息更新时,就将该订单信息自动复制到新表中,在线写入更新数据。然后,接下来将新表缺失的订单信息从旧表更新到新表中。考虑到在正在对外提供服务的线上数据库中找到所有新表缺失的订单信息需要花费巨额的代价,且通过查询数据库查找所有对象的方式将需要在线上环境数据库上执行大量的查询操作,这将耗费很多时间。为了解决该问题,可以将数据从线上导入通过对生产环境数据库完全无影响的离线流程完成中,具体的。可以通过hadoop集群的数据库快照方式,使用mapreduce以离线分布式的方式进行快速查询,然后,将缺失数据映射到新表当中,可以通过scalding来实现mapreduce作业,其中,scalding是用scala编写的非常实用的库,可以很容易地编写mapreduce作业。
具体的,通过scalding来实现mapreduce作业可以包括:
步骤1:编写一份scalding作业,提供所有需要复制的subscriptionid的列表;
步骤2:通过一组进程并行执行来大规模地复制subscriptions数据;
步骤3:在迁移完成后,再次运行scalding作业,以确保所有subscriptions数据都已存在于subscriptions表中。
在上例中,针对运用在ktv使用的erp系统实现包含海量数据的数据库的在线迁移,为了不影响前端使用,实现对用户的无感知的前提下,实现了数据的在线迁移,且不会影响现有的业务逻辑,同时可以保证数据的一致性和正确性,可以提高数据存储对象的使用效率,同时可以大大降低数据库的运维成本,便于进行业务拓展。
基于同一发明构思,本发明实施例中还提供了一种数据迁移装置,如下面的实施例所述。由于数据迁移装置解决问题的原理与数据迁移方法相似,因此数据迁移装置的实施可以参见数据迁移方法的实施,重复之处不再赘述。以下所使用的,术语“单元”或者“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。图4是本发明实施例的数据迁移装置的一种结构框图,如图4所示,可以包括:接收模块401、写入模块402和迁移模块403,下面对该结构进行说明。
接收模块401,用于接收新的订单信息,其中,所述新的订单信息对应于发起所述订单信息的用户身份信息;
写入模块402,用于将所述新的订单信息写入第一数据表和所述第二数据表中,其中,所述第一数据表中记录有用户身份信息和订单信息,所述第二数据表中仅记录有第一订单信息,其中,所述第二数据表对应于第三数据表,所述第三数据表中存储有用户身份信息;
迁移模块403,用于在将所述新的订单信息写入所述第一数据表和所述第二数据表中之后,将所述第一数据表中存储的与所述新的订单信息对应的用户身份信息所对应的历史订单信息迁移至所述第二数据表中。
在一个实施方式中,迁移模块403可以包括:写入单元,用于将所述新的订单信息写入所述第二数据表中;更新单元,用于在写入所述第二数据表中之后,使用消息队列,采用异步的方式将所述新的订单信息更新到所述第一数据表中。
在一个实施方式中,迁移模块403具体可以用于采用离线的方式,将所述第一数据表中存储的与所述新的订单信息对应的用户身份信息所对应的历史订单信息迁移至所述第二数据表中。
在一个实施方式中,迁移模块403可以包括:查询单元,用于通过hadoop集群的数据库快照方式,使用mapreduce以离线分布式的方式对所述第一数据表和所述第二数据表进行快速查询;映射单元,用于在查询之后,将所述第二数据表中缺失的数据,映射到所述第二数据表中。
在一个实施方式中,查询单元可以包括:编写单元,用于编写一份scalding作业,以生成所有需要复制的订单信息的列表;复制单元,用于通过一组进程并行执行来将所述第一数据表中的数据复制到第二数据表中。
在另外一个实施例中,还提供了一种软件,该软件用于执行上述实施例及优选实施方式中描述的技术方案。
在另外一个实施例中,还提供了一种存储介质,该存储介质中存储有上述软件,该存储介质包括但不限于:光盘、软盘、硬盘、可擦写存储器等。
从以上的描述中,可以看出,本发明实施例实现了如下技术效果:建立了新的数据表(即,第二数据表和第三数据表),通过第二数据表存储订单信息,并且在存在新的订单信息的情况下,将新的订单信息写入旧的数据表和新的数据表,且采用离线的方式将旧表的数据同步到新表中,从而解决了现有的数据迁移过程中所存在的迁移效率低,影响用户体验的问题,达到了高效的数据迁移和用户无感知的技术效果。
本领域技术人员还可以了解到本发明实施例列出的各种说明性逻辑块(illustrativelogicalblock),单元,和步骤可以通过电子硬件、电脑软件,或两者的结合进行实现。为清楚展示硬件和软件的可替换性(interchangeability),上述的各种说明性部件(illustrativecomponents),单元和步骤已经通用地描述了它们的功能。这样的功能是通过硬件还是软件来实现取决于特定的应用和整个系统的设计要求。本领域技术人员可以对于每种特定的应用,可以使用各种方法实现所述的功能,但这种实现不应被理解为超出本发明实施例保护的范围。
本发明实施例中所描述的各种说明性的逻辑块,或单元都可以通过通用处理器,数字信号处理器,专用集成电路(asic),现场可编程门阵列或其它可编程逻辑装置,离散门或晶体管逻辑,离散硬件部件,或上述任何组合的设计来实现或操作所描述的功能。通用处理器可以为微处理器,可选地,该通用处理器也可以为任何传统的处理器、控制器、微控制器或状态机。处理器也可以通过计算装置的组合来实现,例如数字信号处理器和微处理器,多个微处理器,一个或多个微处理器联合一个数字信号处理器核,或任何其它类似的配置来实现。
本发明实施例中所描述的方法或算法的步骤可以直接嵌入硬件、处理器执行的软件模块、或者这两者的结合。软件模块可以存储于ram存储器、闪存、rom存储器、eprom存储器、eeprom存储器、寄存器、硬盘、可移动磁盘、cd-rom或本领域中其它任意形式的存储媒介中。示例性地,存储媒介可以与处理器连接,以使得处理器可以从存储媒介中读取信息,并可以向存储媒介存写信息。可选地,存储媒介还可以集成到处理器中。处理器和存储媒介可以设置于asic中,asic可以设置于用户终端中。可选地,处理器和存储媒介也可以设置于用户终端中的不同的部件中。
在一个或多个示例性的设计中,本发明实施例所描述的上述功能可以在硬件、软件、固件或这三者的任意组合来实现。如果在软件中实现,这些功能可以存储与电脑可读的媒介上,或以一个或多个指令或代码形式传输于电脑可读的媒介上。电脑可读媒介包括电脑存储媒介和便于使得让电脑程序从一个地方转移到其它地方的通信媒介。存储媒介可以是任何通用或特殊电脑可以接入访问的可用媒体。例如,这样的电脑可读媒体可以包括但不限于ram、rom、eeprom、cd-rom或其它光盘存储、磁盘存储或其它磁性存储装置,或其它任何可以用于承载或存储以指令或数据结构和其它可被通用或特殊电脑、或通用或特殊处理器读取形式的程序代码的媒介。此外,任何连接都可以被适当地定义为电脑可读媒介,例如,如果软件是从一个网站站点、服务器或其它远程资源通过一个同轴电缆、光纤电缆、双绞线、数字用户线(dsl)或以例如红外、无线和微波等无线方式传输的也被包含在所定义的电脑可读媒介中。所述的碟片(disk)和磁盘(disc)包括压缩磁盘、镭射盘、光盘、dvd、软盘和蓝光光盘,磁盘通常以磁性复制数据,而碟片通常以激光进行光学复制数据。上述的组合也可以包含在电脑可读媒介中。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。