这次,听人大教授讲讲分布式数据库的多级一致性|TDSQL 关键技术突破

news2025/2/25 10:13:22

近年来,凭借高可扩展、高可用等技术特性,分布式数据库正在成为金融行业数字化转型的重要支撑。分布式数据库如何在不同的金融级应用场景下,在确保数据一致性的前提下,同时保障系统的高性能和高可扩展性,是分布式数据库的一个核心技术挑战

针对以上分布式一致性的困境,中国人民大学-腾讯协同创新实验室研究提出“多级一致性”的事务处理理念。该技术包含严格可串行化、顺序可串行化、可串行化三大隔离级别,可针对不同应用场景要求,极大地平衡性能与一致性要求,满足金融及各类企业场景的分布式事务处理需求。该项技术已应用于腾讯分布式数据库TDSQL产品中,确保TDSQL按需提供数据一致性,并确保数据无异常。TDSQL是当前国内率先进入国有大型银行核心系统正式投产的国产分布式数据库,该项技术是其中的关键支撑。

这次,中国人民大学教授、博士生导师卢卫老师为大家全面解锁分布式数据库的多级一致性及构建技术!

背景

从本质上看,数据库是长期存储在计算机内、有组织的、可共享的数据集合。当多个用户并发操作数据库时,事务调度的可串行化是并发控制的正确性理论。但该观点在当前却受到了挑战。Daniel J. Abadi 在2019年发布的一篇博客中提到,以往学界普遍认为可串行化是数据库隔离级别的黄金标准,但经过研究,他发现实际上严格可串行化才是黄金标准。即在该理论中,可串行化仍存在一定的问题,只有严格可串行化才能做到没有问题。

file

在过去,为什么可串行化不存在问题?原因有两方面:

一是对集中式数据库而言,可串行化其实就是严格可串行化,两者之间并没有区别。 二是对于分布数据库而言,如果数据库里有唯一的事务调度器或协调器,这两者之间也可等价。

file

当来到去中心化的分布式数据库时代,我们希望分布式数据库产品可在全球部署。全球部署意味着范围更大,如果仍然依赖集中式调度,性能和可扩展性都无法满足应用的需求,因此需要在系统当中安排多个事务协调者进行协调。

file

回顾发展历程,20年前的数据库的标注配置为业务系统+主库+备库。业务系统访问主库,主库通过同步协议使数据在主库和备库之间保持一致性。在这一阶段,集中式的IBM小型机、Oracle数据库、EMC存储(IOE)在处理小规模的数据场景时较为合适。但这种架构模式的问题在于,当数据量比较大或者业务场景比较密集时,集中式主库就会成为整个系统的负担。

file

到了第二阶段,典型的做法是分库分表,将业务按照主库进行拆分,因为业务系统建立在主库之上,因此实现了业务的隔离,TDSQL的早期版本也采用了这种做法。这种做法的前提假设是数据/业务能够很好地进行切分,从而解决前一阶段业务不可扩展的问题。但当业务系统进行跨库访问时,就会带来新的问题。

file

为了解决上述问题,我们来到了第三阶段,即去中心化的分布式数据库阶段。在该阶段,数据库中设置了更多的事务调度器,由调度器来对每个节点数据上的子事务进行事务提交,每个事务调度器都可以独立地去处理事务。但这也会产生新的问题,即不同协调者之间如何协调。

file

问题与挑战

我们以下图中的例子来说明分布式数据库中不同协调者之间如何协调的问题。假设有一个家庭账户,丈夫和妻子共用,都可以进行读和写。丈夫在 ATM机上存了 100 块,存完后通知妻子,但妻子有可能看不到丈夫存的这笔钱。因为这是一个多协调器的架构,设备1交由协调者1来进行协调,妻子发起的这个事务可能由另外一个协调者去发起,这就会出现协调者之间AMG时钟不统一的问题。

file

该事务发起的时间虽然在 2:01 PM后,但因为协调的时间偏慢,所以此时1:59 PM的这个时钟去读 2:01 PM的时间戳提交的这个数据,就会出现读不到的情况。

file

