UpdateServer(UPS) 是OceanBase的写入单点,一个集群中只有一台UPS服务器,所有的写都写入到这台机器。OceanBase采用基于静动态数据分离的机制,静态数据存储在静态数据服务器ChunkServer(CS)磁盘上,动态数据存储在UPS的内存中,导致一次读请求需要将静态和动态数据合并才能得到完整的数据,从而读也要访问UPS。OceanBase作为一个支持事务的分布式关系型数据库,UPS是实现事务的核心组件。单独看UPS,它是一个内存数据库,存储模型类似于LSM,写入操作写入内存,持久化通过写操作日志来保证,宕机后通过回放操作日志恢复数据,同时将对磁盘的随机写转换成顺序写。在事务的支持上,UPS实现Read Committed隔离级别。UPS在设计之初只考虑小事务,所以不需要传统关系型数据库中的UNDO,不支持像insert 1TB 这种大事务。操作日志中只有commit操作,没有rollback操作,所以操作日志更适合叫commitlog或者叫REDO LOG。实现上,读写互不影响,采用MVCC,写写冲突需要使用行锁。下面详述UPS的事务机制。

UPS的存储引擎使用的是一颗BTree,原理看 和 。这颗BTree是内存BTree,是一个聚簇索引,Key是表的主键,Value指向对这行的增量修改,如下图所示:

如图所示,对同一行的修改通过链表挂在BTree的Value上。对一行的每一次修改对应其中一个节点,TransID标识了提交这次修改的事务ID。当一个事务开启还没有提交时,事务的修改存在事务局部,事务提交的时候才会将事务的修改串到BTree的Value链表上。redo log buffer是一个内存block 的ring buffer,每个block 2MB。事务提交时,多个事务抢redo log buffer中的偏移和大小,抢在前的事务先提交,也就是说先串事务局部的修改链表到BTree的Value链表上。磁盘上,每个commitlog 64MB。

事务ID

和Oracle一样,事务ID是个时间戳。事务提交时抢到redo log buffer中的偏移时,事务ID根据当前时间和事务在redo log block的相对事务号来计算出事务ID,随后事务ID会被回填到事务局部链表中。

MVCC

由于OceanBase没有UNDO,MVCC相对来说实现比较简单。UPS全局维护一个publish_trans_id,表示最后一个成功提交的事务ID。每个事务开始时,获取publish_trans_id,相当于一个快照点,从而这个事务只能读取在这个事务之前开始的事务提交的修改,在这个事务开始之后开始的事务提交的修改时读不到的。读事务拿着事务开始时获取到的publish_trans_id,找到相应的行后,顺着链表读,只能读取TransID小于等于publish_trans_id的增量修改。每次刷redo log到磁盘后,会将这批redo log对应的最新的事务ID更新到publish_trans_id。写盘采用libaio+dio。由此看来,OceanBase的MVCC更像行级多版本。为了避免行链表过长,影响读的latency,在写的时候如果发现一行太长,会对链表进行合并。

写写冲突需要通过行锁来解决。采用两阶段锁,对需要修改的行加写锁,提交回滚的时候统一释放锁。

CheckPoint

由于OceanBase UPS实际上是一个内存数据库,存储模型类LSM,在内存不够时,会dump memtable到磁盘上形成SSTable,dump时会切换一个commitlog文件,这个commitlog的文件名就是OceanBase的checkpoint。在checkpoint上,传统关系型数据库比如MySQL在这点就比较好,以Innodb为例,checkpoint本质上是redo log的一个偏移量,由于它是个基于磁盘的存储引擎,数据是以Page进行组织的,只要Buffer Pool中的已经提交的事务修改的脏页刷新到磁盘了,那么相应的redo log就可以重用,checkpoint就可以向前推进。

