之前我们学习了RocksDB,但这还只是一个最基础的存储引擎。如果想把它在生产环境中用起来,还需要解决很多问题:

  • 如何从单机扩展到分布式?
  • 如何实现事务,并对事务进行并发控制?
  • 用户接口能不能高级一点?不要只有get/set?

这次我们就来解决这三个问题。

如何从单机扩展到分布式

分布式的一大意义就是把单机放不下的数据分散到多个节点上。我们不妨按照key将不同范围的key分成多个region:比如[a-c]是region1,[d-f]是region2。然后用这种方法存储:

这样实现了一个基本的load balancing。一个Region里所有的数据分散存储在多个replica上,每个实例只会存一部分的region。当然分布式之后我们是要支持节点的动态增减的,具体细节暂时忽略

分布式之后还有一个重要的问题就是如何保证多个节点的一致性。还记得paxos嘛?就用它了!当然用Raft也可

如何实现事务,并对事务进行并发控制?

事务是数据库系统中一个很重要的概念。比如我们的数据库要拿给银行去用,然后银行要把账户A的100块钱转给账户B,就需要执行如下操作:

if (A.balance>=){
A.balance-=;
B.balance+=;
return(DB_OK);
}
else{
return(DB_ERROR);
}

当然在数据库系统中事务是用SQL实现的。

在事务的执行过程中,整段事务需要保证要么全都不执行,要么全都执行完,不允许出现执行到一半退出了的情况(即应该是个原子操作)。除此之外,像这样的约束条件还有很多,整理起来就是事务的ACID特性

为了保证事务的执行能满足ACID特性,我们可以把事务的执行抽象成两种操作:commit(执行完整个事务)和rollback(比如事务跑到一半数据库崩溃了,重启后就要撤销之前执行到一半的工作,恢复到事务没执行的状态)。commit的实现很显然,直接执行就完事了......而为了实现rollback可以给数据库加上日志恢复技术,这样就可以恢复到过去的时间点了。

MVCC

如果事务是串行执行的,那么到这里差不多就可以了。但假设我们的数据库要拿去进行双十一秒杀,就需要支持多个事务的并发运行,这时候就需要进行并发控制。在数据库课本上我们学习过一些简单的并发控制模型和实现方法(如基本的加锁解锁、2pc)。但我们知道,一次事务执行时被加锁的资源越多,整个db的并行度就越低。简单的方法就没法保证用户能流畅的秒杀了......那么如何使得并行度尽可能高呢?MYSQL中使用了MVCC模型,这里我们也比葫芦画瓢用一下。

并发控制的作用就是防止出现并发一致性问题。还记得5105课上学过在Client-centric consistency models中,多个client对同一资源进行读写的几个模型吗(Monotonic-Read、Monotonic-write、Read your write、Write follow reads)?在5105课上我们学习了为了保证最终一致性,这些操作应该怎么执行、怎么加锁。这个思路放到数据库的并发控制中同样适用。

MVCC是一种多版本并发控制机制。MVCC可以在大多数情况下代替行级锁,降低系统开销。
MVCC的本质就是copy on write,能够做到写不阻塞读MVCC能够做到写读不冲突,读读不冲突,读写也不冲突,唯一冲突的就是写和写,这样系统并发读就可以非常高。MVCC 提供了时点(point in time)一致性视图。MVCC 并发控制下的读事务一般使用时间戳或者事务 ID去标记当前读的数据库的状态(版本),读取这个版本的数据。读、写事务相互隔离,不需要加锁。读写并存的时候,写操作会根据目前数据库的状态,创建一个新版本,并发的读则依旧访问旧版本的数据。一句话讲,MVCC就是用同一份数据临时保留多版本的方式 ,实现并发控制。MYSQL的并发控制就是用MVCC实现的。