形象地说,即有两个协调器,其中一个协调器执行了事务 T0 、T1,T1 事务已经提交成功。这时协调者 2 发起了事务T2,当T2 查询余额时,我们发现时钟比 T1 提交的时钟来得小,所以读不到T1。但实际上,是先执行 T0 再执行 T2 再执行T1,属于可串行化。但这又会跟前述提到的执行相违背,因为既然T1已经提交, T2理应可以读到,但结果没有读到。因此Daniel J. Abadi 的可串行化存在一定的问题,读不到最新数据。

file

这个问题的本质是保序,而严格可串化的本质是线性一致性加上可串行化。从事务角度来看,根据线性一致性要求,如果T0事务已经结束,T1才开始,则T1要读到T0的写;同理,T1已经完成了T2才开始,T2要读到T1的写。虽然这里的 T0、T2、T1 是可串行化,但违背线性一致性的要求,只有T0→ T1→ T2时才是正确的,这就是保序。

因此,这里的实时序就是T0 结束后开始T1事务,T0 排在T1的前面;T0 完成后T2才开始,T0 排在T2的前面;T1结束后T2才开始,T1排在T2的前面。因此核心理念就是保序,即在原来可串行化全序的基础上,对可串行化的序做约束,这个约束是线性一致性所造成的。

file

严格串行化虽然能保证数据的准确性,但也带来了较多的问题。以Google Spanner为例,Google Spanner支持严格可串行化,但是严格可串行化要求有一个原子钟,或者有一个中心授时器(本质上是因为协调器和协调器之间缺少一个协调),因而导致性能较低,难以被广泛应用于实际业务场景中。

file

多级可串行化建模

基于上述情况,我们希望可以找到一个中间环节,在一致性上比可串行化级别高、比严格串行化级别低;在性能上接近可串行化、优于严格可串行化。针对这个需求,我们提出了多级可串行化建模,本质是在可串行化的基础上加了序。

线性一致性是并发系统中一致性最强的,比它弱一点的有顺序一致性、因果一致性、写读一致性、最终一致性等。我们尝试将可串行化与它们进行结合,最终发现只有可串行化和线性一致性以及可串行化和顺序一致性可以实现结合。因为可串行化要求全序,但因果一致性不要求全序,因此无法结合。

file

我们的做法是将可串行化+线性一致性,从而得到严格可串行化;可串行化+顺序一致性,从而得到顺序可串行化。所以我们提出了严格可串行化、顺序可串行化、可串行化这三个隔离级别。

file

多级可串行化实现的核心理念就是保序。我们定义了五个序:

  • 实时序,即原来的线性一致性要求。
  • 程序序,比如代码中的session order,session 连接后,事务之间就变成了T0,T0 提交后才能提交T1,这就是程序序。

file

  • 写读序,即如果T2读取了T1的写,T1必定排在T2 之前。
  • 因果序,指写读序和程序序之间形成的闭包。
  • 写合法,假设有一个x数据项,T1写了数据项x1,T3 写了数据项x2,但如果T2 读了一个x ,就必须要求T2 要紧跟T1,因为它不能紧跟在T3 后;如果它排在T3 后,则它读的应该是 x2 ,因此这时T1和T3形成了一个序,要求T2要排在T3 前。

file

有了序后,我们重新定义了事务的可串行化理论,即可串行化等于写读序的传递闭包+写合法;可串行化+顺序一致性,即写读序+程序序的传递闭包,再加写合法;严格可串行化就是写读序+实时序的传递闭包,加写合法。因此可以理解为所有的一致性模型就是保序。

file

该理论成果已经应用于腾讯分布式数据库TDSQL产品当中,使得TDSQL成为全球范围内首个能够具备严格可串行化、顺序可串行化、可串行化三大隔离级别的国产分布式数据库,还可针对不同应用场景要求,极大地平衡性能与一致性要求,满足金融及各类企业场景的分布式事务处理需求。

并发控制算法

并发控制算法-双向动态时间戳调整的实现如下图所示。图中有两个协调者P1和P2,协调者P1有两个事务T1和T3,协调者P2有T2 和T4 。我们先定义顺序,T1和T3之间有一个session order或program order,T2和T4也存在一个program order,我们将它preserve 出来。

file

