UpdateServer事务实现机制
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事务实现机制的更多相关文章
- 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究 转载
1.XA XA是由X/Open组织提出的分布式事务的规范.XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接 ...
- spring事务传播机制实例讲解
http://kingj.iteye.com/blog/1680350 spring事务传播机制实例讲解 博客分类: spring java历险 天温习spring的事务处理机制,总结 ...
- 《深入理解mybatis原理》 MyBatis事务管理机制
MyBatis作为Java语言的数据库框架,对数据库的事务管理是其很重要的一个方面.本文将讲述MyBatis的事务管理的实现机制. 首先介绍MyBatis的事务Transaction的接口设计以及其不 ...
- Spring事务传播机制和数据库隔离级别
Spring事务传播机制和数据库隔离级别 转载 2010年06月26日 10:52:00 标签: spring / 数据库 / exception / token / transactions / s ...
- spring 事务传播机制
spring 事务 传播机制 描述的 事务方法直接相互调用,父子事物开启,挂起,回滚 等的处理方式. 绿色的 那几个 我认为比较重要. 1 , @Transactional(propagation=P ...
- mybatis事务管理机制详解
1.mybatis事务的配置和使用 mybatis事务有两种使用方式: (a):使用JDBC的事务管理机制:即使用java.Sql.Connection对象完成对事务的提交,回滚和关闭操作. (b): ...
- 数据库事务的隔离以及spring的事务传播机制
数据库的事务隔离: MySQL InnoDB事务的隔离级别有四级,默认是“可重复读”RR(REPEATABLE READ). oracle默认的是提交读.RC 未提交读(READ UNCOMMITTE ...
- Spring事务管理机制的实现原理-动态代理
之前在做项目中遇到spring无法进行事务代理问题,最后发现是因为没有写接口,原因当时明白了,看到这篇文章写的清楚些,转过来 我们先来分析一下Spring事务管理机制的实现原理.由于Spring内置A ...
- Spring事务传播机制与隔离级别(转)
Spring事务传播机制与隔离级别 博客分类: Spring 转自:http://blog.csdn.net/edward0830ly/article/details/7569954 (写的不错) ...
随机推荐
- Map map=new HashMap()
Map是接口,hashMap是Map的一种实现.接口不能被实例化.Map map=new HashMap(); 就是将map实例化成一个hashMap.这样做的好处是调用者不需要知道map具体的实现, ...
- Python -- 网络编程 -- Socket简单网络通信
Qt如果多线程的话,似乎会出BUG 1.服务端(server.py) import sys, socket, threading import binascii from PyQt4 import Q ...
- redis 安装 与错误解决办法
redis 安装与安装中遇到的错误 redis 安装 wget http://download.redis.io/releases/redis-4.0.11.tar.gz .tar.gz cd red ...
- elasticSearch6源码分析(1)启动过程
1.找到bin目录,下面有elasticSearch的sh文件,查看执行过程 exec \ "$JAVA" \ $ES_JAVA_OPTS \ -Des.path.home=&qu ...
- 如何在HTML 5中拖动光标图标?
window.app = { dragging: false, config: { canDrag: false, cursorOffsetX: null, cursorOffsetY: null } ...
- css3 transform(变形)笔记
Transform字面上就是变形,改变的意思.在CSS3中transform主要包括以下几种:旋转rotate.扭曲skew.缩放scale和移动translate以及矩阵变形matrix. 一.旋转 ...
- Android sdk manager 下载速度慢的问题
不多说了,直接附上方法: 首先打开Ecplise 中Android sdk manager,打开后, 在此窗口的上方打开偏好设置选项,然后在里面设置HTTP Proxy server和HTTP Pro ...
- 哈夫曼编码(Huffman coding)的那些事,(编码技术介绍和程序实现)
前言 哈夫曼编码(Huffman coding)是一种可变长的前缀码.哈夫曼编码使用的算法是David A. Huffman还是在MIT的学生时提出的,并且在1952年发表了名为<A Metho ...
- Code Signal_练习题_shapeArea
A 1-interesting polygon is just a square with a side of length 1. An n-interesting polygon is obtain ...
- android之在view中内嵌浏览器的方法
我要做的一个东西是在一个页面的中间嵌入浏览器,一开始不知道从哪里开始,因为以前用的都是Textveiw或者editVeiw之类的控件,而它们并不能用来显示网页的内容,怎么办呢? 首先想到的是:是不是有 ...