那么怎么把MVCC用到我们的kv数据库中呢?我们可以给key-value键值对也加上timestamp。然后在运行的过程中,遵照以下规则:

  • All modifies are adding a new version.
  • The same row(就是同一个key-value键值对) may have multiple versions.
  • Old versions dropped by GC.

在分布式并发事务的具体实现中,会用到一个Percolator Transaction Model。它是来自Google的一篇paper。Percolator的设计是为了解决2pc在分布式环境中的一些问题,相当于是2pc的增强版。用于在保证分布式一致性的基础上保证事务执行的ACID特性。

Percolator:分布式并发事务的实现

rocksdb提供了Column Families (CF)特性,可以用来实现上面的Percolator事务模型。CF是对数据库做的一个logical partition,可以类比关系数据库中的视图,但比视图支持更多的高级功能:

  • Atomic writes across Column Families are supported. This means you can atomically execute Write({cf1, key1, value1}, {cf2, key2, value2}).
  • Consistent view of the database across Column Families.
  • Ability to configure different Column Families independently.
  • On-the-fly adding new Column Families and dropping them. Both operations are reasonably fast.

为了实现Percolator事务模型,比如我们可以设置如下三个CF:

  • DefaultCF:存储数据
  • WriteCF:存储已提交的事务commit时的timestamp
  • LockCF:存储正在执行,还未提交的事务产生的锁

比如一开始我们有一个用来存储账户存款的key-value数据库,我们可以这样给它扩展成三个CF:

Percolator的核心就是2pc的改进版。通过利用client作为协调者,解决了协调者挂了对整体服务能力的影响,而在事务相关信息的一致性和持久性上充分利用了BigTable的简单事务支持以及GFS的多副本可靠性能力,另外Percolator在数据模型上是mvcc。

比如我们要执行一个事务,把Bob的7块钱转给Joe。使用Percolator执行事务的过程如下:

1111111

使用Percolator模型实现MVCC


Ref:

MVCC

https://blog.csdn.net/zzti_erlie/article/details/81094178

https://blog.csdn.net/whoamiyang/article/details/51901888

分布式事务

https://www.cnblogs.com/FengGeBlog/p/10278368.html

https://blog.csdn.net/maxlovezyy/article/details/88572692

https://blog.csdn.net/u013045749/article/details/50855823

https://xiking.win/2018/06/22/percolator-paper/

https://github.com/pingcap/blog/blob/master/2016-11-17-mvcc-in-tikv.md

http://int64.me/2017/MVCC%20In%20TiKV.html

https://andremouche.github.io/tidb/transaction_in_tidb.html

https://dzone.com/articles/how-to-do-performance-tuning-on-tidb-a-distributed