UpdateServer事务实现机制的更多相关文章

  1. 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究 转载

    1.XA XA是由X/Open组织提出的分布式事务的规范.XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接 ...

  2. spring事务传播机制实例讲解

    http://kingj.iteye.com/blog/1680350   spring事务传播机制实例讲解 博客分类:   spring java历险     天温习spring的事务处理机制,总结 ...

  3. 《深入理解mybatis原理》 MyBatis事务管理机制

    MyBatis作为Java语言的数据库框架,对数据库的事务管理是其很重要的一个方面.本文将讲述MyBatis的事务管理的实现机制. 首先介绍MyBatis的事务Transaction的接口设计以及其不 ...

  4. Spring事务传播机制和数据库隔离级别

    Spring事务传播机制和数据库隔离级别 转载 2010年06月26日 10:52:00 标签: spring / 数据库 / exception / token / transactions / s ...

  5. spring 事务传播机制

    spring 事务 传播机制 描述的 事务方法直接相互调用,父子事物开启,挂起,回滚 等的处理方式. 绿色的 那几个 我认为比较重要. 1 , @Transactional(propagation=P ...

  6. mybatis事务管理机制详解

    1.mybatis事务的配置和使用 mybatis事务有两种使用方式: (a):使用JDBC的事务管理机制:即使用java.Sql.Connection对象完成对事务的提交,回滚和关闭操作. (b): ...

  7. 数据库事务的隔离以及spring的事务传播机制

    数据库的事务隔离: MySQL InnoDB事务的隔离级别有四级,默认是“可重复读”RR(REPEATABLE READ). oracle默认的是提交读.RC 未提交读(READ UNCOMMITTE ...

  8. Spring事务管理机制的实现原理-动态代理

    之前在做项目中遇到spring无法进行事务代理问题,最后发现是因为没有写接口,原因当时明白了,看到这篇文章写的清楚些,转过来 我们先来分析一下Spring事务管理机制的实现原理.由于Spring内置A ...

  9. Spring事务传播机制与隔离级别(转)

    Spring事务传播机制与隔离级别 博客分类: Spring   转自:http://blog.csdn.net/edward0830ly/article/details/7569954 (写的不错) ...

随机推荐

  1. phpredisadmin 莫名其妙错误,打开了无法显示任何数据

    一直用的好好的,某天突然只有页面基本框架,redis数据看不到了. 查日志嘛... PHP Fatal error:  Allowed memory size of 134217728 bytes e ...

  2. C/C++ -- Gui编程 -- Qt库的使用 -- 组件大杂烩

  3. OpenGL11-绘制汉字最高效方法(使用Freetype)(代码已更新)

    最新版本,之前的版本有些文件没有打包 视频教程请关注 http://edu.csdn.net/lecturer/lecturer_detail?lecturer_id=440 OpenGL本身并没有绘 ...

  4. centos6.5 + 7 静态ip配置

    2017/09/19日更, centos6.5 可用 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=static D ...

  5. Node.js之Express三

    端午节3天说没就没了,自己的脚伤都快一个月了还没好,原本想着去桂林或者厦门呢,可计划赶不上变化,看自己公司C#软件工程师的招聘条件有要求MongoDb,年前就打算自己学习下,买的这本书就叫Node.j ...

  6. 上传多张图片imgupload

    <tr> <td class="listtitle-up">尿素箱</td> <td> <div class="co ...

  7. ASP.NET 省市县三联动 (包含用户控件)

    将压缩文件下载解压后,将用户控件拖到解决方案里,直接可以拖到需要用到的页面里 使用: 数据库是最新的(父子级关系表结构----Region2016.sql) 右键记事本打开,放在sqlServerl里 ...

  8. HDFS要点剖析

    谈到大数据,不得不提的一个名词是"HDFS".它是一种分布式文件存储系统,其系统架构图如下图所示: 从图中可以了解到的几个关键概念 元数据(MetaData) 机架(Rock) 块 ...

  9. Spring Boot学习笔记(八)使用jar和war方式打包并在外部Tomcat中部署运行

    使用war包的方式发布到外部Tomcat中去 首先修改pom.xml中的配置,使打包方式设置为war包的形式 然后 maven update project 更新下项目 Application入口文件 ...

  10. 应用程序框架(一):DDD分层架构:领域实体(基础篇)

    一.什么是实体 由标识来区分的对象称为实体. 实体的定义隐藏了几个信息: 两个实体对象,只要它们的标识属性值相等,哪怕标识属性以外的所有属性值都不相等,这两个对象也认为是同一个实体,这意味着两个对象是 ...