具体实施方式
在本申请实施例使用的术语仅仅是出于描述特定实施例的目的,而非限制本申请。本申请和权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其它含义。还应当理解,本文中使用的术语“和/或”是指包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本申请实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,此外,所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
本申请实施例提出一种分布式数据库,该分布式数据库可以包括多个节点,不同的节点部署在相同区域或者不同区域;该分布式数据库包括多个组,所述多个节点中的一个节点是所述组的主节点,而其它节点可以是所述组的从节点。其中,分布式数据库中组的数量,可以基于分布式数据库中节点的数量确定。
在一个例子中,分布式数据库可以采用集群用户态文件系统存储数据;或者,分布式数据库也可以采用分布式存储系统存储数据,对此不做限制。
在一个例子中,分布式数据库中的每个节点可以对应至少一个组;而且,针对所述节点对应的组,所述节点可以是所述组的主节点。
在一个例子中,针对所述分布式数据库中的任一节点(称为本节点),可以采用图1所示的流程图,实现数据写入方法,该方法可以包括:
步骤101,获取第一待写入数据。
步骤102,确定该第一待写入数据对应的第一组标识。
其中,确定该第一待写入数据对应的第一组标识,可以包括但不限于:确定该第一待写入数据对应的第一数据表、该第一数据表中与该第一待写入数据对应的第一数据行,且该第一数据行可以包括该第一待写入数据对应的组标识。进一步的,可以将该第一数据行中记录的组标识确定为第一组标识。
步骤103,确定该第一组标识对应的主节点。
其中,确定该第一组标识对应的主节点,可以包括但不限于:通过该第一组标识查询映射表,以得到该第一组标识对应的主节点。
在一个例子中,可以存储一个映射表,该映射表用于记录组标识和主节点的对应关系。基于此,在得到第一待写入数据对应的第一组标识后,可以通过该第一组标识查询该映射表,从而得到该第一组标识对应的主节点。
步骤104,若主节点是本节点之外的第一节点,则确定第二组标识,该第二组标识对应的主节点是本节点,并将该第二组标识发送给第一节点,以使第一节点将该第一待写入数据对应的第一组标识修改为该第二组标识。
其中,确定第二组标识,可以包括但不限于:获取映射表中记录的组标识;若该组标识对应的主节点是本节点,则将该组标识确定为第二组标识。
在一个例子中,可以存储一个映射表,该映射表可以用于记录组标识和主节点的对应关系。基于此,针对该映射表中记录的每个组标识,若该组标识对应的主节点是本节点,则可以将该组标识确定为第二组标识。
其中,将该第二组标识发送给第一节点,以使第一节点将该第一待写入数据对应的第一组标识修改为该第二组标识,可以包括但不限于:向第一节点发送通知消息,该通知消息携带该第二组标识和该第一待写入数据的索引信息。
其中,该通知消息用于使第一节点根据该索引信息确定该第一待写入数据对应的第二数据行,并将该第二数据行中记录的第一组标识修改为第二组标识。
步骤105,接收该第一节点发送的更新消息,并根据该更新消息将该第一待写入数据对应的第一组标识修改为该第二组标识。
其中,根据该更新消息将该第一待写入数据对应的第一组标识修改为该第二组标识,可以包括但不限于:若该更新消息还携带该第一待写入数据的索引信息,则可以根据该索引信息确定该第一待写入数据在第一数据表中对应的第一数据行;然后,将该第一数据行中记录的第一组标识修改为第二组标识。
步骤106,在根据该更新消息将该第一待写入数据对应的第一组标识修改为该第二组标识之后,由本节点执行该第一待写入数据的写入过程。
在上述实施例中,本节点与第一节点可以位于不同的区域;而且,第一待写入数据可以是用户从第一节点所在区域迁移到本节点所在区域后发送的。
在一个例子中,该数据写入方法还包括以下步骤(在图1中未示出):
步骤107,获取第二待写入数据。其中,该第二待写入数据的索引信息与上述第一待写入数据的索引信息可以相同或者不同,以二者相同为例。
步骤108,确定该第二待写入数据对应的组标识。
其中,确定该第二待写入数据对应的组标识,可以包括但不限于:确定该第二待写入数据对应的第二数据表、该第二数据表中与该第二待写入数据对应的第三数据行,且该第三数据行可以包括第二待写入数据对应的组标识。进一步的,可以将第三数据行中记录的组标识确定为第二待写入数据对应的组标识。
步骤109,若该第二待写入数据对应的组标识与上述第二组标识不同,则确定该第二待写入数据对应的组标识对应的主节点。
其中,确定该第二待写入数据对应的组标识对应的主节点,可以包括但不限于:通过该第二待写入数据对应的组标识查询映射表,得到该第二待写入数据对应的组标识对应的主节点。在一个例子中,可以存储一个映射表,该映射表可以用于记录组标识和主节点的对应关系。基于此,在得到该第二待写入数据对应的组标识后,可以通过该第二待写入数据对应的组标识查询该映射表,从而得到该第二待写入数据对应的组标识对应的主节点。
步骤110,若主节点是本节点之外的第三节点,则将第二组标识发送给第三节点,以使第三节点将该第二待写入数据对应的组标识修改为第二组标识。
其中,将第二组标识发送给第三节点,以使第三节点将该第二待写入数据对应的组标识修改为第二组标识,可以包括但不限于:向第三节点发送通知消息,该通知消息携带该第二组标识和该第二待写入数据的索引信息。
其中,该通知消息用于使第三节点根据该索引信息确定该第二待写入数据对应的数据行,并将该数据行中记录的组标识修改为第二组标识。
步骤111,接收该第三节点发送的更新消息,并根据该更新消息将该第二待写入数据对应的组标识修改为该第二组标识。
其中,根据该更新消息将该第二待写入数据对应的组标识修改为该第二组标识,可以包括但不限于:若该更新消息还携带该第二待写入数据的索引信息,则可以根据该索引信息确定该第二待写入数据在第二数据表中对应的第三数据行;然后,可以将该第三数据行中记录的组标识修改为第二组标识。
步骤112,在根据该更新消息将该第二待写入数据对应的组标识修改为该第二组标识之后,由本节点执行该第二待写入数据的写入过程。
在一个例子中,针对步骤109,在确定该第二待写入数据对应的组标识对应的主节点之后,若主节点是本节点,则可以由本节点将该第二待写入数据对应的组标识修改为第二组标识,并由本节点执行第二待写入数据的写入过程。
进一步的,还可以向本节点之外的其它节点发送更新消息,以使其它节点根据该更新消息将该第二待写入数据对应的组标识修改为第二组标识。
在一个例子中,针对步骤108,在确定该第二待写入数据对应的组标识之后,若该第二待写入数据对应的组标识与上述第二组标识相同,则可以由本节点执行第二待写入数据的写入过程,而不再执行上述步骤109-步骤112。
在上述实施例中,组标识可以包括但不限于分布式一致性协议的组标识。
在一个例子中,上述执行顺序只是为了方便描述给出的一个示例,在实际应用中,还可以改变步骤之间的执行顺序,对此执行顺序不做限制。而且,在其它实施例中,并不一定按照本说明书示出和描述的顺序来执行相应方法的步骤,其方法所包括的步骤可以比本说明书所描述的更多或更少。此外,本说明书中所描述的单个步骤,在其它实施例中可能被分解为多个步骤进行描述;本说明书中所描述的多个步骤,在其它实施例也可能被合并为单个步骤进行描述。
基于上述技术方案,本申请实施例中,提出一种支持多点写入的分布式数据库(其使用分布式一致性协议实现),由于分布式数据库支持数据的多点写入,因此,对于跨区域的用户来说,能够将数据写入到当前区域的节点,提高用户的业务体验,使得分布式数据库支持用户的就近写入和动态迁移,并实现行级和用户级的多点写入,能够保证分布式数据库的数据一致性,实现跨区域的分布式事务,解决用户纬度的数据跨区域问题,支撑业务实现就近写入。
在一个例子中,针对所述分布式数据库中的任一节点(称为本节点),还可以采用图2所示的流程图,实现数据写入方法,该方法可以包括:
步骤201,获取第一待写入数据。
步骤202,确定该第一待写入数据对应的第一组标识。
步骤203,确定该第一组标识对应的主节点。
其中,步骤201-步骤203,可以参见步骤101-步骤103,在此不再赘述。
步骤204,若主节点是本节点,则由本节点执行第一待写入数据的写入过程。
在一个例子中,该数据写入方法还包括以下步骤(在图2中未示出):
步骤205,获取第二待写入数据。其中,该第二待写入数据的索引信息与上述第一待写入数据的索引信息可以相同或者不同,以二者相同为例。
步骤206,确定该第二待写入数据对应的组标识。
其中,确定该第二待写入数据对应的组标识,可以包括但不限于:确定该第二待写入数据对应的第二数据表、该第二数据表中与该第二待写入数据对应的第三数据行,且该第三数据行可以包括第二待写入数据对应的组标识。进一步的,可以将第三数据行中记录的组标识确定为第二待写入数据对应的组标识。
步骤207,若该第二待写入数据对应的组标识与上述第一组标识不同,则确定该第二待写入数据对应的组标识对应的主节点。
其中,确定该第二待写入数据对应的组标识对应的主节点,可以包括但不限于:通过该第二待写入数据对应的组标识查询映射表,得到该第二待写入数据对应的组标识对应的主节点。在一个例子中,可以存储一个映射表,该映射表可以用于记录组标识和主节点的对应关系。基于此,在得到该第二待写入数据对应的组标识后,可以通过该第二待写入数据对应的组标识查询该映射表,从而得到该第二待写入数据对应的组标识对应的主节点。
步骤208,若主节点是本节点之外的第二节点,则将第一组标识发送给第二节点,以使第二节点将该第二待写入数据对应的组标识修改为第一组标识。
其中,将第一组标识发送给第二节点,以使第二节点将该第二待写入数据对应的组标识修改为第一组标识,可以包括但不限于:向第二节点发送通知消息,该通知消息可以携带该第一组标识和该第二待写入数据的索引信息。
其中,该通知消息用于使第二节点根据该索引信息确定该第二待写入数据对应的数据行,并将该数据行中记录的组标识修改为第一组标识。
步骤209,接收该第二节点发送的更新消息,并根据该更新消息将该第二待写入数据对应的组标识修改为该第一组标识。
其中,根据该更新消息将该第二待写入数据对应的组标识修改为该第一组标识,可以包括但不限于:若该更新消息还携带该第二待写入数据的索引信息,则可以根据该索引信息确定该第二待写入数据在第二数据表中对应的第三数据行;然后,可以将该第三数据行中记录的组标识修改为第一组标识。
步骤210,在根据该更新消息将该第二待写入数据对应的组标识修改为该第一组标识之后,由本节点执行该第二待写入数据的写入过程。
在一个例子中,针对步骤207,在确定该第二待写入数据对应的组标识对应的主节点之后,若主节点是本节点,则可以由本节点将该第二待写入数据对应的组标识修改为第一组标识,并由本节点执行第二待写入数据的写入过程。
进一步的,还可以向本节点之外的其它节点发送更新消息,以使其它节点根据该更新消息将该第二待写入数据对应的组标识修改为第一组标识。
在一个例子中,针对步骤206,在确定该第二待写入数据对应的组标识之后,若该第二待写入数据对应的组标识与上述第一组标识相同,则可以由本节点执行第二待写入数据的写入过程,而不再执行上述步骤207-步骤210。
在上述实施例中,组标识可以包括但不限于分布式一致性协议的组标识。
在一个例子中,上述执行顺序只是为了方便描述给出的一个示例,在实际应用中,还可以改变步骤之间的执行顺序,对此执行顺序不做限制。而且,在其它实施例中,并不一定按照本说明书示出和描述的顺序来执行相应方法的步骤,其方法所包括的步骤可以比本说明书所描述的更多或更少。此外,本说明书中所描述的单个步骤,在其它实施例中可能被分解为多个步骤进行描述;本说明书中所描述的多个步骤,在其它实施例也可能被合并为单个步骤进行描述。
基于上述技术方案,本申请实施例中,提出一种支持多点写入的分布式数据库(其使用分布式一致性协议实现),由于分布式数据库支持数据的多点写入,因此,对于跨区域的用户来说,能够将数据写入到当前区域的节点,提高用户的业务体验,使得分布式数据库支持用户的就近写入和动态迁移,并实现行级和用户级的多点写入,能够保证分布式数据库的数据一致性,实现跨区域的分布式事务,解决用户纬度的数据跨区域问题,支撑业务实现就近写入。
本申请实施例提出另一种分布式数据库,该分布式数据库可以包括多个节点,不同的节点可以部署在相同区域或者不同区域;该分布式数据库还可以包括多个组,所述多个节点中的一个节点是该组的主节点;
其中,该分布式数据库中的节点(称为本节点,本节点对应至少一个组,本节点是该组的主节点)通过以下步骤实现数据写入:获取第一待写入数据,并确定第一待写入数据对应的第一数据行,该第一数据行可以包括该第一待写入数据对应的组标识;将该第一数据行包括的组标识修改为本节点对应的组的组标识,以将该第一数据行与本节点对应的组进行动态绑定。
其中,针对确定第一待写入数据对应的第一数据行的方式,可以参见上述步骤102,在此不再赘述。针对将该第一数据行包括的组标识,修改为本节点对应的组的组标识的方式,可以参见上述步骤103-步骤106,在此不再赘述。
基于上述技术方案,本申请实施例中,通过将第一数据行与本节点对应的组进行动态绑定,从而支持数据的多点写入,对于跨区域的用户来说,能够基于分布式一致性协议将数据写入到当前区域的节点,提高用户的业务体验,使得分布式一致性协议支持用户的就近写入和动态迁移,并实现行级和用户级的多点写入,能够保证分布式数据库的数据一致性,实现跨区域的分布式事务。
本申请实施例中还提出一种数据写入方法,该方法可以应用于分布式数据库,该分布式数据库包括第一区域的第一节点和第二区域的第二节点,第一节点对应至少一个组(后续称为第一组),且第一节点是第一组的主节点;第二节点对应至少一个组(后续称为第二组),且第二节点是第二组的主节点。
其中,当用户在第一区域接入时,则第一节点可以获取该用户的待写入数据,将待写入数据写入到数据表的数据行,并将该数据行的组标识修改为第一节点对应的第一组的组标识,并将该数据行同步到第二节点的数据表中。
进一步的,当用户从第一区域移动到第二区域接入时,则第二节点可以获取该用户的待写入数据,从数据表中确定与该用户对应的数据行,并将该数据行的组标识修改为第二节点对应的第二组的组标识,将该数据行同步到第一节点的数据表中。其中,第二节点将该数据行的组标识修改为第二节点对应的第二组的组标识,可以包括:将第二组的组标识发送给第一节点,以使第一节点将数据行的组标识修改为第二组的组标识;接收第一节点发送的更新消息,并根据该更新消息将该数据行的组标识修改为第二组的组标识。
其中,上述过程可以参见图1或者图2所示流程,在此不再赘述。
综上所述,本实施例中,当用户从第一区域接入时,可以由第一区域的第一节点实现数据写入,当用户从第一区域移动到第二区域接入时,可以由第二区域的第二节点实现数据写入,从而支持数据的多点写入、就近写入和动态迁移,并实现行级和用户级的多点写入,能够保证分布式数据库的数据一致性。
以下结合具体应用场景,对分布式数据库进行说明。参见图3A所示,为分布式数据库的结构示意图,该分布式数据库可以包括多个节点,在图3A中以三个节点为例,在实际应用中,分布式数据库包括的节点数量还可以更多,对此节点的数量不做限制。其中,不同的节点还可以部署在相同区域或者不同区域;例如,参见图3A所示,节点301可以部署在区域A(如杭州等),节点302可以部署在区域B(如上海等),节点303可以部署在区域C(如北京等)。
本实施例中,分布式数据库可以采用分布式一致性协议(如Paxos等)保证多副本数据的一致性、容灾切换等能力,为了使分布式一致性协议支持多点写入,可以设置多个组(如分布式一致性协议组),也就是说,该分布式数据库可以包括多个组,针对每个组来说,所述多个节点中的一个节点是所述组的主节点,而其它节点可以是所述组的从节点。而且,每个组具有唯一的组标识(如分布式一致性协议的组标识)。为了方便描述,以分布式一致性协议是Paxos为例,则可以设置多个Paxos组,且每个Paxos组具有唯一的Paxos组标识。
在一个例子中,分布式数据库中组的数量,可以基于分布式数据库中节点的数量确定,也就是说,Paxos组的数量可以与节点数量有关,如Paxos组的数量是节点数量的正整数倍,如节点数量为3时,则Paxos组的数量可以为3、6、9等;Paxos组的数量也可以与节点数量无关,如Paxos组的数量是任意值,如3、4、5、6、7等;对此Paxos组的数量不做限制,后续以6个Paxos组为例。
其中,Paxos组1的组标识可以为AA,Paxos组2的组标识可以为BB,Paxos组3的组标识可以为CC,Paxos组4的组标识可以为DD,Paxos组5的组标识可以为EE,Paxos组6的组标识可以为FF。而且,每个节点均可以存储表1所示的映射表,该映射表用于记录组标识、主节点和从节点的对应关系。
表1
其中,表1所示的映射表可以是根据经验配置的,对于每个Paxos组来说,该Paxos组对应一个主节点(也可以称为LEADER节点),其余节点均为从节点(也可以称为FOLLOWER节点)。从表1可以看出,对于所有的Paxos组来说,每个节点作为主节点的次数相同,每个节点作为从节点的次数也相同。
为了方便描述,图3A中只示出Paxos组1、Paxos组2和Paxos组3,对于Paxos组4、Paxos组5和Paxos组6,与Paxos组1、Paxos组2和Paxos组3类似。从图3A可以看出,节点301是Paxos组1的主节点,是Paxos组2和Paxos组3的从节点。节点302是Paxos组2的主节点,是Paxos组1和Paxos组3的从节点。节点303是Paxos组3的主节点,是Paxos组1和Paxos组2的从节点。
在一个例子中,分布式数据库中的每个节点还可以对应至少一个组;针对所述节点对应的组,所述节点可以是所述组的主节点。例如,节点301对应Paxos组1和Paxos组4,也就是说,节点301是Paxos组1的主节点,也是Paxos组4的主节点;节点302对应Paxos组2和Paxos组5,也就是说,节点302是Paxos组2的主节点,也是Paxos组5的主节点;节点303对应Paxos组3和Paxos组6,也就是说,节点303是Paxos组3的主节点,也是Paxos组6的主节点。
在一个例子中,参见图3A所示,分布式数据库可以采用集群用户态文件系统(如MyFS等,能够使得分布式数据库对底层存储进行自动化管理)存储数据;或者,分布式数据库也可以采用分布式存储系统存储数据,对此不做限制。
在一个例子中,上述分布式数据库可以包括但不限于X-DB(即一种高性能、低成本、可全球化部署、弹性扩展的分布式关系型数据库),且该分布式数据库可以支持自适应分区的Paxos行级多点可写技术。而且,分布式数据库可以通过APP(应用程序)向用户提供服务,以使用户通过APP访问分布式数据库。
在一个例子中,分布式数据库内的每个节点还可以包括路由服务模块,该路由服务模块可以实现数据的路由,对此路由服务模块的功能不做限制。
参见图3B所示,为分布式数据库的数据逻辑架构的一个示意图,第一层是表族(Table Family),用于表示存在事务关联的表的集合;第二层是表(Table),用于存储数据,也可以称为数据总表;第三层是表分区(Table Partition),表示按照分区规则,将一张表分为多个物理分区,每个物理分区是数据总表的一个数据子表,且同一个表族下的所有表的分区规则可以相同;第四层是表分区组(Partition Group),表示同一个表族中的所有表的相同分区;第5层是Paxos组,表示一个Paxos分区,且一个Paxos分区内的数据可以实现本地事务。
参见图3B所示,由于一个表分区组只能对应一个Paxos组,因此,同一个表分区组的数据行只能在同一个节点写入,这样,当数据需要在Paxos组之间迁移时,只能以表分区组为最小单位进行迁移,从而导致单个表分区内的多行数据无法在不同节点写入,继而导致分布式一致性协议无法支持多点写入。
以下结合具体应用场景,对上述过程进行说明。表族包括数据总表A和数据总表B,参见表2所示,为数据总表A的示例,参见表3所示,为数据总表B的示例。由于数据总表A内容较多,为减少数据总表A的空间占用,可以按照分区规则1(如姓氏拼音首字母、姓氏笔画数等)将数据总表A拆分成数据子表A1和数据子表A2,参见表4和表5所示,以2个数据子表为例,数据子表的数量可以大于2个。由于数据总表B内容较多,为减少数据总表B的空间占用,可以按照该分区规则1将数据总表B拆分成数据子表B1和数据子表B2,参见表6和表7所示,以2个数据子表为例,数据子表的数量可以大于2个。
表2
表3
用户名 |
消费数据 |
李二 |
数据B11 |
吕三 |
数据B12 |
张二 |
数据B13 |
赵三 |
数据B14 |
... |
… |
表4
用户名 |
身份数据 |
李二 |
数据A11 |
吕三 |
数据A12 |
... |
… |
表5
用户名 |
身份数据 |
张二 |
数据A13 |
赵三 |
数据A14 |
... |
… |
表6
用户名 |
消费数据 |
李二 |
数据B11 |
吕三 |
数据B12 |
... |
… |
表7
用户名 |
消费数据 |
张二 |
数据B13 |
赵三 |
数据B14 |
... |
… |
进一步的,针对数据子表A1、数据子表A2、数据子表B1和数据子表B2来说,由于数据子表A1和数据子表B1的姓氏拼音首字母为L,因此,将数据子表A1和数据子表B1添加到同一个表分区组1,且表分区组1对应Paxos组1,由于Paxos组1的主节点为节点301,因此,将数据子表A1和数据子表B1存储到节点301,由节点301实现数据子表A1和数据子表B1的数据写入。
由于数据子表A2和数据子表B2的姓氏拼音首字母为Z,因此,将数据子表A2和数据子表B2添加到同一个表分区组2,且表分区组2对应Paxos组2,由于Paxos组2的主节点为节点302,因此,将数据子表A2和数据子表B2存储到节点302,由节点302实现数据子表A2和数据子表B2的数据写入。
其中,将数据子表A1和数据子表B1存储到同一节点(如节点301)的原因在于:由于“李二”的身份数据和消费数据均存储在节点301,因此,若一个写事务需要同时写入“李二”的身份数据和消费数据,就可以由节点301进行写入,提高写入效率。若“李二”的身份数据存储在节点301,“李二”的消费数据存储在节点302,当一个写事务需要同时写入“李二”的身份数据和消费数据时,则节点301和节点302之间的写入会变得很复杂,甚至是写入失败。
显然,通过将数据子表A1和数据子表B1添加到表分区组1,并将表分区组1绑定Paxos组1,可以由节点301实现数据子表A1和数据子表B1的数据写入。通过将数据子表A2和数据子表B2添加到表分区组2,并将表分区组2绑定Paxos组2,可以由节点302实现数据子表A2和数据子表B2的数据写入。
但是,在上述方式中,针对数据子表A1和数据子表B1内的所有用户,需要在同一个区域接入,如“李二”和“吕三”均在节点301所在的区域A接入,一旦“李二”迁移到区域B,就会导致节点301无法对“李二”的数据进行写入。
针对上述发现,本实施例中,分布式数据库的数据逻辑架构可以参见图3C或者图3D所示。在图3C中可以包括表族,因此,可以采用相同的分区规则(如分区规则1)将数据总表A拆分成多个数据子表,将数据总表B拆分成多个数据子表。在图3D中可以不包括表族,因此,可以采用相同的分区规则或者不同的分区规则,将数据总表A拆分成多个数据子表,并将数据总表B拆分成多个数据子表。例如,可以采用分区规则1将数据总表A拆分成多个数据子表,将数据总表B拆分成多个数据子表;或者,可以采用分区规则1将数据总表A拆分成多个数据子表,并采用分区规则2将数据总表B拆分成多个数据子表。
为方便描述,以采用分区规则1将数据总表A拆分成数据子表A1和数据子表A2,采用分区规则1将数据总表B拆分成数据子表B1和数据子表B2为例。针对表2和表3所示的数据总表A和数据总表B,数据子表A1和数据子表A2参见表8和表9所示,数据子表B1和数据子表B2参见表10和表11所示。
表8
用户名 |
组标识 |
身份数据 |
李二 |
AA |
数据A11 |
吕三 |
AA |
数据A12 |
... |
… |
… |
表9
用户名 |
组标识 |
身份数据 |
张二 |
BB |
数据A13 |
赵三 |
BB |
数据A14 |
... |
… |
… |
表10
用户名 |
组标识 |
消费数据 |
李二 |
AA |
数据B11 |
吕三 |
AA |
数据B12 |
... |
… |
… |
表11
用户名 |
组标识 |
消费数据 |
张二 |
BB |
数据B13 |
赵三 |
BB |
数据B14 |
... |
… |
… |
进一步的,针对数据子表A1、数据子表A2、数据子表B1和数据子表B2来说,不需要将数据子表A1和数据子表B1添加到表分区组1,也不需要将数据子表A2和数据子表B2添加到表分区组2,即可以不涉及表分区组的特征,而是针对每个数据行增加一个组标识,表示这个数据行所属的Paxos组1。
例如,在数据子表A1和数据子表B1中的“李二”对应的数据行,增加一个组标识AA,使得“李二”对应的数据行对应Paxos组1,由于Paxos组1的主节点为节点301,因此,由节点301实现数据子表A1和数据子表B1中的“李二”对应的数据行的数据写入。显然,在上述方式中,由于“李二”的身份数据和消费数据均存储在节点301,因此,若一个写事务需要同时写入“李二”的身份数据和消费数据,就可以由节点301进行数据的写入,提高写入效率。
而且,在上述方式中,针对数据子表A1和数据子表B1内的所有用户,不需要在同一个区域接入,如“吕三”在节点301所在的区域A接入,而“李二”从区域A迁移到区域B,则可以将数据子表A1和数据子表B1中的“李二”对应的数据行,从组标识AA修改为组标识BB,参见表12和表13所示,这样,“李二”对应的数据行对应Paxos组2,由于Paxos组2的主节点为节点302,因此,由节点302实现数据子表A1和数据子表B1中的“李二”对应的数据行的数据写入。显然,在上述方式中,由于“李二”的身份数据和消费数据均存储在节点302,因此,若一个写事务需要同时写入“李二”的身份数据和消费数据,就可以由节点302进行数据的写入,提高写入效率,并实现用户的迁移。
表12
用户名 |
组标识 |
身份数据 |
李二 |
BB |
数据A11 |
吕三 |
AA |
数据A12 |
... |
… |
… |
表13
用户名 |
组标识 |
消费数据 |
李二 |
BB |
数据B11 |
吕三 |
AA |
数据B12 |
... |
… |
… |
综上所述,本实施例中,通过消除表分区组,并在数据行中添加Paxos组的组标识,从而可以解耦表分区组与Paxos组,打破了表分区组的限制,避免一个表分区组内的所有数据对应同一个Paxos组,并只能从一个节点写入的限制,而且,可以使数据行直接与Paxos组耦合,实现数据行和Paxos组的动态绑定。
在上述实施例中,数据子表中的组标识也可以称为PGID(Paxos Group ID,Paxos分组标识),通过在数据行中增加组标识,可以通过该组标识表示该数据行所属的Paxos分组,实现数据行和Paxos分组的动态绑定,由数据行的Paxos分组对应的主节点写入该数据行的数据,当用户发生迁移时,可以通过修改数据行关联的Paxos分组,来改变数据行的写入节点,从而实现用户的迁移。而且,上述方式中的最小数据单位是数据行,实现了基于流量的行级写入,同时通过事务级动态迁移的方法,实现了单节点的多个Paxos分组的分布式事务,是业务实现用户纬度就近接入的基础,是对分布式数据库甚至是关联业务架构的革新性改变,可以彻底解决用户纬度的数据切流问题,支撑业务实现就近写入。
以下结合几个具体实施例,对上述基于组标识的数据写入过程进行说明。
实施例一:用户“李二”在区域A接入,并发送数据写入请求1和数据写入请求2,数据写入请求1携带数据子表A1的表名称、用户名“张二”和数据A15,数据写入请求2携带数据子表B1的表名称、用户名“张二”和数据B15。
由于用户“李二”在区域A接入,因此,节点301可以接收到数据写入请求1,并从该数据写入请求1中获取数据子表A1的表名称、用户名“张二”和数据A15,并可以根据该表名称确定数据表是数据子表A1,参见表8所示。
然后,以用户名“张二”为索引,从数据子表A1中查询到数据行,即表8中的第一行,且该数据行中包括的组标识AA就是数据A15对应的组标识。
然后,通过该组标识AA查询表1所示的映射表,得到主节点是节点301。由于主节点是本节点(即节点301是组标识AA对应的Paxos组1的主节点),因此,由节点301执行数据A15的写入过程。具体的,节点301可以将表8中的数据A11修改为数据A15,并将从节点(对于Paxos组1来说,从节点是节点302和节点303)的数据子表A1(从节点的数据子表A1与主节点的数据子表A1完全相同,其内容是主节点同步的)中的数据A11修改为数据A15。
此外,由于数据写入请求1对应的组标识是组标识AA,因此,还可以记录事务组标识是组标识AA,表示针对当前的写事务,是针对组标识AA的写事务。
由于用户“李二”在区域A接入,因此,节点301可以接收到数据写入请求2。假设数据写入请求2与数据写入请求1是不同写事务,则数据写入请求2的处理流程与数据写入请求1的处理流程相同,在此不再赘述。假设数据写入请求2与数据写入请求1是相同写事务,则数据写入请求2的处理可以使用数据写入请求1的处理结果,即基于事务组标识进行处理,以下对此进行说明。
首先,节点301从数据写入请求2中获取数据子表B1的表名称、用户名“张二”和数据B15,并可以根据该表名称确定数据表是数据子表B1,参见表10所示。然后,以用户名“张二”为索引,从数据子表B1中查询到数据行,即表10中的第一行,且该数据行中包括的组标识就是数据B15对应的组标识。
进一步的,针对该组标识的不同情况,则还可以区分为如下情况:
情况一、假设该数据行中包括的组标识是组标识AA,由于组标识AA与事务组标识(即组标识AA)相同,因此,可以由节点301执行数据B15的写入过程。具体的,节点301可以将表10中的数据B11修改为数据B15,并将从节点的数据子表B1中的数据B11修改为数据B15,对此数据写入过程不再赘述。
情况二、假设该数据行中包括的组标识是组标识DD,由于组标识DD与事务组标识(即组标识AA)不同,因此,节点301通过该组标识DD查询表1所示的映射表,得到主节点是节点301。由于主节点是本节点(即节点301是组标识DD对应的Paxos组4的主节点),因此,节点301可以将该数据行中的组标识DD修改为事务组标识(即组标识AA),并向Paxos组4的从节点发送更新消息,而Paxos组4的从节点(如节点302和节点303)在接收到该更新消息后,根据更新消息将数据子表B1中相应数据行的组标识DD修改为组标识AA。
节点301将该数据行中的组标识DD修改为事务组标识(即组标识AA)之后,则这个数据行对应的Paxos组是从Paxos组4切换到Paxos组1,且可以由节点301执行数据B15的写入过程。具体的,节点301可以将表10中的数据B11修改为数据B15,并将从节点的数据子表B1中的数据B11修改为数据B15。
情况三、假设该数据行中包括的组标识是组标识BB,由于组标识BB与事务组标识(即组标识AA)不同,因此,节点301通过该组标识BB查询表1所示的映射表,得到主节点是节点302。由于主节点是节点302(即节点302是组标识BB对应的Paxos组2的主节点),而不是本节点301,因此,节点301向节点302发送通知消息,该通知消息可以携带事务组标识(即组标识AA)、索引信息“张二”、数据子表B1的表名称,对此通知消息的内容不做限制。
节点302在接收到该通知消息后,根据该表名称确定数据表是数据子表B1,以索引信息“张二”为索引,从数据子表B1中查询到数据行,并将该数据行中包括的组标识BB修改为该通知消息中携带的事务组标识(即组标识AA)。
节点302将该数据行中的组标识BB修改为组标识AA后,可以向Paxos组2的从节点发送更新消息,而Paxos组2的从节点(如节点301和节点303)在接收到该更新消息后,可以根据该更新消息将数据子表B1中相应数据行的组标识BB修改为组标识AA。具体的,以节点301的处理为例,该更新消息可以携带组标识AA、索引信息“张二”、数据子表B1的表名称,对此更新消息的内容不做限制;节点301在接收到该更新消息后,根据该表名称确定数据表是数据子表B1,以索引信息“张二”为索引,从数据子表B1中查询到数据行,并将该数据行中包括的组标识BB修改为该更新消息中携带的组标识AA。
经过上述处理,则节点301可以将该数据行中的组标识BB修改为事务组标识(即组标识AA),从而可以将这个数据行对应的Paxos组从Paxos组2切换到Paxos组1,又由于Paxos组1的主节点是节点301,因此,可以由节点301执行数据B15的写入过程。具体的,节点301可以将表10中的数据B11修改为数据B15,并将从节点的数据子表B1中的数据B11修改为数据B15。
实施例二:用户“李二”从区域B接入,并发送数据写入请求1和数据写入请求2,数据写入请求1携带数据子表A1的表名称、用户名“张二”和数据A15,数据写入请求2携带数据子表B1的表名称、用户名“张二”和数据B15。
由于用户“李二”从区域A切换到区域B接入,因此,节点302接收数据写入请求1,并从数据写入请求1中获取数据子表A1的表名称、用户名“张二”和数据A15,并可以根据该表名称确定数据表是数据子表A1,参见表8所示。
然后,以用户名“张二”为索引,从数据子表A1中查询到数据行,即表8中的第一行,且该数据行中包括的组标识AA就是数据A15对应的组标识。
然后,通过组标识AA查询表1所示的映射表,得到主节点是节点301。由于主节点是节点301(节点301是组标识AA对应的Paxos组1的主节点),而不是节点302,因此,节点302确定主节点是节点302的组标识,如组标识BB。
然后,节点302向节点301发送通知消息,该通知消息可以携带组标识BB、索引信息“张二”、数据子表A1的表名称,对此通知消息的内容不做限制。
进一步的,节点301在接收到该通知消息后,可以根据该表名称确定数据表是数据子表A1,以索引信息“张二”为索引,从数据子表A1中查询到数据行,并将该数据行中包括的组标识AA修改为该通知消息中携带的组标识BB。
节点301将该数据行中的组标识AA修改为组标识BB后,可以向Paxos组1的从节点发送更新消息,而Paxos组1的从节点(如节点302和节点303)在接收到该更新消息后,可以根据该更新消息将数据子表A1中相应数据行的组标识AA修改为组标识BB。具体的,以节点302的处理为例,该更新消息可以携带组标识BB、索引信息“张二”、数据子表A1的表名称,对此更新消息的内容不做限制;节点302在接收到该更新消息后,根据该表名称确定数据表是数据子表A1,以索引信息“张二”为索引,从数据子表A1中查询到数据行,并将该数据行中包括的组标识AA修改为该更新消息中携带的组标识BB。
经过上述处理,节点302将数据行中的组标识AA修改为组标识BB,从而将数据行对应的Paxos组从Paxos组1切换到Paxos组2,由于Paxos组2的主节点是节点302,因此由节点302执行数据A15的写入过程。具体的,节点302可以将表8中的数据A11修改为数据A15,并将从节点(对于Paxos组2来说,从节点是节点301和节点303)的数据子表A1中的数据A11修改为数据A15。
此外,由于数据写入请求1对应的组标识是组标识BB,因此,还可以记录事务组标识是组标识BB,表示针对当前的写事务,是针对组标识BB的写事务。
由于用户“李二”在区域B接入,因此,节点302可以接收到数据写入请求2。假设数据写入请求2与数据写入请求1是不同写事务,则数据写入请求2的处理流程与数据写入请求1的处理流程相同,在此不再赘述。假设数据写入请求2与数据写入请求1是相同写事务,则数据写入请求2的处理可以使用数据写入请求1的处理结果,即基于事务组标识进行处理,以下对此进行说明。
首先,节点302从数据写入请求2中获取数据子表B1的表名称、用户名“张二”和数据B15,并可以根据该表名称确定数据表是数据子表B1,参见表10所示。然后,以用户名“张二”为索引,从数据子表B1中查询到数据行,即表10中的第一行,且该数据行中包括的组标识就是数据B15对应的组标识。
进一步的,针对该组标识的不同情况,则还可以区分为如下情况:
情况一、假设该数据行中包括的组标识是组标识BB,由于组标识BB与事务组标识(即组标识BB)相同,因此,可以由节点302执行数据B15的写入过程。具体的,节点302可以将表10中的数据B11修改为数据B15,并将从节点的数据子表B1中的数据B11修改为数据B15,对此数据写入过程不再赘述。
情况二、假设该数据行中包括的组标识是组标识EE,由于组标识EE与事务组标识(即组标识BB)不同,因此,节点302通过该组标识EE查询表1所示的映射表,得到主节点是节点302。由于主节点是本节点,因此,节点302可以将该数据行中的组标识EE修改为事务组标识(即组标识BB),并向Paxos组5的从节点发送更新消息,而Paxos组5的从节点在接收到该更新消息后,根据更新消息将数据子表B1中相应数据行的组标识EE修改为组标识BB。
节点302将该数据行中的组标识EE修改为事务组标识(即组标识BB)之后,则这个数据行对应的Paxos组是从Paxos组5切换到Paxos组2,且可以由节点302执行数据B15的写入过程。具体的,节点302可以将表10中的数据B11修改为数据B15,并将从节点的数据子表B1中的数据B11修改为数据B15。
情况三、假设该数据行中包括的组标识是组标识AA,由于组标识AA与事务组标识(即组标识BB)不同,则节点302通过组标识AA查询表1所示的映射表,得到主节点是节点301。由于主节点是节点301,不是本节点302,因此节点302向节点301发送通知消息,该通知消息携带事务组标识(组标识BB)、索引信息“张二”、数据子表B1的表名称,对此通知消息的内容不做限制。
节点301在接收到该通知消息后,根据该表名称确定数据表是数据子表B1,以索引信息“张二”为索引,从数据子表B1中查询到数据行,并将该数据行中包括的组标识AA修改为该通知消息中携带的事务组标识(即组标识BB)。
节点301将该数据行中的组标识AA修改为组标识BB后,可以向Paxos组1的从节点发送更新消息,而Paxos组1的从节点(如节点302和节点303)在接收到该更新消息后,可以根据该更新消息将数据子表B1中相应数据行的组标识AA修改为组标识BB。经过上述处理,则节点302可以将该数据行中的组标识AA修改为事务组标识(即组标识BB),从而将这个数据行对应的Paxos组从Paxos组1切换到Paxos组2,又由于Paxos组2的主节点是节点302,因此,由节点302执行数据B15的写入过程。具体的,节点302可以将表10中的数据B11修改为数据B15,并将从节点的数据子表B1中的数据B11修改为数据B15。
本实施例中,可以实现用户就近接入访问,实现数据集群的全球部署,实现用户级别的动态切流,使得业务流量快速切换和精确切换。可以降低用户终端的响应延时,并达到提升访问体验、持续服务的效果。可以自适应Paxos分区,实现动态工作负载的均衡,充分发挥分布式系统去中心化的读写服务能力。
其中,上述方案可以实现用户自适应的就近读写。具体的,数据以行为单位进行写入,根据业务写请求单元自适应Paxos组,实现本地写入,当发起用户级别流量调配或被控单元容灾时(发生数据行写入单元改变),数据行可及时注册在以写入单元为主节点的Paxos组,满足用户级流量本地的安全写入。
上述方案可以实现去中心化的分布式数据库服务,例如,可以通过多种部署形态,满足业务不同等级的性能。而且,可以提高数据质量,例如,可以将同一个分区的不同副本调度到多个节点,当某个节点出现故障时,其它正常的节点可以在几秒内替代这个故障的节点,快速恢复服务,而且完全不丢数据。
上述方案可以将数据分区的最小单位从表级别提升至行级别,巧妙规避了单节点内多个Paxos分区的分布式事务,极大的提升了事务操作效率。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可以由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其它可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其它可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
而且,这些计算机程序指令也可以存储在能引导计算机或其它可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或者多个流程和/或方框图一个方框或者多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其它可编程数据处理设备上,使得在计算机或者其它可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其它可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。