CN114003657A - 分布式数据库的数据处理方法、系统、设备和存储介质 - Google Patents
分布式数据库的数据处理方法、系统、设备和存储介质 Download PDFInfo
- Publication number
- CN114003657A CN114003657A CN202111184072.2A CN202111184072A CN114003657A CN 114003657 A CN114003657 A CN 114003657A CN 202111184072 A CN202111184072 A CN 202111184072A CN 114003657 A CN114003657 A CN 114003657A
- Authority
- CN
- China
- Prior art keywords
- global
- transaction
- queue
- event
- tso
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
- G06F16/2365—Ensuring data consistency and integrity
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/27—Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/28—Databases characterised by their database models, e.g. relational or object models
- G06F16/284—Relational databases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/4881—Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
Abstract
本申请实施例提供了一种分布式数据库的数据处理方法、系统、设备和存储介质,采用所述全局时间戳TSO对所述transQueue中的Transaction进行排序,通过transQueue中的所述XA Event和所述waitTrans创建局部事务列表,并根据所述局部事务列表生成一级排序队列;针对各DN的一级排序队列进行多路归并排序,生成全局排序队列;针对所述全局排序队列,合并具有相同全局时间戳TSO的局部事务Transaction,并生成全局二进制日志Binlog。从而保证了在分布式数据库的数据处理复制过程中,事务的全局有序性和完整性。
Description
技术领域
本申请涉及计算机技术领域,特别是涉及一种分布式数据库的数据处理方法和系统、一种电子设备和一种存储介质。
背景技术
MySQL是一种开源关系数据库系统,在全球大多数企业技术栈中占有一席之地。估计每天有数以万计的下载次数,MySQL数据库因为其具备了可靠性高、实惠且易于使用等特点,被很多高性能数据库的开发者、管理员和IT经理的作为第一选择。MySQL拥有开放而强大的CDC(Change Data Capture,变动数据捕获)能力,基于MySQL的Binlog可以构建出各种复制链路,通过将变更数据同步到缓存系统、索引系统、大数据平台等等系统中,可以支撑各种各样业务场景。
现有技术中,针对分布式数据库的CDC方案以以下多种形态呈现:
1、行级有序的复制方案,保证单行数据的复制顺序和上游的变更顺序一致,一般以主键为基准进行Hash(Hash,散列函数运算),并配合消息中间件进行数据的分发订阅;
2、表级有序的复制方案,保证单张表中所有数据的复制顺序和上游的变更顺序一致,一般以表名TableName为基准进行Hash,并配合消息中间件进行数据的分发订阅;
3、节点级有序的复制方案,保证单个存储节点中所有数据的复制顺序和上游的变更顺序一致,一般在分布式MySQL Sharding场景下使用;
4、全局有序的复制方案,保证数据库中所有数据的复制顺序和上游分布式事务的执行顺序一致,一般需要引入全局时间戳。
对于上述行级有序、表级有序和节点级有序这三种复制方案,虽然对高并发和高吞吐友好,对DDL(Data Definition Language,数据库模式定义语言)非常不友好,无法实现DDL复制,对数据一致性的保障能力弱。
对于全局有序的复制方案,当前绝大部分分布式数据库仍不具备全局有序的复制能力,在订阅方式上大多以消息中间件为媒介为主,在数据交换格式上也各不相同,导致CDC服务能力较弱、接入成本很高。
发明内容
本申请实施例提供了一种分布式数据库的数据处理方法,以解决在针对分布式数据库的数据复制过程中,无法保证事务的全局有序性和完整性问题,并做到了完全兼容MySQL的数据复制标准。
相应的,本申请实施例还提供了一种分布式数据库的数据处理系统、一种电子设备以及一种存储介质,用以保证上述方法的实现及应用。
为了解决上述问题,本申请实施例公开了一种分布式数据库的数据处理方法,所述分布式数据库具有多个存储节点DN,所述DN具有对应的物理二进制日志Binlog,所述物理二进制日志Binlog用于储存分布式事务XA的局部事务操作信息XA Event,所述XA至少包含一个局部事务Transaction,所述局部事务Transaction由所述XA Event组成,所述XA具有对应的全局时间戳TSO,所述方法可以包括:
采用所述全局时间戳TSO对所述transQueue中的Transaction进行排序,通过transQueue中的所述XA Event和所述waitTrans创建局部事务列表,并根据所述局部事务列表生成一级排序队列;
针对各DN的一级排序队列进行多路归并排序,生成全局排序队列;
针对所述全局排序队列,合并具有相同全局时间戳TSO的局部事务Transaction,并生成全局二进制日志Binlog。
可选地,所述XA至少可以与一个所述DN相关联,针对于同一个XA,所有关联于同一个XA的DN上的局部事务Transaction可以具有相同的TSO。
可选地,所述XA Event包括一阶段提交信息XA Prepare,二阶段提交信息XACommit,回滚信息XA Rollback;针对于一个局部事务Transaction,所述XA Prepare,所述XA Commit,所述XA Rollback具有相同的事务标识符xid,所述将与各物理二进制日志Binlog对应的局部事务Transaction排序创建局部事务列表的步骤可以包括:
读取所述物理二进制日志Binlog中的所述XA Event,并将读取到的所述XA Event推送至预置的排序项目队列sortItemsQueue中;
当读取到所述XA Prepare时,将所述xid推送至预设的等待传输队列waitTrans中;
当读取到所述XA Commit,或,所述XA Rollback时,将所述xid从所述waitTrans中移除;
当读取到所述XA Commit时,通过所述xid将与所述XA Commit对应的XA Prepare合并,生成局部事务Transaction,并将所述Transaction推送至预设的传输队列transQueue中;
采用所述全局时间戳TSO对所述transQueue中的Transaction进行排序,通过transQueue中的所述XA Event和所述waitTrans创建局部事务列表,并根据所述局部事务列表生成一级排序队列。
可选地,在所述通过transQueue中的所述XA Event和所述waitTrans创建局部事务列表的步骤可以进一步包括:
从所述sortItemsQueue中依次获取所述XA Event;
当获取到所述XA Prepare时,提取所述xid,并判断是否接收到具有相同所述xid的所述XA Commit;
若是,则将所述XA Prepare从所述sortItemsQueue中移除,并再次从所述sortItemsQueue中获取所述XA Event;
若否,则停止从所述sortItemsQueue中获取所述XA Event;
当获取到所述XA Commit时,将所述XA Commit从所述sortItemsQueue中移除;
当获取到所述XA Rollback时,将所述XA Rollback从所述sortItemsQueue中移除;
确定所述transQueue中的最大时间戳maxTSO,并判断所述XA Commit对应的全局时间戳TSO是否大于所述maxTSO;
若是,则采用所述全局时间戳TSO作为新的最大时间戳maxTSO;
采用所述transQueue中TSO小于或等于maxTSO的Transaction作为安全事务创建局部事务列表,并采用所述局部事务列表生成所述一级排序队列,其中,所述一级排序队列由有序的局部事务Transaction组成。
可选地,在所述从所述sortItemsQueue中依次获取所述XA的步骤之后,还包括:
判断从所述sortItemsQueue中获取到的所述XA Event是否为空;
若是,则停止从所述sortItemsQueue中获取所述XA Event。
可选地,在所述从所述sortItemsQueue中依次获取所述XA的步骤之后,可以进一步包括:
判断从所述sortItemsQueue中获取到的所述XA Event的时长是否超过预设阈值;
若是,则停止从所述sortItemsQueue中获取所述XA Event。
可选地,所述针对各DN的一级排序队列进行多路归并排序,生成全局排序队列的步骤包括:
将所述局部事务列表中的一级排序队列的Transaction推送至预设的全局事务队列中;
采用所述TSO对所述全局事务队列中的Transaction进行排序,生成全局排序队列。
可选地,所述针对所述全局排序队列,合并具有相同全局时间戳TSO的局部事务Transaction,并生成全局二进制日志Binlog的步骤可以包括:
在所述全局排序队列中依次读取Transaction,并判断所述全局时间戳是否变更;
若是,则通过合并具有相同全局时间戳TSO的Transaction,生成完整全局事务;
提取所述全局排序队列中的所述完整全局事务的特性事件Event;
删除所述特性事件Event,并采用所述全局排序队列中的所述完整全局事务生成全局二进制日志Binlog。
可选地,可以还包括:
在所述全局二进制日志Binlog中,为完整全局事务添加查询日志RowsQueryLogEvent;其中,所述RowsQueryLogEvent用于记录所述完整全局事务对应的全局时间戳TSO。
可选地,所述全局二进制日志Binlog可以具有对应的逻辑库表,所述逻辑库表可以具有对应的逻辑库表名称,所述物理二进制日志Binlog可以具有对应的物理库表,所述物理库表可以具有对应的物理库表名称;所述逻辑库表名称可以用于在生成所述全局二进制日志Binlog时替换所述物理库表名称;所述逻辑库表与所述物理库表可以具有映射关系,所述映射关系可以由所述分布式数据库的元数据系统获取。
本申请实施例还公开了一种分布式数据库的数据处理系统,所述分布式数据库具有多个存储节点DN,所述DN具有对应的物理二进制日志Binlog,所述物理二进制日志Binlog用于储存分布式事务XA的局部事务操作信息XA Event,所述XA至少包含一个局部事务Transaction,所述局部事务Transaction由所述XA Event组成,所述XA具有对应的全局时间戳TSO,所述系统可以包括:
一级排序模块,用于采用所述全局时间戳TSO对所述transQueue中的Transaction进行排序,通过transQueue中的所述XA Event和所述waitTrans创建局部事务列表,并根据所述局部事务列表生成一级排序队列;
全局排序模块,用于针对各DN的一级排序队列进行多路归并排序,生成全局排序队列;
事务合并模块,用于针对所述全局排序队列,合并具有相同全局时间戳TSO的局部事务Transaction,并生成全局二进制日志Binlog。
可选地,所述XA至少与一个所述DN相关联,针对于同一个XA,所有关联于同一个XA的DN上的局部事务Transaction具有相同的TSO。
可选地,所述XA Event可以包括一阶段提交信息XA Prepare,二阶段提交信息XACommit,回滚信息XA Rollback;针对于一个局部事务Transaction,所述XA Prepare,所述XA Commit,所述XA Rollback可以具有相同的事务标识符xid,所述一级排序模块可以包括:
局部事务读取子模块,用于读取所述物理二进制日志Binlog中的所述XA Event,并将读取到的所述XA Event推送至预置的排序项目队列sortItemsQueue中;
标识符推送子模块,用于在读取到所述XA Prepare时,将所述xid推送至预设的等待传输队列waitTrans中;
标识符移除子模块,用于在读取到所述XA Commit,或,所述XA Rollback时,将所述xid从所述waitTrans中移除;
局部事务推送子模块,用于在读取到所述XA Commit时,通过所述xid将与所述XACommit对应的XA Prepare合并,生成局部事务Transaction,并将所述Transaction推送至预设的传输队列transQueue中;
局部事务列表生成子模块,用于采用所述全局时间戳TSO对所述transQueue中的Transaction进行排序,通过transQueue中的所述XA Event和所述waitTrans创建局部事务列表,并根据所述局部事务列表生成一级排序队列。
可选地,所述局部事务列表生成子模块可以进一步包括:
事务获取单元,用于从所述sortItemsQueue中依次获取所述XA Event;
标识符判断单元,用于在获取到所述XA Prepare时,提取所述xid,并判断是否接收到具有相同所述xid的所述XA Commit;若接收到具有相同所述xid的所述XA Commit,则调用第一事务移除单元;若未接收到具有相同所述xid的所述XA Commit,则调用第一停止获取单元;
第一事务移除单元,用于将所述XA Prepare从所述sortItemsQueue中移除,并再次从所述sortItemsQueue中获取所述XA Event;
第一停止获取单元,用于停止从所述sortItemsQueue中获取所述XA Event;
第二事务移除单元,用于在获取到所述XA Commit时,将所述XA Commit从所述sortItemsQueue中移除;
第三事务移除单元,用于在获取到所述XA Rollback时,将所述XA Rollback从所述sortItemsQueue中移除;
时间戳判断单元,用于确定所述transQueue中的最大时间戳maxTSO,并判断所述XA Commit对应的全局时间戳TSO是否大于所述maxTSO;若所述XA Commit对应的全局时间戳TSO大于所述maxTSO,则调用时间戳替换单元;
时间戳替换单元,用于采用所述全局时间戳TSO作为新的最大时间戳maxTSO;
局部事务列表创建单元,用于采用所述transQueue中TSO小于或等于maxTSO的Transaction作为安全事务创建局部事务列表,并采用所述局部事务列表生成所述一级排序队列,其中,所述一级排序队列由有序的局部事务Transaction组成。
可选地,所述事务获取子模块还可以包括:
事务空集判断单元,用于判断从所述sortItemsQueue中获取到的所述XA Event是否为空;若从所述sortItemsQueue中获取到的所述XA Event为空,则调用第二停止获取单元;
第二停止获取单元,用于停止从所述sortItemsQueue中获取所述XA Event。
可选地,所述事务获取子模块进一步包括:
时长判断单元,用于判断从所述sortItemsQueue中获取到的所述XA Event的时长是否超过预设阈值;若从所述sortItemsQueue中获取到的所述XA Event的时长超过预设阈值,则调用第三停止获取单元;
第三停止获取单元,用于停止从所述sortItemsQueue中获取所述XA Event。
可选地,所述全局排序模块可以包括:
事务推送子模块,用将所述局部事务列表中的一级排序队列的Transaction推送至预设的全局事务队列中;
全局排序子模块,用于采用所述TSO对所述全局事务队列中的Transaction进行排序,生成全局排序队列。
可选地,所述XA具有回转信息Commit TSO Rotation,所述事务合并模块可以包括:
全局时间戳变更判断子模块,用于在所述全局排序队列中依次读取Transaction,并判断所述全局时间戳是否变更;当所述全局时间戳变更时,则调用完整全局事务生成子模块;
完整全局事务生成子模块,用于通过合并具有相同全局时间戳TSO的Transaction,生成完整全局事务;
特性事件提取子模块,用于提取所述全局排序队列中的所述完整全局事务的特性事件Event;
特性事件删除子模块,用于删除所述特性事件Event,并采用所述全局排序队列中的所述完整全局事务生成全局二进制日志Binlog。
可选地,可以还包括:
查询日志添加模块,用于在所述全局二进制日志Binlog中,为完整全局事务添加查询日志RowsQueryLogEvent;其中,所述RowsQueryLogEvent用于记录所述完整全局事务对应的全局时间戳TSO。
可选地,所述全局二进制日志Binlog可以具有对应的逻辑库表,所述逻辑库表可以具有对应的逻辑库表名称,所述物理二进制日志Binlog可以具有对应的物理库表,所述物理库表可以具有对应的物理库表名称;所述逻辑库表名称可以用于在生成所述全局二进制日志Binlog时替换所述物理库表名称;所述逻辑库表与所述物理库表可以具有映射关系,所述映射关系可以由所述分布式数据库的元数据系统获取。
本申请实施例还公开了一种电子设备,包括:处理器;和存储器,其上存储有可执行代码,当所述可执行代码被执行时,使得所述处理器执行如本申请实施例中一个或多个所述的分布式数据库的数据处理方法。
本申请实施例还公开了一个或多个机器可读介质,其上存储有可执行代码,当所述可执行代码被执行时,使得处理器执行如本申请实施例中一个或多个所述的分布式数据库的数据处理方法。
与现有技术相比,本申请实施例包括以下优点:
MySQL作为当前最主流的数据库之一,具有极好的生态基础,基于分布式MySQLSharding(MySQL Sharding,分片MySQL)思想构建分布式数据库,也是当前的主流发展方向,截止到目前为止,还没有一个技术方案能针对分布式MySQL Sharding架构在进行数据复制时,可以保证事务的全局有序性和完整性,而在本申请实施例中,通过采用所述全局时间戳TSO对所述transQueue中的Transaction进行排序,通过transQueue中的所述XA Event和所述waitTrans创建局部事务列表,并根据所述局部事务列表生成一级排序队列;针对各DN的一级排序队列进行多路归并排序,生成全局排序队列;针对所述全局排序队列,合并具有相同全局时间戳TSO的局部事务Transaction,并生成全局二进制日志Binlog。从而保证了在分布式数据库的数据复制过程中,事务具有全局有序性和完整性,同时,也可以实现强一致的效果,从而可以实现在数据一致性要求较高的场景下实现数据复制,例如,在转账场景中,用户在备库查询账户总余额,总是可以查到正确的结果。除此之外,所述全局二进制日志Binlog在数据格式上和原生MySQL的Binlog格式完全兼容,具备强大的生态兼容性。
附图说明
图1是本申请的一种分布式数据库的数据处理方法实施例的步骤流程图;
图2是本申请的一种针对一级排序队列的生成过程流程图;
图3是本申请的一种一级排序队列的示意图;
图4是本申请的一种针对全局二进制日志Binlog生成过程的流程图;
图5是本申请的一种分布式数据库的数据处理系统实施例的结构框图;
图6是本申请一实施例提供的系统的结构示意图。
具体实施方式
为使本申请的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本申请作进一步详细的说明。
参照图1,是本申请的一种分布式数据库的数据处理方法实施例的步骤流程图,具体可以包括如下步骤:
步骤102、采用所述全局时间戳TSO对所述transQueue中的Transaction进行排序,通过transQueue中的所述XA Event和所述waitTrans创建局部事务列表,并根据所述局部事务列表生成一级排序队列;
步骤104、针对各DN的一级排序队列进行多路归并排序,生成全局排序队列;
步骤106、针对所述全局排序队列,合并具有相同全局时间戳TSO的局部事务Transaction,并生成全局二进制日志Binlog。
在本申请实施例中,所述分布式数据库可以具有多个存储节点DN,所述DN可以具有对应的物理二进制日志Binlog,所述物理二进制日志Binlog可以用于储存分布式事务XA的局部事务操作信息XA Event,所述XA至少包含一个局部事务Transaction,所述局部事务Transaction可以由所述XA Event组成,所述XA可以具有对应的全局时间戳TSO。
为使本领域技术人员更好地理解本申请,以下对本申请涉及的术语简单说明:
DN(存储节点,Data Node)
MySQL InnoDB(数据库引擎)
TSO(全局时间戳,Timestamp Oracle)
XA(eXtended Architecture,分布式事务)
XA协议(一种分布式事务处理规范)
二进制日志Binlog:用于记录DDL和DML(data manipulation language,数据操纵语言)语句,以事件形式记录,还包含语句所执行的消耗的时间。
2PC(两阶段提交):2PC是一种强一致性、中心化的原子提交协议够保证原子性和持久性的提交协议,参与事务的组件有多个,每个组件分别记录各自操作日志,操作日志是分离式而非集中式。
MVCC(Multi-version Cocurrent Control,多版本并发控制):用于在并发访问数据库时,通过对数据进行多版本控制,避免因写锁而导致读操作的堵塞,从而很好的优化并发堵塞问题。
while循环:是计算机的一种基本循环模式,当满足条件时进入循环,进入循环后,当条件不满足时跳出循环。
逻辑库表:用于分布式MySQL Sharding场景下,具备多个Sharding分区的表,即对外直接可见和使用的库表。
物理库表:用于分布式MySQL Sharding场景下,每个MySQL节点上归属于某个逻辑库表的Sharding库表。
物理Binlog:用于分布式MySQL Sharding场景下,每个MySQL节点上的Binlog。
在具体实现中,本申请实施例可以在分布式数据库复制数据之前,基于MySQLInnoDB通过以XA协议+2PC+TSO的形式实现MVCC机制,并且可以在原生MySQL的局部事务第二阶段提交事件XA Commit Event之前扩展出一个序列事件Sequence,用来记录该事务的第二阶段提交事件时间戳Commit TSO,将记录到的Commit TSO写入物理Binlog中。
在实际应用中,本申请实施例的分布式数据库可以包括多个存储节点DN,储存节点DN可以是MySQL,而每个DN可以具有与其对应的物理二进制日志Binlog,物理二进制日志Binlog可以用于用于储存分布式事务XA的局部事务操作信息XA Event,XA至少包含一个局部事务Transaction,局部事务Transaction可以由XA Event组成,XA可以具有对应的全局时间戳TSO。
在具体实现中,本申请实施例可以对记录于各物理二进制日志Binlog的局部事务Transaction进行排序,从而可以得到与各存储节点DN的对应创建局部事务列表,在创建局部事务列表后,还可以针对局部事务列表生成与局部事务列表对应的一级排序队列。这意味着,一个DN所对应的着一组一级排序队列,同时,也可以将这个一级排序队列视为一个偏序集合。
在实际应用中,分布式数据库可以具有多个DN,每个DN具可以有自己的物理局部事务列表,在完成对每个DN的一级排序队列的排序后,每个DN都可以得到一个局部有序的一级排序队列,局部事务列表可以用来生成该一级排序队列,此时,可以将与多路局部事务列表对应的一级排序队列归并到一起,再通过全局时间戳TSO对其进行排序,从而生成全局排序队列,全局排序队列可以由全局有序的局部事务Transaction组成,同时,可以将全局排序队列视为全序集合。
在本申请的一个优选地实施例中,所述XA至少与一个所述DN相关联,针对于同一个XA,所有关联于同一个XA的DN上的局部事务Transaction具有相同的TSO。
在本申请的一个优选地实施例中的XA至少与一个DN相关联,针对于同一个XA,所有关联于同一个XA的DN上的局部事务Transaction具有相同的TSO。
在实际应用中,对于一个XA来说,至少会有一个DN参与其中,对同一个XA来说,其在所有参与该XA的DN节点上的Commit TSO是相同的。
由上可知,本申请实施例可以在全局排序队列中,对具有相同全局时间戳TSO的局部事务Transaction进行合并,然后生成全局二进制日志Binlog,该全局二进制日志Binlog可以记载有多个DN中的局部事务Transaction,并且,记载于全局二进制日志Binlog中的局部事务Transaction全局有序。
本申请实施例通过将采用所述全局时间戳TSO对所述transQueue中的Transaction进行排序,通过transQueue中的所述XA Event和所述waitTrans创建局部事务列表,并根据所述局部事务列表生成一级排序队列;针对各DN的一级排序队列进行多路归并排序,生成全局排序队列;针对所述全局排序队列,合并具有相同全局时间戳TSO的局部事务Transaction,并生成全局二进制日志Binlog。从而保证了在分布式数据库的数据复制过程中,事务具有全局有序性和完整性,同时,也可以实现强一致的效果,从而可以实现在数据一致性要求较高的场景下实现数据复制,例如,在转账场景中,用户在备库查询账户总余额,总是可以查到正确的结果。除此之外,所述全局二进制日志Binlog在数据格式上和原生MySQL的Binlog格式完全兼容,具备强大的生态兼容性。
在上述实施例的基础上,提出了上述实施例的变型实施例,在此需要说明的是,为了使描述简要,在变型实施例中仅描述与上述实施例的不同之处。
在本申请的一个优选地实施例中,步骤102、所述将与各物理二进制日志Binlog对应的局部事务Transaction排序创建局部事务列表的步骤包括:
读取所述物理二进制日志Binlog中的所述XA Event,并将读取到的所述XA Event推送至预置的排序项目队列sortItemsQueue中;
当读取到所述XA Prepare时,将所述xid推送至预设的等待传输队列waitTrans中;
当读取到所述XA Commit,或,所述XA Rollback时,将所述xid从所述waitTrans中移除;
当读取到所述XA Commit时,通过所述xid将与所述XA Commit对应的XA Prepare合并,生成局部事务Transaction,并将所述Transaction推送至预设的传输队列transQueue中;
采用所述全局时间戳TSO对所述transQueue中的Transaction进行排序,通过transQueue中的所述XA Event和所述waitTrans创建局部事务列表,并根据所述局部事务列表生成一级排序队列。
在本申请实施例的一种示例中,所述XA Event包括一阶段提交信息XA Prepare,二阶段提交信息XA Commit,回滚信息XA Rollback;针对于一个局部事务Transaction,所述XA Prepare,所述XA Commit,所述XA Rollback具有相同的事务标识符xid。
在实际应用中,本申请实施例的XA可以包括一阶段提交信息XA Prepare,二阶段提交信息XA Commit,回滚信息XA Rollback以及其他事务信息,而针对于一个局部事务Transaction,所述XA Prepare,所述XA Commit,所述XA Rollback具有相同的事务标识符xid,所以,针对于同一个局部事务Transaction,不论其XA Prepare、XA Commit、XARollback是否存储于同一个DN,其全局时间戳TSO都是相同的。
具体而言,XA事务的基础可以是两阶段提交协议2PC,其中,需要有一个事务协调者来保证所有的事务参与者都完成了准备工作,即,一阶段提交信息XA Prepare。如果协调者收到所有参与者都准备好的消息,就会通知所有的事务都可以提交,即,二阶段提交信息XA Commit。
XA事务可以分为内部XA和外部XA,其中,外部XA可以参与到外部的分布式事务中,需要应用层介入作为协调者,而内部XA事务可以用于同一实例下跨多个MySQL InnoDB,并由Binlog作为协调者,例如在一个MySQL InnoDB提交时,需要将提交信息写入二进制日志Binlog,这就是一个分布式内部XA事务,二进制日志Binlog的参与者可以是MySQL本身。
为使本申请相关领域技术人员更好的理解本申请实施例,下面采用一个具体示例来解释分布式事务XA。
在MySQL中XA事务可以包括:
XA{START|BEGIN}xid[JOIN|RESUME]——启动一个XA事务[xid必须是一个唯一值;(JOIN|RESUME)字句不被支持]
XA END xid[SUSPEND(FOR MIGRATE)]——结束一个XA事务([SUSPEND[FORMIGRATE]]字句不被支持)
XA PREPARE xid——准备
XA COMMIT xid[ONE PHASE]——提交XA事务
XA ROLLBACK xid——回滚XA事务
XA RECOVER——查看处于PREPARE阶段的所有XA事务
事务标识符xid为:
xid是一个事务标识符,它由客户端提供或者有MySQL服务器生成。
xid的格式一般为xid:gtrid[,bqual[,formatID]];gtrid是一个全局事务标识符,bqual是一个分支限定符,formatID是一个数字,用于标识由gtrid和bqual值使用的格式。根据语法的表示,bqual和formatID是自选的。如果没有给定,默认的bqual值是”。如果没有给定,默认的fromatID值是1。
XA事务状态进展过程为:
1.使用XA START启动一个XA事务,并把它置为ACTIVE状态。
2.对一个ACTIVE XA事务,发布构成事务的SQL语句,然后发布一个XA END语句,XAEND把事务置为IDLE状态。
3.对一个IDLE XA事务,发布一个XA PREPARE语句或者一个XACOMMIT...ONEPHASE语句:前者把事务置为PREPARE状态,此时XA RECOVER语句的输出包含事务的xid值(XARECOVER语句会列出所有处于PREPARE状态的XA事务);后者用于预备和提交事务,不会被XARECOVER列出,因为事务已经终止。
4.对一个PREPARE XA事务,可以发布一个XA COMMIT语句来提交和终止事务,或者发布一个XA ROLLBACK来回滚并终止事务。
在实际应用中,全局时间戳TSO在物理Binlog文件中是乱序的,为了实现MySQL全局有序,可以优先对DN完成一级排序,本申请实施例可以先通过在读取到XA Prepare时,将xid推送至预设的等待传输队列waitTrans中,在读取到XA Commit,或,XA Rollback时,将xid从waitTrans中移除,在后续一级排序的过程中知晓接收到XA Prepare时是否接收到对应的XA Commit,通过在读取到XA Commit时,将与XA Commit对应的Transaction推送至预设的传输队列transQueue中,并在ransQueue中通过获取到的XA Prepare、XA Commit、XARollback以及与XA Commit对应的全局时间戳TSO对Transaction进行排序,得到一个针对DN中Transaction的一级排序队列。
在本申请一个更为优选地的实施例中,在所述通过transQueue中的所述XA Event和所述waitTrans创建局部事务列表的步骤进一步包括:
从所述sortItemsQueue中依次获取所述XA Event;
当获取到所述XA Prepare时,提取所述xid,并判断是否接收到具有相同所述xid的所述XA Commit;
若是,则将所述XA Prepare从所述sortItemsQueue中移除,并再次从所述sortItemsQueue中获取所述XA Event;
若否,则停止从所述sortItemsQueue中获取所述XA Event;
当获取到所述XA Commit时,将所述XA Commit从所述sortItemsQueue中移除;
当获取到所述XA Rollback时,将所述XA Rollback从所述sortItemsQueue中移除;
确定所述transQueue中的最大时间戳maxTSO,并判断所述XA Commit对应的全局时间戳TSO是否大于所述maxTSO;
若是,则采用所述全局时间戳TSO作为新的最大时间戳maxTSO;
采用所述transQueue中TSO小于或等于maxTSO的Transaction作为安全事务创建局部事务列表,并采用所述局部事务列表生成所述一级排序队列,其中,所述一级排序队列由有序的局部事务Transaction组成。
在本申请另一个更为优选地的实施例中,在所述从所述sortItemsQueue中依次获取所述XA的步骤之后,还可以包括:
可以判断从所述sortItemsQueue中获取到的所述XA Event是否为空;
若是,则停止从所述sortItemsQueue中获取所述XA Event。
在本申请又一个更为优选的实施例中,在所述从所述sortItemsQueue中依次获取所述XA的步骤之后,还可以进一步包括:
可以判断从所述sortItemsQueue中获取到的所述XA Event的时长是否超过预设阈值;
若是,则停止从所述sortItemsQueue中获取所述XA Event。
在本申请又一个更为优选的实施例中,在采用小于或等于所述maxTSO的Transaction创建物理二进制日志Binlog的步骤之前,还可以包括:
可以判断所述Transaction是否为空;
若是,则可以重新读取所述物理二进制日志Binlog中的所述XA Event,并可以将读取到的XA Event推送至预置的排序项目队列sortItemsQueue中。
具体而言,对于一个XA(XA Prepare+XA Commit),如果在其XA Prepare和XACommit之间,穿插了其它事务的XA Prepare或XA Commit,则称这些事务间存在事务空洞。事务空洞在Binlog中具体表现为,在某个局部事务的XA Prepare和XA Commit之间,有其它局部事务XA的提交日志。
例如,假设有事务XA1和XA2,将XA Prepare简称为P,XA Commit简称为C,若有空洞,则其在Binlog中的表现为:P1 P2 C1 C2、P1 P2 C2 C1、P2 P1 C1 C2、P2 P1 C2 C1;若无空洞,则其在Binlog中的表现为:P1 C1 P2 C2、P2 C2 P1 C1。
结合上述XA事务状态进展过程,可以推导出三条定理,具体包括:
定理一
定义:如果两个事务之间存在空洞,则这两个事务间不存在发生之前happenbefore约束,即,两个局部事务之间必不存在写冲突,调整事务的前后关系不会导致数据一致性问题。
采用反证法证明:因为存在写冲突的并发事务,会被排它锁转化为串行关系;所以,存在写冲突的事务,不可能同时进入XA Prepare阶段;因此,没有触发空洞的条件;得证。
定理二
定义:如果两个事务之间存在空洞,则这两个事务Commit TSO的大小,和Commit的顺序不相关,即Commit靠前的事务的Commit TSO不一定比Commit靠后的事务的Commit TSO大。例如:P1 P2 C1 C2场景,C1的Commit TSO可能大于C2,也可能小于C2。
证明:由定理一可知,存在空洞关系的事务之间必不存在写冲突,那么事务的Commit便存在随机性,又因为获取Commit TSO和Commit行为并不是一个原子操作,那么先发起Commit的事务可能持有的是比较小的Commit TSO,得证。
定理三
定义:如果两个事务之间不存在空洞,则这两个事务Commit TSO的大小,和Commit的顺序正相关,即Commit靠前的事务的Commit TSO一定小于等于Commit靠后的事务的Commit TSO。例如:P1 C1 P2 C2场景,C1的Commit TSO一定小于等于C2的Commit TSO。
证明:当事务T1、T2之间没有空洞时,即满足形如P1 C1 P2 C2这种情况时,结合上述2PC事务的特性可知:
a.对于事务T1,当提交C1时,所有分片的P1一定已经完成提交。
b.对于事务T2,当提交C2时,所有分片的P2一定已经完成提交。
所以,从发生顺序来看,因为C1=>P2,P2=>C2,所以C1=>C2(“=>”代表“在之前发生”),即:C1一定发生在C2之前,C1和C2不会出现并发,得证。
结论:由定理一和定理二可知,Commit TSO的乱序场景的确存在,但排序不会引发数据一致性问题;由定理三可知,乱序只发生在存在事务空洞的场景。
图2示出了本申请的一种针对一级排序队列的生成过程流程图,如图2所示,在具体实现中,本申请实施例可以通过如下方式生成一级排序队列。
步骤201,读取物理二进制日志Binlog中的XA Event,步骤202,可以将读取到的XAEvent推送至预置的排序项目队列sortItemsQueue中,并在读取过程中,执行步骤203,判断读取到的XA Event的事务类型;当读取到XA Prepare时,可以执行步骤204,将xid推送至预设的等待传输队列waitTrans中,当读取到XA Commit,或,XA Rollback时,可以执行步骤205,将xid从waitTrans中移除;执行步骤206,判断读取到的XA Event的事务类型,当读取到XA Commit时,可以执行步骤207,可以将与XA Commit对应的Transaction推送至预设的传输队列transQueue中;在完成对sortItemsQueue中的XA Event进行读取之后,可以执行步骤208,可以从sortItemsQueue中依次获取XA Event,并可以在从sortItemsQueue获取XAEvent的过程中,可以执行步骤209,可以判断获取到的XA Event的事务类型,当获取到XAPrepare时,可以提取xid,可以并执行步骤210,从waitTrans中查找是否有一样的xid,若没有,则可以执行步骤211,可以将该XA Prepare从sortItemsQueue中移除,并可以再次执行步骤208,若有,则可以退出循环停止从sortItemsQueue中获取XA Event,当获取到XACommit时,可以执行步骤211,将XA Commit从sortItemsQueue中移除;当获取到XARollback时,可以执行步骤211,可以将XA Rollback从sortItemsQueue中移除;执行步骤212,可以判断从sortItemsQueue中移除XA Event的事务类型,当被移除的XA为XA Commit时,可以执行步骤213,确定transQueue中的最大时间戳maxTSO,并判断XA Commit对应的全局时间戳TSO是否大于maxTSO,若XA Commit对应的全局时间戳TSO小于或等于maxTSO,则可以执行214,可以判断获取到的所述XA的时长是否在预设时长内,若获取到的所述XA的时长超过了预设时长,则可以退出循环或可以执行步骤208,若获取到的所述XA Event的时长在预设时长内,则可以执行步骤215,可以获取C-TSO小于或等于maxTSO对应的的Transaction并推送至下游的事务列表中,若XA Commit对应的全局时间戳TSO大于maxTSO,则可以采用全局时间戳TSO作为新的最大时间戳maxTSO,在完成步骤215之后,可以执行步骤216,判断Transaction是否为空,若Transaction为空,则可以退出循环,或,可以执行步骤201,若Transaction不为空,则可以执行步骤217,采用所述transQueue中TSO小于或等于maxTSO的Transaction作为安全事务创建局部事务列表,并采用所述局部事务列表生成所述一级排序队列,其中,所述一级排序队列由有序的局部事务Transaction组成。
参考图3所示的本申请的一种一级排序队列的示意图,可以将读取到的XA Event推送至预置的排序项目队列sortItemsQueue中,此时,在sortItemsQueue的XA Event301是无序的,而在transQueue中的Transaction302可以包含了与其对应的XA Prepare、XACommit以及全局时间戳TSO,并且,在transQueue中的Transaction可以是一个根据全局时间戳TSO排序的有序序列。
为使本领域技术人员更好理解本申请实施例,以下提供一个完整事例用以描述本申请实施例如何将各存储节点DN的局部事务排序生成一级排序队列。
T代表局部事务Transaction;P代表XA Prepare;C代表XA Commit;R代表XARollback;TSO代表全局时间戳TSO。
步骤1.按Binlog文件中的自然顺序,拉取和消费事务日志。
步骤2.每收到一个P、C或R,都会将其Put到sortItemsQueue。
步骤3.每收到一个P,提取其持有的xid,将xid Put到waitTrans。
步骤4.每收到一个R,提取其持有的xid,将xid从waitTrans中移除
步骤5.每收到一个C,提取其持有的xid,将xid从waitTrans中移除
步骤6.每收到一个C,提取其持有的T,将T Put到transQueue。
步骤7.每收到一个C,完成上述步骤2,5,6中的操作之后,进行如下的操作获取可向外输出的事务列表:
a.启动while循环,并设定循环超时时间
i从sortItemsQueue的队列头,获取元素,记为Item,Item为空则退出循环,不为空则继续
ii.如果该Item是一个P,提取其持有的xid,然后通过waitTrans来判断,是否已经收到对应的C。如果已经收到,则将该Item从sortItemsQueue中移除,跳转到步骤i继续下一轮;如果还未收到,则直接退出while循环
iii.如果该Item是一个C或R,则将该Item从sortItemsQueue中移除,然后用C的Commit TSO和当前的maxTSO进行对比,如果C的TSO大于maxTSO,则用C的TSO替换maxTSO。看是否已经超时,如果没有,则跳转步骤i继续下次循环;如果已经超时,则退出while循环。
b.从transQueue中获取所有小于等于maxTSO的Transaction,构造局部事务列表,如果列表不为空,输出到下游(这些事务可以安全的向外输出,通过定理三可以证明)。
步骤8.返回步骤1继续处理。
当然,本领域技术人员可以根据实际情况采用其它算法进行一级排序均是可行的,本申请对此无需加以限制。
在本申请的一个优选实施例中,步骤步骤104、所述针对各DN的一级排序队列进行多路归并排序,生成全局排序队列可以包括如下步骤:
将所述局部事务列表中的一级排序队列的Transaction推送至预设的全局事务队列中;
采用所述TSO对所述全局事务队列中的Transaction进行排序,生成全局排序队列。
在具体实现中,本申请实施例可以在构造局部事务列表之后,将Transaction输送至下游,即,每个物理Binlog对应的一级排序队列至少含有一个局部事务Transaction,本申请实施例可以将各存储节点DN对应的物理二进制日志Binlog中的Transaction推送至预设的全局事务队列中,然后可以取全局时间戳TSO最小的事务输出到全局事务队列下游,循环往复,得到一个无界的全局排序队列。
当然,本领域技术人员可以根据实际情况采用其它算法进行全局排序均是可行的,本申请对此无需加以限制。
在本申请的一个优选实施例中,步骤106、所述针对所述全局排序队列,合并具有相同全局时间戳TSO的局部事务Transaction,并生成全局二进制日志Binlog可以包括如下步骤:
在所述全局排序队列中依次读取Transaction,并判断所述全局时间戳是否变更;
若是,则通过合并具有相同全局时间戳TSO的Transaction,生成完整全局事务;
提取所述全局排序队列中的所述完整全局事务的特性事件Event;
删除所述特性事件Event,并采用所述全局排序队列中的所述完整全局事务生成全局二进制日志Binlog。
在具体实现中,可以在全局排序队列的基础上完成局部事务合并,每当出现Commit TSO Rotation时,代表全局时间戳发生变更,即,意味着上一个XA结束,新XA的开始,以此为基准区分不同的XA,又因为上述可知,针对于同一个Transaction,所有关联于同一个Transaction的DN上具有相同的TSO,所以可以将分散到各个DN的局部事务合并为一个完整的事务,并且,在合并的过程中可以将类似XA Start、XA End、XA Prepare等对应XA特性的特性事件Event剔除,只保留单机特性的Event。
本申请实施例可以通过在生成生成全局二进制日志Binlog之前,删除了事务的特性事件,从而剔除了全局二进制日志Binlog的复杂性。
在本申请的一个优选实施例中,还可以在所述全局二进制日志Binlog中,为完整全局事务添加查询日志RowsQueryLogEvent;其中,所述RowsQueryLogEvent用于记录所述完整全局事务对应的全局时间戳TSO。
在实际应用中,可以通过全局排序队列生成的全局二进制日志Binlog,和原生MySQL的Binlog相比,全局二进制日志Binlog可以在每个XA的后面都可以加载一个RowsQueryLogEvent类型的事件,RowsQueryLogEvent可以用来记录每个事务的全局时间戳TSO,目的是为了支持故障恢复,当生产全局二进制日志Binlog的链路发生中断或重启时,可以基于文件中记录的最后一个全局时间戳TSO进行链路恢复。追加的RowsQueryLogEvent可以按照数据库转储MySQL Dump协议的规定,该事件则会被下游系统忽略,下游系统无法感知到分布式系统的内部细节,不会影响订阅消费。
同理,本申请实施例还可以参照MySQL实现一个转储Dump程序,即可对外提供消费订阅能力,下游系统可以像订阅单机MySQL Binlog一样,消费分布式数据库的全局二进制日志Binlog。
本申请实施例可以通过对全局二进制日志Binlog中的XA添加符合数据库转储MySQL Dump协议的RowsQueryLogEvent,从而可以使得全局二进制日志Binlog同时兼容MySQL Binlog文件格式和Dump协议,进而可以使得下游系统无法感知到分布式系统的内部细节,不会影响订阅消费。
在本申请的一个优选实施例中,所述全局二进制日志Binlog可以具有对应的逻辑库表,所述逻辑库表可以具有对应的逻辑库表名称,所述物理二进制日志Binlog可以具有对应的物理库表,所述物理库表可以具有对应的物理库表名称;所述逻辑库表名称可以用于在生成所述全局二进制日志Binlog时替换所述物理库表名称;所述逻辑库表与所述物理库表可以具有映射关系,所述映射关系可以由所述分布式数据库的元数据系统获取。
在具体实现中,Transaction合并完成后,可以将物理Binlog中的物理库表名称替换为逻辑库表的名称,用以实现全局二进制日志Binlog能对外直接可见和使用,物理库表和逻辑库表的映射关系可以通过分布式数据库的元数据系统获取。
如图4所示,图4是本申请的一种针对全局二进制日志Binlog生成过程的流程图,本申请实施例的核心在于排序,排序的依据是全局时间戳TSO,在实际应用中,本申请实施例可以用于分布式数据库的CDC的核心组件中。对于一个XA来说,至少会有一个DN节点参与其中,对同一个Transaction来说,其在所有参与该事务的DN节点上的全局时间戳TSO可以是相同的。由XA的特性所决定,全局时间戳TSO在每个DN节点的物理Binlog中并不是天然有序的,所以可以先针对每个DN进行一级排序生成一级排序队列,在生成一级排序队列的基础上对所有DN节点的局部事务列表中的局部事务进行多路归并,并可以通过全局排序生成全局排序队列,在全局有序的基础上,可以将持有相同全局时间戳TSO的XA合并为一个完整的事务,并可以生成全局二进制日志Binlog以MySQL单机事务的形态进行输出。
本申请实施例可以通过采用所述全局时间戳TSO对所述transQueue中的Transaction进行排序,通过transQueue中的所述XA Event和所述waitTrans创建局部事务列表,并根据所述局部事务列表生成一级排序队列;针对各DN的一级排序队列进行多路归并排序,生成全局排序队列;针对所述全局排序队列,合并具有相同全局时间戳TSO的局部事务Transaction,并生成全局二进制日志Binlog。从而保证了在分布式数据库的数据复制过程中,事务具有全局有序性和完整性,同时,也可以实现强一致的效果,从而可以实现在数据一致性要求较高的场景下实现数据复制,例如,在转账场景中,用户在备库查询账户总余额,总是可以查到正确的结果。除此之外,所述全局二进制日志Binlog在数据格式上和原生MySQL的Binlog格式完全兼容,具备强大的生态兼容性。
进一步来说,本申请实施例采用了TSO策略,以全局时间戳(TSO)为基准实现分布式MVCC,可以使分布式数据库具有正确的线性一致性和良好的性能;同时,把分布式局部事务转化为单机事务日志格式的全局二进制日志Binlog,满足数据强一致要求;并通过在生成生成全局二进制日志Binlog之前,删除了事务的特性事件,从而剔除了全局二进制日志Binlog的复杂性;除此之外,还通过对全局二进制日志Binlog中的XA添加符合数据库转储MySQL Dump协议的RowsQueryLogEvent,从而使得全局二进制日志Binlog同时兼容MySQLBinlog文件格式和Dump协议,进而使得下游系统无法感知到分布式系统的内部细节,不会影响订阅消费。
需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请实施例并不受所描述的动作顺序的限制,因为依据本申请实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本申请实施例所必须的。
在上述实施例的基础上,本实施例还提供了一种分布式数据库的数据处理系统,应用于终端设备、服务器等电子设备中。
参照图5,示出了本申请的一种分布式数据库的数据处理系统实施例的结构框图,具体可以包括如下模块:
一级排序模块501,用于采用所述全局时间戳TSO对所述transQueue中的Transaction进行排序,通过transQueue中的所述XA Event和所述waitTrans创建局部事务列表,并根据所述局部事务列表生成一级排序队列;
全局排序模块502,用于针对各DN的一级排序队列进行多路归并排序,生成全局排序队列;
事务合并模块503,用于针对所述全局排序队列,合并具有相同全局时间戳TSO的局部事务Transaction,并生成全局二进制日志Binlog。
可选地,所述XA至少与一个所述DN相关联,针对于同一个XA,所有关联于同一个XA的DN上的局部事务Transaction具有相同的TSO。
可选地,所述XA Event可以包括一阶段提交信息XA Prepare,二阶段提交信息XACommit,回滚信息XA Rollback;针对于一个局部事务Transaction,所述XA Prepare,所述XA Commit,所述XA Rollback具有相同的事务标识符xid,所述一级排序模块501可以包括:
局部事务读取子模块,可以用于读取所述物理二进制日志Binlog中的所述XAEvent,并将读取到的所述XA Event推送至预置的排序项目队列sortItemsQueue中;
标识符推送子模块,可以用于在读取到所述XA Prepare时,将所述xid推送至预设的等待传输队列waitTrans中;
标识符移除子模块,可以用于在读取到所述XA Commit,或,所述XA Rollback时,将所述xid从所述waitTrans中移除;
局部事务推送子模块,可以用于在读取到所述XA Commit时,通过所述xid将与所述XA Commit对应的XA Prepare合并,生成局部事务Transaction,并将所述Transaction推送至预设的传输队列transQueue中;
局部事务列表生成子模块,可以用于采用所述全局时间戳TSO对所述transQueue中的Transaction进行排序,通过transQueue中的所述XA Event和所述waitTrans创建局部事务列表,并根据所述局部事务列表生成一级排序队列。
可选地,所述局部事务列表生成子模块可以进一步包括:
事务获取单元,可以用于从所述sortItemsQueue中依次获取所述XA Event;
标识符判断单元,可以用于在获取到所述XA Prepare时,提取所述xid,并判断是否接收到具有相同所述xid的所述XA Commit;若接收到具有相同所述xid的所述XACommit,则调用第一事务移除单元;若未接收到具有相同所述xid的所述XA Commit,则调用第一停止获取单元;
第一事务移除单元,可以用于将所述XA Prepare从所述sortItemsQueue中移除,并再次从所述sortItemsQueue中获取所述XA Event;
第一停止获取单元,可以用于停止从所述sortItemsQueue中获取所述XA Event;
第二事务移除单元,可以用于在获取到所述XA Commit时,将所述XA Commit从所述sortItemsQueue中移除;
第三事务移除单元,可以用于在获取到所述XA Rollback时,将所述XA Rollback从所述sortItemsQueue中移除;
时间戳判断单元,可以用于确定所述transQueue中的最大时间戳maxTSO,并判断所述XA Commit对应的全局时间戳TSO是否大于所述maxTSO;若所述XA Commit对应的全局时间戳TSO大于所述maxTSO,则调用时间戳替换单元;
时间戳替换单元,可以用于采用所述全局时间戳TSO作为新的最大时间戳maxTSO;
局部事务列表创建单元,可以用于采用所述transQueue中TSO小于或等于maxTSO的Transaction作为安全事务创建局部事务列表,并采用所述局部事务列表生成所述一级排序队列,其中,所述一级排序队列由有序的局部事务Transaction组成。
可选地,所述事务获取子模块还可以包括:
事务空集判断单元,可以用于判断从所述sortItemsQueue中获取到的所述XAEvent是否为空;若从所述sortItemsQueue中获取到的所述XA Event为空,则调用第二停止获取单元;
第二停止获取单元,可以用于停止从所述sortItemsQueue中获取所述XA Event。
可选地,所述事务获取子模块可以进一步包括:
时长判断单元,可以用于判断从所述sortItemsQueue中获取到的所述XA Event的时长是否超过预设阈值;若从所述sortItemsQueue中获取到的所述XA Event的时长超过预设阈值,则调用第三停止获取单元;
第三停止获取单元,可以用于停止从所述sortItemsQueue中获取所述XA Event。
可选地,所述全局排序模块502可以包括:
事务推送子模块,可以用将所述局部事务列表中的一级排序队列的Transaction推送至预设的全局事务队列中;
全局排序子模块,可以用于采用所述TSO对所述全局事务队列中的Transaction进行排序,生成全局排序队列。
可选地,所述XA可以具有回转信息Commit TSO Rotation,所述事务合并模块503可以包括:
全局时间戳变更判断子模块,用于在所述全局排序队列中依次读取Transaction,并判断所述全局时间戳是否变更;当所述全局时间戳变更时,则调用完整全局事务生成子模块;
完整全局事务生成子模块,用于通过合并具有相同全局时间戳TSO的Transaction,生成完整全局事务;
特性事件提取子模块,用于提取所述全局排序队列中的所述完整全局事务的特性事件Event;
特性事件删除子模块,用于删除所述特性事件Event,并采用所述全局排序队列中的所述完整全局事务生成全局二进制日志Binlog。
可选地,还可以包括:
查询日志添加模块,可以用于在所述全局二进制日志Binlog中,为完整全局事务添加查询日志RowsQueryLogEvent;其中,所述RowsQueryLogEvent可以用于记录所述完整全局事务对应的全局时间戳TSO。
可选地,所述全局二进制日志Binlog可以具有对应的逻辑库表,所述逻辑库表可以具有对应的逻辑库表名称,所述物理二进制日志Binlog可以具有对应的物理库表,所述物理库表可以具有对应的物理库表名称;所述逻辑库表名称可以用于在生成所述全局二进制日志Binlog时替换所述物理库表名称;所述逻辑库表与所述物理库表可以具有映射关系,所述映射关系可以由所述分布式数据库的元数据系统获取。
本申请实施例还提供了一种非易失性可读存储介质,该存储介质中存储有一个或多个模块(programs),该一个或多个模块被应用在设备时,可以使得该设备执行本申请实施例中各方法步骤的指令(instructions)。
本申请实施例提供了一个或多个机器可读介质,其上存储有指令,当由一个或多个处理器执行时,使得电子设备执行如上述实施例中一个或多个所述的方法。本申请实施例中,所述电子设备包括终端设备、服务器(集群)等各类型的设备。
本公开的实施例可被实现为使用任意适当的硬件,固件,软件,或及其任意组合进行想要的配置的系统,该系统可包括终端设备、服务器(集群)等电子设备。图6示意性地示出了可被用于实现本申请中所述的各个实施例的示例性系统600。
对于一个实施例,图6示出了示例性系统600,该系统具有一个或多个处理器602、被耦合到(一个或多个)处理器602中的至少一个的控制模块(芯片组)604、被耦合到控制模块604的存储器606、被耦合到控制模块604的非易失性存储器(NVM)/存储设备608、被耦合到控制模块604的一个或多个输入/输出设备610,以及被耦合到控制模块604的网络接口612。
处理器602可包括一个或多个单核或多核处理器,处理器602可包括通用处理器或专用处理器(例如图形处理器、应用处理器、基频处理器等)的任意组合。在一些实施例中,系统600能够作为本申请实施例中所述终端设备、服务器(集群)等设备。
在一些实施例中,系统600可包括具有指令614的一个或多个计算机可读介质(例如,存储器606或NVM/存储设备608)以及与该一个或多个计算机可读介质相合并被配置为执行指令614以实现模块从而执行本公开中所述的动作的一个或多个处理器602。
对于一个实施例,控制模块604可包括任意适当的接口控制器,以向(一个或多个)处理器602中的至少一个和/或与控制模块604通信的任意适当的设备或组件提供任意适当的接口。
控制模块604可包括存储器控制器模块,以向存储器606提供接口。存储器控制器模块可以是硬件模块、软件模块和/或固件模块。
存储器606可被用于例如为系统600加载和存储数据和/或指令614。对于一个实施例,存储器606可包括任意适当的易失性存储器,例如,适当的DRAM。在一些实施例中,存储器606可包括双倍数据速率类型四同步动态随机存取存储器(DDR4SDRAM)。
对于一个实施例,控制模块604可包括一个或多个输入/输出控制器,以向NVM/存储设备608及(一个或多个)输入/输出设备610提供接口。
例如,NVM/存储设备608可被用于存储数据和/或指令614。NVM/存储设备608可包括任意适当的非易失性存储器(例如,闪存)和/或可包括任意适当的(一个或多个)非易失性存储设备(例如,一个或多个硬盘驱动器(HDD)、一个或多个光盘(CD)驱动器和/或一个或多个数字通用光盘(DVD)驱动器)。
NVM/存储设备608可包括在物理上作为系统600被安装在其上的设备的一部分的存储资源,或者其可被该设备访问可不必作为该设备的一部分。例如,NVM/存储设备608可通过网络经由(一个或多个)输入/输出设备610进行访问。
(一个或多个)输入/输出设备610可为系统600提供接口以与任意其他适当的设备通信,输入/输出设备610可以包括通信组件、音频组件、传感器组件等。网络接口612可为系统600提供接口以通过一个或多个网络通信,系统600可根据一个或多个无线网络标准和/或协议中的任意标准和/或协议来与无线网络的一个或多个组件进行无线通信,例如接入基于通信标准的无线网络,如WiFi、2G、3G、4G、5G等,或它们的组合进行无线通信。
对于一个实施例,(一个或多个)处理器602中的至少一个可与控制模块604的一个或多个控制器(例如,存储器控制器模块)的逻辑封装在一起。对于一个实施例,(一个或多个)处理器602中的至少一个可与控制模块604的一个或多个控制器的逻辑封装在一起以形成系统级封装(SiP)。对于一个实施例,(一个或多个)处理器602中的至少一个可与控制模块604的一个或多个控制器的逻辑集成在同一模具上。对于一个实施例,(一个或多个)处理器602中的至少一个可与控制模块604的一个或多个控制器的逻辑集成在同一模具上以形成片上系统(SoC)。
在各个实施例中,系统600可以但不限于是:服务器、台式计算设备或移动计算设备(例如,膝上型计算设备、手持计算设备、平板电脑、上网本等)等终端设备。在各个实施例中,系统600可具有更多或更少的组件和/或不同的架构。例如,在一些实施例中,系统600包括一个或多个摄像机、键盘、液晶显示器(LCD)屏幕(包括触屏显示器)、非易失性存储器端口、多个天线、图形芯片、专用集成电路(ASIC)和扬声器。
其中,检测系统中可采用主控芯片作为处理器或控制模块,传感器数据、位置信息等存储到存储器或NVM/存储设备中,传感器组可作为输入/输出设备,通信接口可包括网络接口。
对于系统实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
本申请实施例是参照根据本申请实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程分布式数据库的数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程分布式数据库的数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的系统。
这些计算机程序指令也可存储在能引导计算机或其他可编程分布式数据库的数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令系统的制造品,该指令系统实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程分布式数据库的数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本申请实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请实施例范围的所有变更和修改。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
以上对本申请所提供的一种分布式数据库的数据处理方法和系统,一种电子设备和一种存储介质,进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。
Claims (13)
1.一种分布式数据库的数据处理方法,其特征在于,所述分布式数据库具有多个存储节点DN,所述DN具有对应的物理二进制日志Binlog,所述物理二进制日志Binlog用于储存分布式事务XA的局部事务操作信息XA Event,所述XA至少包含一个局部事务Transaction,所述局部事务Transaction由所述XA Event组成,所述XA具有对应的全局时间戳TSO,所述方法包括:
采用所述全局时间戳TSO对所述transQueue中的Transaction进行排序,通过transQueue中的所述XA Event和所述waitTrans创建局部事务列表,并根据所述局部事务列表生成一级排序队列;
针对各DN的一级排序队列进行多路归并排序,生成全局排序队列;
针对所述全局排序队列,合并具有相同全局时间戳TSO的局部事务Transaction,并生成全局二进制日志Binlog。
2.根据权利要求1所述的方法,其特征在于,所述XA至少与一个所述DN相关联,针对于同一个XA,所有关联于同一个XA的DN上的局部事务Transaction具有相同的TSO。
3.根据权利要求1或2所述的方法,其特征在于,所述XA Event包括一阶段提交信息XAPrepare,二阶段提交信息XA Commit,回滚信息XA Rollback;针对于一个局部事务Transaction,所述XA Prepare,所述XA Commit,所述XA Rollback具有相同的事务标识符xid,所述将与各物理二进制日志Binlog对应的局部事务Transaction排序创建局部事务列表的步骤包括:
读取所述物理二进制日志Binlog中的所述XA Event,并将读取到的所述XA Event推送至预置的排序项目队列sortItemsQueue中;
当读取到所述XA Prepare时,将所述xid推送至预设的等待传输队列waitTrans中;
当读取到所述XA Commit,或,所述XA Rollback时,将所述xid从所述waitTrans中移除;
当读取到所述XA Commit时,通过所述xid将与所述XA Commit对应的XA Prepare合并,生成局部事务Transaction,并将所述Transaction推送至预设的传输队列transQueue中;
采用所述全局时间戳TSO对所述transQueue中的Transaction进行排序,通过transQueue中的所述XA Event和所述waitTrans创建局部事务列表,并根据所述局部事务列表生成一级排序队列。
4.根据权利要求3所述的方法,其特征在于,在所述通过transQueue中的所述XA Event和所述waitTrans创建局部事务列表的步骤进一步包括:
从所述sortItemsQueue中依次获取所述XA Event;
当获取到所述XA Prepare时,提取所述xid,并判断是否接收到具有相同所述xid的所述XA Commit;
若是,则将所述XA Prepare从所述sortItemsQueue中移除,并再次从所述sortItemsQueue中获取所述XA Event;
若否,则停止从所述sortItemsQueue中获取所述XA Event;
当获取到所述XA Commit时,将所述XA Commit从所述sortItemsQueue中移除;
当获取到所述XA Rollback时,将所述XA Rollback从所述sortItemsQueue中移除;
确定所述transQueue中的最大时间戳maxTSO,并判断所述XA Commit对应的全局时间戳TSO是否大于所述maxTSO;
若是,则采用所述全局时间戳TSO作为新的最大时间戳maxTSO;
采用所述transQueue中TSO小于或等于maxTSO的Transaction作为安全事务创建局部事务列表,并采用所述局部事务列表生成所述一级排序队列,其中,所述一级排序队列由有序的局部事务Transaction组成。
5.根据权利要求4所述的方法,其特征在于,在所述从所述sortItemsQueue中依次获取所述XA的步骤之后,还包括:
判断从所述sortItemsQueue中获取到的所述XA Event是否为空;
若是,则停止从所述sortItemsQueue中获取所述XA Event。
6.根据权利要求4所述的方法,其特征在于,在所述从所述sortItemsQueue中依次获取所述XA的步骤之后,进一步包括:
判断从所述sortItemsQueue中获取到的所述XA Event的时长是否超过预设阈值;
若是,则停止从所述sortItemsQueue中获取所述XA Event。
7.根据权利要求1至6中任一项所述的方法,其特征在于,所述针对各DN的一级排序队列进行多路归并排序,生成全局排序队列的步骤包括:
将所述局部事务列表中的一级排序队列的Transaction推送至预设的全局事务队列中;
采用所述TSO对所述全局事务队列中的Transaction进行排序,生成全局排序队列。
8.根据权利要求1至7中任一项所述的方法,其特征在于,所述针对所述全局排序队列,合并具有相同全局时间戳TSO的局部事务Transaction,并生成全局二进制日志Binlog的步骤包括:
在所述全局排序队列中依次读取Transaction,并判断所述全局时间戳是否变更;
若是,则通过合并具有相同全局时间戳TSO的Transaction,生成完整全局事务;
提取所述全局排序队列中的所述完整全局事务的特性事件Event;
删除所述特性事件Event,并采用所述全局排序队列中的所述完整全局事务生成全局二进制日志Binlog。
9.根据权利要求1至8任一项所述的方法,其特征在于,还包括:
在所述全局二进制日志Binlog中,为完整全局事务添加查询日志RowsQueryLogEvent;其中,所述RowsQueryLogEvent用于记录所述完整全局事务对应的全局时间戳TSO。
10.根据权利要求1至9任一项所述的方法,其特征在于,所述全局二进制日志Binlog具有对应的逻辑库表,所述逻辑库表具有对应的逻辑库表名称,所述物理二进制日志Binlog具有对应的物理库表,所述物理库表具有对应的物理库表名称;所述逻辑库表名称用于在生成所述全局二进制日志Binlog时替换所述物理库表名称;所述逻辑库表与所述物理库表具有映射关系,所述映射关系由所述分布式数据库的元数据系统获取。
11.一种分布式数据库的数据处理系统,其特征在于,所述分布式数据库具有多个存储节点DN,所述DN具有对应的物理二进制日志Binlog,所述物理二进制日志Binlog用于储存分布式事务XA的局部事务操作信息XA Event,所述XA至少包含一个局部事务Transaction,所述局部事务Transaction由所述XA Event组成,所述XA具有对应的全局时间戳TSO,所述系统包括:
一级排序模块,用于采用所述全局时间戳TSO对所述transQueue中的Transaction进行排序,通过transQueue中的所述XA Event和所述waitTrans创建局部事务列表,并根据所述局部事务列表生成一级排序队列;
全局排序模块,用于针对各DN的一级排序队列进行多路归并排序,生成全局排序队列;
事务合并模块,用于针对所述全局排序队列,合并具有相同全局时间戳TSO的局部事务Transaction,并生成全局二进制日志Binlog。
12.一种电子设备,其特征在于,包括:处理器;和
存储器,其上存储有可执行代码,当所述可执行代码被执行时,使得所述处理器执行如权利要求1-10中一个或多个所述的分布式数据库的数据处理方法。
13.一个或多个机器可读介质,其上存储有可执行代码,当所述可执行代码被执行时,使得处理器执行如权利要求1-10中一个或多个所述的分布式数据库的数据处理方法。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111184072.2A CN114003657A (zh) | 2021-10-11 | 2021-10-11 | 分布式数据库的数据处理方法、系统、设备和存储介质 |
PCT/CN2022/123165 WO2023061249A1 (zh) | 2021-10-11 | 2022-09-30 | 分布式数据库的数据处理方法、系统、设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111184072.2A CN114003657A (zh) | 2021-10-11 | 2021-10-11 | 分布式数据库的数据处理方法、系统、设备和存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114003657A true CN114003657A (zh) | 2022-02-01 |
Family
ID=79922564
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111184072.2A Pending CN114003657A (zh) | 2021-10-11 | 2021-10-11 | 分布式数据库的数据处理方法、系统、设备和存储介质 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN114003657A (zh) |
WO (1) | WO2023061249A1 (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2023061249A1 (zh) * | 2021-10-11 | 2023-04-20 | 阿里云计算有限公司 | 分布式数据库的数据处理方法、系统、设备和存储介质 |
CN116701544A (zh) * | 2023-08-07 | 2023-09-05 | 金篆信科有限责任公司 | 分布式数据库日志处理方法和装置、电子设备和存储介质 |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8938636B1 (en) * | 2012-05-18 | 2015-01-20 | Google Inc. | Generating globally coherent timestamps |
CN106681846B (zh) * | 2016-12-29 | 2020-10-13 | 北京奇虎科技有限公司 | 日志数据的统计方法、装置及系统 |
CN110196760B (zh) * | 2018-07-12 | 2023-04-18 | 腾讯科技(深圳)有限公司 | 分布式事务一致性实现方法及装置 |
CN109977171B (zh) * | 2019-02-02 | 2023-04-28 | 中国人民大学 | 一种保证事务一致性和线性一致性的分布式系统和方法 |
CN113193947B (zh) * | 2021-04-23 | 2022-11-15 | 北京百度网讯科技有限公司 | 实现分布式全局序的方法、设备、介质及程序产品 |
CN114003657A (zh) * | 2021-10-11 | 2022-02-01 | 阿里云计算有限公司 | 分布式数据库的数据处理方法、系统、设备和存储介质 |
-
2021
- 2021-10-11 CN CN202111184072.2A patent/CN114003657A/zh active Pending
-
2022
- 2022-09-30 WO PCT/CN2022/123165 patent/WO2023061249A1/zh unknown
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2023061249A1 (zh) * | 2021-10-11 | 2023-04-20 | 阿里云计算有限公司 | 分布式数据库的数据处理方法、系统、设备和存储介质 |
CN116701544A (zh) * | 2023-08-07 | 2023-09-05 | 金篆信科有限责任公司 | 分布式数据库日志处理方法和装置、电子设备和存储介质 |
CN116701544B (zh) * | 2023-08-07 | 2023-11-24 | 金篆信科有限责任公司 | 分布式数据库日志处理方法和装置、电子设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
WO2023061249A1 (zh) | 2023-04-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10860612B2 (en) | Parallel replication across formats | |
US11093468B1 (en) | Advanced metadata management | |
Lakshman et al. | Cassandra: a decentralized structured storage system | |
US20190340168A1 (en) | Merging conflict resolution for multi-master distributed databases | |
Vora | Hadoop-HBase for large-scale data | |
Auradkar et al. | Data infrastructure at LinkedIn | |
US9589041B2 (en) | Client and server integration for replicating data | |
US9996427B2 (en) | Parallel backup for distributed database system environments | |
US10248709B2 (en) | Promoted properties in relational structured data | |
US9535932B1 (en) | Backup and restore of databases | |
WO2023061249A1 (zh) | 分布式数据库的数据处理方法、系统、设备和存储介质 | |
US20180004777A1 (en) | Data distribution across nodes of a distributed database base system | |
US20130006993A1 (en) | Parallel data processing system, parallel data processing method and program | |
US10599676B2 (en) | Replication control among redundant data centers | |
US11226985B2 (en) | Replication of structured data records among partitioned data storage spaces | |
US11003550B2 (en) | Methods and systems of operating a database management system DBMS in a strong consistency mode | |
WO2023077971A1 (zh) | 事务处理方法、装置、计算设备及存储介质 | |
CN105353988A (zh) | 一种元数据读写方法及装置 | |
Srinivasan et al. | Citrusleaf: A real-time nosql db which preserves acid | |
US20160041859A1 (en) | Synchronization testing of active clustered servers | |
Bronson et al. | Open data challenges at Facebook | |
US11461201B2 (en) | Cloud architecture for replicated data services | |
US9703788B1 (en) | Distributed metadata in a high performance computing environment | |
CN116501700B (zh) | 一种app格式化文件离线存储方法、装置、设备及存储介质 | |
Agrawal et al. | Survey on Mongodb: an open-source document database |
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 | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 40067044 Country of ref document: HK |