其中还存在写读序,像T1和T4之间,T1写了x1,T4读了x1,此时就存在一个写读序,所以要把T1和T4的order preserve出来。同时还存在写合法,因为T3 读了y 数据项,然后 T2 写了y数据项, 但是基于可串行化理论,R3读取的是y0,没有读取到y2,如果读到y2,这时T3就必须排在T2后。因为此时读不到y2 ,要排在T2前面,因此T3和 T2之间存在写合法。在整个执行过程中,我们要保证必须存在保序。

主要思想是每次事务提交时,都需要判断能否违背事务的先后顺序。比如T1开始提交,因为T1只包含自身,我们将它放到队列中时不需要回滚。T2 提交时,T2和T1之间没有序,但T1和T3之间以及T2和T3之间都分别存在一个序,因为此时存在y数据项,所以只有T1、T3、T2 这样的序才能保证可串行化,否则T必须进行回滚。

file

最后为保证协调器间能进行协调,我们还需要引入混合逻辑时钟,来保证因果序。

file

实验评价

我们以下图中的实验为例,来说明可串行化、严格可串行化和顺序可串行化之间的关系。如果在局域网情况下,在正确性方面,严格可串行化跟可串行化性能基本一致。但在广域网情况下,严格可串行化、顺序可串行化和可串行化之间的性能差异较大,所以导致在广域网上很难实现严格可串行化。

file

如图所示,BDTA算法比现有的算法如MAT、SUNDIAL等快了将近 1.8 倍,主要原因是BDTA中保序,但如果用前面的方法实现并发控制,就会造成大量事务的回滚。

file

总结与讨论

本文提出了提出了面向分布式数据库的多级可串行化模型,将并发系统中的一致性要求结合到可串行化中,实现了多级可串行化原型系统,保证了去中心化的事务处理机制,并设计了双向动态时间戳调整算法(BDTA),可以在统一系统架构下支持多个可串行化级别。

该技术已应用于腾讯云数据库TDSQL中,确保TDSQL无任何数据异常,且具备高性能的可扩展性,解决了分布式数据库在金融级场景应用的最核心技术挑战,使得国产分布式数据库实现在金融核心系统场景的可用。基于此,TDSQL是当前国内唯一进入国有大型银行核心系统正式投产的国产分布式数据库。

本文由博客一文多发平台 OpenWrite 发布!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/9939.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言之详解内存操作函数

个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C/C】 目录前言memcpy模拟实现memmove模拟实现memcmpmemset前言 memcpy叫做内存拷贝,memmove叫做内存移动,memc…

【数据结构】模拟实现双向链表

你必须非常努力,才能显得毫不费劲 目录 1.模拟实现双向链表 1.1 DLinkedList的内部类 1.2 DLinkedList的成员属性 1.3 DLinkedList的成员方法 1.3.1 在链表开头插入一个新结点 1.3.2 在链表结尾插入一个新的结点 1.3.3 计算结点个数 1.3.4 在链表任意位置…

4.构造器,this,修饰符详解

构造器: 构造器也叫构造方法,无返回值。非构造方法必须要有返回类型 主要作用:完成对象的初始化,创造对象时,自动调用构造器初始化对象 即使没有显示地使用static关键字,构造器实际上也是静态方法 JAVA…

HTML---基础入门知识详解

1:标签的概念 在别人写的网页中我们会看到许多文字,图片排版整齐,让人看的赏心悦目,这就是用到了标签,或者说标签就是帮我们实现某种作用的工具,比如制作段落,换行,导入图片&#x…

Android App 导出APK安装包以及制作App图标讲解及实战(图文解释 简单易懂)

操作有问题请点赞关注收藏后评论区留言~~~ 一、导出APK安装包 之前在运行App的时候,都是先由数据线连接手机和电脑,再通过Android Studio的Run菜单把App安装到手机上,这种方式只能在自己手机上调试应用,如果想在别人手机上安装应…

Python画爱心——谁能拒绝用代码敲出会跳动的爱心呢~

还不快把这份浪漫拿走!!节日就快到来了,给Ta一个惊喜吧~ 今天给大家分享一个浪漫小技巧,利用Python中的 HTML 制作一个立体会动的心动小爱心 成千上百个爱心汇成一个大爱心,从里到外形成一个立体状,给人视…

FITC标记SPG,FITC-SPG,荧光素标记链球菌G蛋白

产品名称:FITC标记SPG,荧光素标记链球菌G蛋白 英文名称:FITC-SPG 纯度:98% 规格:1mg 5mg 10mg 产地:西安 说明:提供使用说明,核磁图谱,包装,价格&#xff0…

