这次,听人大教授讲讲分布式数据库的多级一致性|TDSQL 关键技术突破
近年来,凭借高可扩展、高可用等技术特性,分布式数据库正在成为金融行业数字化转型的重要支撑。分布式数据库如何在不同的金融级应用场景下,在确保数据一致性的前提下,同时保障系统的高性能和高可扩展性,是分布式数据库的一个核心技术挑战。
针对以上分布式一致性的困境,中国人民大学-腾讯协同创新实验室研究提出“多级一致性”的事务处理理念。该技术包含严格可串行化、顺序可串行化、可串行化三大隔离级别,可针对不同应用场景要求,极大地平衡性能与一致性要求,满足金融及各类企业场景的分布式事务处理需求。该项技术已应用于腾讯分布式数据库TDSQL产品中,确保TDSQL按需提供数据一致性,并确保数据无异常。TDSQL是当前国内率先进入国有大型银行核心系统正式投产的国产分布式数据库,该项技术是其中的关键支撑。
这次,中国人民大学教授、博士生导师卢卫老师为大家全面解锁分布式数据库的多级一致性及构建技术!
背景
从本质上看,数据库是长期存储在计算机内、有组织的、可共享的数据集合。当多个用户并发操作数据库时,事务调度的可串行化是并发控制的正确性理论。但该观点在当前却受到了挑战。Daniel J. Abadi 在2019年发布的一篇博客中提到,以往学界普遍认为可串行化是数据库隔离级别的黄金标准,但经过研究,他发现实际上严格可串行化才是黄金标准。即在该理论中,可串行化仍存在一定的问题,只有严格可串行化才能做到没有问题。
在过去,为什么可串行化不存在问题?原因有两方面:
一是对集中式数据库而言,可串行化其实就是严格可串行化,两者之间并没有区别。
二是对于分布数据库而言,如果数据库里有唯一的事务调度器或协调器,这两者之间也可等价。
当来到去中心化的分布式数据库时代,我们希望分布式数据库产品可在全球部署。全球部署意味着范围更大,如果仍然依赖集中式调度,性能和可扩展性都无法满足应用的需求,因此需要在系统当中安排多个事务协调者进行协调。
回顾发展历程,20年前的数据库的标注配置为业务系统+主库+备库。业务系统访问主库,主库通过同步协议使数据在主库和备库之间保持一致性。在这一阶段,集中式的IBM小型机、Oracle数据库、EMC存储(IOE)在处理小规模的数据场景时较为合适。但这种架构模式的问题在于,当数据量比较大或者业务场景比较密集时,集中式主库就会成为整个系统的负担。
到了第二阶段,典型的做法是分库分表,将业务按照主库进行拆分,因为业务系统建立在主库之上,因此实现了业务的隔离,TDSQL的早期版本也采用了这种做法。这种做法的前提假设是数据/业务能够很好地进行切分,从而解决前一阶段业务不可扩展的问题。但当业务系统进行跨库访问时,就会带来新的问题。
为了解决上述问题,我们来到了第三阶段,即去中心化的分布式数据库阶段。在该阶段,数据库中设置了更多的事务调度器,由调度器来对每个节点数据上的子事务进行事务提交,每个事务调度器都可以独立地去处理事务。但这也会产生新的问题,即不同协调者之间如何协调。
问题与挑战
我们以下图中的例子来说明分布式数据库中不同协调者之间如何协调的问题。假设有一个家庭账户,丈夫和妻子共用,都可以进行读和写。丈夫在 ATM机上存了 100 块,存完后通知妻子,但妻子有可能看不到丈夫存的这笔钱。因为这是一个多协调器的架构,设备1交由协调者1来进行协调,妻子发起的这个事务可能由另外一个协调者去发起,这就会出现协调者之间AMG时钟不统一的问题。
该事务发起的时间虽然在 2:01 PM后,但因为协调的时间偏慢,所以此时1:59 PM的这个时钟去读 2:01 PM的时间戳提交的这个数据,就会出现读不到的情况。
形象地说,即有两个协调器,其中一个协调器执行了事务 T0 、T1,T1 事务已经提交成功。这时协调者 2 发起了事务T2,当T2 查询余额时,我们发现时钟比 T1 提交的时钟来得小,所以读不到T1。但实际上,是先执行 T0 再执行 T2 再执行T1,属于可串行化。但这又会跟前述提到的执行相违背,因为既然T1已经提交, T2理应可以读到,但结果没有读到。因此Daniel J. Abadi 的可串行化存在一定的问题,读不到最新数据。
这个问题的本质是保序,而严格可串化的本质是线性一致性加上可串行化。从事务角度来看,根据线性一致性要求,如果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的前面。因此核心理念就是保序,即在原来可串行化全序的基础上,对可串行化的序做约束,这个约束是线性一致性所造成的。
严格串行化虽然能保证数据的准确性,但也带来了较多的问题。以Google Spanner为例,Google Spanner支持严格可串行化,但是严格可串行化要求有一个原子钟,或者有一个中心授时器(本质上是因为协调器和协调器之间缺少一个协调),因而导致性能较低,难以被广泛应用于实际业务场景中。
多级可串行化建模
基于上述情况,我们希望可以找到一个中间环节,在一致性上比可串行化级别高、比严格串行化级别低;在性能上接近可串行化、优于严格可串行化。针对这个需求,我们提出了多级可串行化建模,本质是在可串行化的基础上加了序。
线性一致性是并发系统中一致性最强的,比它弱一点的有顺序一致性、因果一致性、写读一致性、最终一致性等。我们尝试将可串行化与它们进行结合,最终发现只有可串行化和线性一致性以及可串行化和顺序一致性可以实现结合。因为可串行化要求全序,但因果一致性不要求全序,因此无法结合。
我们的做法是将可串行化+线性一致性,从而得到严格可串行化;可串行化+顺序一致性,从而得到顺序可串行化。所以我们提出了严格可串行化、顺序可串行化、可串行化这三个隔离级别。
多级可串行化实现的核心理念就是保序。我们定义了五个序:
- 实时序,即原来的线性一致性要求。
- 程序序,比如代码中的session order,session 连接后,事务之间就变成了T0,T0 提交后才能提交T1,这就是程序序。
- 写读序,即如果T2读取了T1的写,T1必定排在T2 之前。
- 因果序,指写读序和程序序之间形成的闭包。
- 写合法,假设有一个x数据项,T1写了数据项x1,T3 写了数据项x2,但如果T2 读了一个x ,就必须要求T2 要紧跟T1,因为它不能紧跟在T3 后;如果它排在T3 后,则它读的应该是 x2 ,因此这时T1和T3形成了一个序,要求T2要排在T3 前。
有了序后,我们重新定义了事务的可串行化理论,即可串行化等于写读序的传递闭包+写合法;可串行化+顺序一致性,即写读序+程序序的传递闭包,再加写合法;严格可串行化就是写读序+实时序的传递闭包,加写合法。因此可以理解为所有的一致性模型就是保序。
该理论成果已经应用于腾讯分布式数据库TDSQL产品当中,使得TDSQL成为全球范围内首个能够具备严格可串行化、顺序可串行化、可串行化三大隔离级别的国产分布式数据库,还可针对不同应用场景要求,极大地平衡性能与一致性要求,满足金融及各类企业场景的分布式事务处理需求。
并发控制算法
并发控制算法-双向动态时间戳调整的实现如下图所示。图中有两个协调者P1和P2,协调者P1有两个事务T1和T3,协调者P2有T2 和T4 。我们先定义顺序,T1和T3之间有一个session order或program order,T2和T4也存在一个program order,我们将它preserve 出来。
其中还存在写读序,像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必须进行回滚。
最后为保证协调器间能进行协调,我们还需要引入混合逻辑时钟,来保证因果序。
实验评价
我们以下图中的实验为例,来说明可串行化、严格可串行化和顺序可串行化之间的关系。如果在局域网情况下,在正确性方面,严格可串行化跟可串行化性能基本一致。但在广域网情况下,严格可串行化、顺序可串行化和可串行化之间的性能差异较大,所以导致在广域网上很难实现严格可串行化。
如图所示,BDTA算法比现有的算法如MAT、SUNDIAL等快了将近 1.8 倍,主要原因是BDTA中保序,但如果用前面的方法实现并发控制,就会造成大量事务的回滚。
总结与讨论
本文提出了提出了面向分布式数据库的多级可串行化模型,将并发系统中的一致性要求结合到可串行化中,实现了多级可串行化原型系统,保证了去中心化的事务处理机制,并设计了双向动态时间戳调整算法(BDTA),可以在统一系统架构下支持多个可串行化级别。
该技术已应用于腾讯云数据库TDSQL中,确保TDSQL无任何数据异常,且具备高性能的可扩展性,解决了分布式数据库在金融级场景应用的最核心技术挑战,使得国产分布式数据库实现在金融核心系统场景的可用。基于此,TDSQL是当前国内唯一进入国有大型银行核心系统正式投产的国产分布式数据库。
这次,听人大教授讲讲分布式数据库的多级一致性|TDSQL 关键技术突破的更多相关文章
- 腾讯云分布式数据库TDSQL在银行传统核心系统中的应用实践
本文是腾讯云TDSQL首席架构师张文在腾讯云Techo开发者大会现场的演讲实录,演讲主题是<TDSQL在银行传统核心系统中的应用实践>. 我是TDSQL架构师张文,同时也是TDSQL的开发 ...
- 分布式数据库中的Paxos 算法
分布式数据库中的Paxos 算法 http://baike.baidu.com/link?url=ChmfvtXRZQl7X1VmRU6ypsmZ4b4MbQX1pelw_VenRLnFpq7rMvY ...
- 云时代的分布式数据库:阿里分布式数据库服务DRDS
发表于2015-07-15 21:47| 10943次阅读| 来源<程序员>杂志| 27 条评论| 作者王晶昱 <程序员>杂志数据库DRDS分布式沈询 摘要:伴随着系统性能.成 ...
- 分布式数据库中间件–(3) Cobar对简单select命令的处理过程
友情提示:非原文链接可能会影响您的阅读体验,欢迎查看原文.(http://blog.geekcome.com) 原文地址:http://blog.geekcome.com/archives/284 在 ...
- Amoeba是一个类似MySQL Proxy的分布式数据库中间代理层软件,是由陈思儒开发的一个开源的java项目
http://www.cnblogs.com/xiaocen/p/3736095.html amoeba实现mysql读写分离 application shang 2年前 (2013-03-28) ...
- 分布式数据库中间件–(2) Cobar与client握手身份验证
Cobar启动完毕,监听特定端口.整个认证的流程图: NIOAcceptor类继承自Thread类,该类的对象会以线程的方式执行,进行连接的监听. NIOAcceptor启动的初始化步骤例如以下: 1 ...
- 分布式数据库Google Spanner原理分析
Spanner 是Google的全球级的分布式数据库 (Globally-Distributed Database) .Spanner的扩展性达到了令人咋舌的全球级,可以扩展到数百万的机器,数已百计的 ...
- 一款低延迟的分布式数据库同步系统--databus
每次看到马路对面摩托罗拉的大牌子,都想起谷歌125亿美元收购摩托罗拉移动,后来又以29亿美元卖给联想的事情.谷歌所做的决策都比较考虑长远利益,在这串交易中,谷歌获得了摩托罗拉最有价值的几千项专利,稳健 ...
- 利用C#实现分布式数据库查询
随着传统的数据库.计算机网络和数字通信技术的飞速发展,以数据分布存储和分布处理为主要特征的分布式数据库系统的研究和开发越来越受到人们的关注.但由于其开发较为复杂,在一定程度上制约了它的发展.基于此,本 ...
- 跨时代的分布式数据库 – 阿里云DRDS详解(转)
原文章地址:https://www.csdn.net/article/a/2015-08-28/15827676 跨时代的分布式数据库 – 阿里云DRDS详解 发表于2015-08-28 18:39| ...
随机推荐
- iOS 组件化及二进制化的探索
组件化的优缺点 组件化的拆分 组件与组件之间如何进行通讯(路由) 从Cocopods拉取代码的过程 远程索引库里很多的.spec文件,该文件记录了很多内容,如用户名,框架名称,描述,框架的地址 Pod ...
- 记一次 .NET 某数控机床控制程序 卡死分析
一:背景 1. 讲故事 前段时间有位朋友微信上找到我,说它的程序出现了卡死,让我帮忙看下是怎么回事? 说来也奇怪,那段时间求助卡死类的dump特别多,被迫训练了一下对这类问题的洞察力 ,再次声明一下, ...
- CentOS7_SSH_安装总结
在使用ssh 连接自己的centos 虚拟机时,发现连接不上,于是有了这个安装过程 (以下是在root用户下执行的,没权限的话就sudo) 1.首先判断是否有这个服务 systemctl list-u ...
- Java 9.回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true :否则,返回 false .回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 例如,121 是回文,而 123 不是. ...
- Python图像处理丨带你认识图像量化处理及局部马赛克特效
摘要:本文主要讲述如何进行图像量化处理和采样处理及局部马赛克特效. 本文分享自华为云社区<[Python图像处理] 二十.图像量化处理和采样处理及局部马赛克特效>,作者: eastmoun ...
- C#/VB.NET 在Word文档中插入分页符
分页符是分页的一种符号,上一页结束以及下一页开始的位置.通查用于在指定位置强制分页.本文将分为两部分来介绍如何在Word文档中插入分页符.并附上C#/VB.NET以供参考,详情请阅读以下内容. 在特定 ...
- byte[]数组转换string类型
byte[] OutData = new byte[2048];//交易返回数据 string pBusiCardInfoStr = Encoding.Default.GetString(OutDat ...
- Python Web开发主流框架
Web 开发是Python 语言应用领域的重要部分,也是工作岗位最多的领域.如果你对基于Python的Web 开发有兴趣,正打算使用Python 做Web 开发,或者已经是一个Web 开发者有工作需要 ...
- Centos7搭建 KVM 环境
注意:使用KVM管理虚拟机分命令行和图形化界面两种方式,这里最后一步安装的工具是图形化管理工具 安装前准备 验证CPU是否支持KVM 如果结果中有vmx(Intel)或svm(AMD)字样,就说明CP ...
- 基于Alpine镜像定制自己的工具箱
Alpine介绍 Alpine 操作系统是一个面向安全的轻型 Linux 发行版.目前 Docker 官方已开始推荐使用 Alpine 替代之前的 Ubuntu 做为基础镜像环境.这样会带来多个好处. ...