MVCC/分布式事务简介的更多相关文章

  1. JPA和分布式事务简介

    1. Transaction 分两种,Local Transaction 和 Global Transaction. 涉及到一个Connection的Commit,称为Local Transactio ...

  2. 分布式事务(一)两阶段提交及JTA

    原创文章,同步发自作者个人博客 http://www.jasongj.com/big_data/two_phase_commit/ 分布式事务 分布式事务简介 分布式事务是指会涉及到操作多个数据库(或 ...

  3. 消息服务框架(MSF)应用实例之分布式事务三阶段提交协议的实现

    一,分布式事务简介 在当前互联网,大数据和人工智能的热潮中,传统企业也受到这一潮流的冲击,纷纷响应国家“互联网+”的战略号召,企业开始将越来越多的应用从公司内网迁移到云端和移动端,或者将之前孤立的IT ...

  4. 即时消息服务框架(iMSF)应用实例之分布式事务三阶段提交协议的实现

    一,分布式事务简介 在当前互联网,大数据和人工智能的热潮中,传统企业也受到这一潮流的冲击,纷纷响应国家“互联网+”的战略号召,企业开始将越来越多的应用从公司内网迁移到云端和移动端,或者将之前孤立的IT ...

  5. MVCC&PURGE&分布式事务

    Ⅰ.MVCC介绍 consistent non-locking read,通过行多版本控制的方式读取当前执行时间点的记录 默认情况下innodb select没有任何锁,读到的记录在更新就通过undo ...

  6. 巨杉数据库SequoiaDB】巨杉Tech | SequoiaDB 分布式事务实现原理简介

    1 分布式事务背景 随着分布式数据库技术的发展越来越成熟,业内对于分布式数据库的要求也由曾经只用满足解决海量数据的存储和读取这类边缘业务向核心交易业务转变.分布式数据库如果要满足核心账务类交易需求,则 ...

  7. 微服务开发的最大痛点-分布式事务SEATA入门简介

    前言 在微服务开发中,存在诸多的开发痛点,例如分布式事务.全链路跟踪.限流降级和服务平滑上下线等.而在这其中,分布式事务是最让开发者头痛的.那分布式事务是什么呢? 分布式事务就是指事务的参与者.支持事 ...

  8. lms框架分布式事务使用简介

    lms框架的分布式事务解决方案采用的TCC事务模型.在开发过程中参考和借鉴了hmily.使用AOP的编程思想,在rpc通信过程中通过拦截器的方式对全局事务或是分支事务进行管理和协调. 本文通过lms. ...

  9. 分布式事务(七)之Seata简介

    在前面的文章中,我们介绍了分布式事务的概念以及一些解决方案.fenSeata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata将为用户提供了AT.TCC.SAGA和 ...

随机推荐

  1. 【方法】原生js实现方法ajax封装

    /* 参数说明* type[String] 请求方式('POST'或'GET') 默认设置'GET'方式* dataType[String] 获取到的后台数据格式 默认'JSON'格式* async[ ...

  2. Sparrow 开发板化身电脑音量调节器

    前言 原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正. 之前的新浪不能用啦,这次部分图片用的sm.ms的图床,加载慢,请耐心,准备换图床. 1.开箱简介 来填坑了!这次是 Sparrow ...

  3. 【canvas学习笔记五】使用图片

    在canvas里画图有两个步骤: 获得图片源. drawImage()画图. 图片源 canvas支持以下几种图片资源: HTMLImageElement 可以使用Image()方法构造的图片,也可以 ...

  4. 【Python】学习笔记十四:循环进阶

    range() 在Python中,for循环后的in跟随一个序列的话,循环每次使用的序列元素,而不是序列的下标. 我们继续开发range的功能,以实现下标对循环的控制: s = 'abcdefghj' ...

  5. Java字符串的不可变性

    声明一个字符串引用变量: String  s = "abcd"; s是一个引用变量,指向 堆内存中的字符串常量 "abcd" 再声明一个字符串引用变量: Str ...

  6. 【机器学习速成宝典】模型篇03逻辑斯谛回归【Logistic回归】(Python版)

    目录 一元线性回归.多元线性回归.Logistic回归.广义线性回归.非线性回归的关系 什么是极大似然估计 逻辑斯谛回归(Logistic回归) 多类分类Logistic回归 Python代码(skl ...

  7. Electron-Vue工程初始化,以及需要掌握的相关知识

    1.安装nodejs 下载地址:http://nodejs.cn/ 需要重启系统 2.安装electron npm install electron -g 3.安装vue npm install vu ...

  8. matlab常见使用

    可以新建一个.m文件,将代码放入其中 1.求平均 A=[ 1 2; 3 4; ] a=mean(A,1) %按列平均 b=mean(A,2) %按行平均 c=mean(A(:)) %全部平均 2.清屏 ...

  9. JavaScript中this的一些坑

    我们经常在回调函数里面会遇到一些坑: var obj = { name: 'qiutc', foo: function() { console.log(this); }, foo2: function ...

  10. 应用安全 - 工具 - 浏览器 - IE浏览器 - 漏洞汇总

    CVE-2014-6332 Date 2014.11 CVE-2016-0189 | MS16-051 Date 2016年初 CVE-2018-8174