ipv6地址概述——带你了解ipv6与ipv4的不同

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.ipv4与ipv6 1.ipv4与ipv6概述 在开始Pv6的学习以前&#xf…

Tomcat的安装与Maven依赖Servlet的使用

Tomcat的安装与Maven依赖Servlet的使用🍎一.Tomcat应用🍒1.1什么是Tomcat🍒1.2Tomcat下载安装🍒1.3 IDEA插件Smart Tomcat🍎二.Maven依赖Servlet应用🍒2.1什么是Servlet🍒2.2创建Servlet简单实现…

《Java》图书管理系统

这是一个对于Java中知识点的类,抽象类,封装,继承,多态,接口等进行的一个简单的代码练习,对于实际的图书管理系统还需要一点的优化 目录 前言 效果展示 功能模块 书架 定义书的类 创建书架 用户 User用…

黑马点评--优惠卷秒杀

黑马点评–优惠卷秒杀 全局ID生成器: 是一种在分布式系统下用来生成全局唯一ID的工具,一般要满足下列特性: 为了增加ID的安全性,我们可以不直接使用Redis自增的数值,而是拼接一些其它信息: Redis自增ID策…

CentOS7安装MySQL8

文章目录一 前言二、Centos 7 安装 mysql8 步骤:1.下载MySQL官方的 Yum Repository2.安装方法一: 用wget 下载后安装方法二:下载 RMP 软件包将该软件包上传到 Linux 服务器,并安装。3.Navicate 远程连接配置一 前言 最近在自己的…

Python 入门基础

第一个Python程序之打印 Hello World! print("Hello World!")字符串定义的三种方式,type 用了检测数据类型 # 单引号定义法,使用单引号进行包围 name 测试 print(type(name)) # 双引号定义法 name "测试" print(type(name)) # 三…

vue3+ts组件练习(defineExpose defineEmits defineProps)

学习关键语句: vue3ts 组件写法 写在前面 进化到 vue3 ts 的时代,vue的不少语法发生了改变,尤其是选项式 API 变为了组合式 API 和 typescript 的使用使得从 vue2 过来的人需要尽快熟悉新的写法,毕竟大差不差嘛 文章最后有本文…

图像分割 - 阈值处理 - 全局阈值处理

目录 1. 介绍 2. 代码实现 3. 代码讲解 1. 介绍 当目标和背景像素的灰度分布非常不同的时候,可以对整个图像使用全局阈值 在大多数的应用中,图像之间通常存在足够的变化,全局阈值是一种合适的办法。所以,需要一种对图像做阈值…

生存分析的图你也要拼接 图形拼接r 不同的图形组合在一起

生存分析的图你也要拼接吗 因为都是ggplot体系的图表,很容易拼接,但是里面的生存分析是一个麻烦事情。因为它本身主要是survminer包出图,而这个survminer包出图并不是很稳定,但是学员自己解决了这个问题。 可以先用survminer包的arrange_ggsurvplots函数对多个生存分析图表…

CUDA By Example(五)——常量内存与事件

本章将介绍如何使用GPU上特殊的内存区域来加速应用程序的执行,以及如何通过事件来测量CUDA应用程序的性能。通过这些测量方法,你可以定量的分析对应用程序的某个修改是否会带来性能提升 文章目录常量内存光纤跟踪简介在GPU上实现光线跟踪通过常量内存来实…

[附源码]java毕业设计家庭医生系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Java代码审计——WebGoat XML外部实体注入(XXE)

目录 前言: 0x01 Let’s try 0x02 代码分析 2.1 安全的代码 0x03 Modern REST framework 3.1 解题: 3.2 改为xml格式: 3.3 源码分析: 3.4 参考解决方案 0x04 Blind XXE assignment 0x05XXE DOS attack 参考文章: 前言…

“百花齐放、百家争鸣”,数据可视化呈现我国科学文化的发展

公共财政对文化建设的支持日益加强,公共文化设施不断完善,覆盖城乡的公共文化服务网络初步建立,公共文化服务理念逐步深化,公共文化服务能力和均等化水平逐渐提高;文化产业投资向发展水平较低的中西部地区倾斜&#xf…