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 (写的不错) ...
随机推荐
- .Net WEB 程序员需要掌握的技能
原文链接:http://deshui.wang/%E6%8A%80%E6%9C%AF/2015/05/12/net-study-road 基础部分 C# 基础语法 OOP的概念,面向对象的理解 继承 ...
- python单元测试pytest
1.pytest简介 pytest是Python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高. 执行测试过程中可以将某些测试 ...
- mongodb 错误 SCRAM-SHA-1 authentication failed for --转
log 日志错误信息 2018-10-24T16:14:42.244+0800 I NETWORK [initandlisten] connection accepted from 192.168.1 ...
- 安装freepbx后创建sip分机
在前面的文章阿里云使用镜像安装freepbx里面我们已经使用镜像文件安装好了freepbx,接下来开始是开始创建SIP分机,实现可以拨打电话. 首先我们输入我们的IP可以直接访问到freepbx的界面 ...
- [LeetCode] Level Order Traversal
题目说明 Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to r ...
- sockets+proxychains代理,使内网服务器可以访问外网
Socks5+proxychains做正向代理 1. 应用场景: 有一台能上外网的机子,内网机子都不能连外网,需求是内网机子程序需要访问外网,做正向代理. 2. 软件 ...
- H5开发过程中修复的bug记录
从2016年8月1日开始真正意义上的修复bug,也是自己开发之路的开端,希望在这里记录自己修bug过程中遇到的问题及解决方法,待能够自己开发需求的时候,计划记录开发新需求过程中遇到的问题,并且记录自己 ...
- hadoop学习笔记(十):MapReduce工作原理(重点)
一.MapReduce完整运行流程 解析: 1 在客户端启动一个作业. 2 向JobTracker请求一个Job ID. 3 将运行作业所需要的资源文件复制到HDFS上,包括MapReduce程序打包 ...
- (译) 在AngularJS中使用的表单验证功能
验证功能是AngularJS里面最酷炫的功能之一,它可以让你写出一个具有良好用户体验的Web应用. 在AngularJS中,有许多用于验证的指令.我们将先学习几个最流行的内置指令,然后再创建一个自定义 ...
- [日常] Linux使用diff来比较目录
Linux diff比较两个目录的不同: diff dir1 dir2 -urNaq -a --text Treat all files as text. -u -U NUM --unifi ...