众所周知,ACID是指原子性(Atomicity),一致性(Consistency),隔离性(Isolation)和持久性(Durability)。

HBase对同一行数据的操作提供ACID保证。HBASE-3584支持多操作事务,HBASE-5229支持多行事务,但原理都是一样的。

那么,HBase中的ACID是如何工作的呢?

HBase采用MVCC来实现ACID,同时HBase中没有混合读写事务。简单说来,HBase的ACID就是在各个RegionServer上维护一个我称之为“严格单调递增事务号”(strictly monotonically increasing transaction numbers)的东东。

当一个写事务(put,delete)开始时将获取到下一个最高事务号,HBase将这个号称为“写入号”(WriteNumber);当一个读事务(scan,get)开始时将获取到上一次提交成功的事务号,这个号被称为“读取点”(ReadPoint)。

每个创建的KeyValue对都会被标记上它的事务写入号。HBase中将这个标签称为”memstore时间戳”。注意将这个时间戳和应用中可见的时间戳区分开。

HBase中一个标准写事务的流程如下:

  1. 锁行,拒绝对相同行的并发写
  2. 获取当前的写入号
  3. 将修改写入“写前日志”WAL(Write Ahead Log)
  4. 将修改写入Memstore,同时用获取到的写入号标记KeyValue对
  5. 提交事务,即尝试将读取点滚到获取到的写入号(这样变更就可以对所有新的Scan可见)
  6. 打开行锁

一个标准读事务的流程如下:

  1. 打开Scanner
  2. 获取当前读取点
  3. 筛选出所有memstore时间戳大于读取点的KeyValue对
  4. 关闭Scanner

尽管实际的流程要更复杂,但上面的流程已经足以阐明要点。另外,你可能注意到,虽然读请求根本没有锁,我们一样实现了ACID。

HBase的事务非常短暂,且所有事务都是串行提交的(我们都知道:所有的事务可以工作都是基于严格串行的提交的,否则一个稍早的未提交的事务可能由于在他之后的事务先提交了而变的可见了)。HBase维护者一个未完成的事务列表。一个事务想提交,必须等到之前所有的事务都提交(注意:变更依然是及时的,并发的,只有提交才是串行的)。

另外,因为HBase不保证RegionServer间的一致性,所以MVCC数据只需要保存在单台RegionServer的内存中。

接着咱们来说说HBase中比较有意思的压缩。HBase中压缩是指:将多个小存储文件(从memstore刷新到磁盘上的)合并成一个大文件,同时进行垃圾回收。这里的垃圾是指过期的,或版本太老,或被标记为删除的KeyValue对。

想象一下,压缩的时候一个Scanner过来取数据,会发生什么呢?

有可能只读出行的一部分。HBase的行由一系列带版本号的KeyValues对组成,这些KeyValue并不能反映事务结束后的最终结果。HBase的解决方案是压缩开始时记录正在读取的最早的一个读取点,然后只压缩比这个读取点小的KeyValue对。这个逻辑让HBase即使在并发刷新memstore到磁盘时也能够保证ACID。HBASE-2856开始支持这个逻辑,HBASE-5569对删除标志支持同样的逻辑。

最后说一句,当KeyValue的memstore时间戳比任何Scanner的读取点都小时,可以被清零。即,对于任何Scanner这条keyValue都是可见的,因为之前的Scanner已经完成了。

补充几点:

  • 为了不拖延正在等待提交的事务,即使事务失败了,读取点依然会向前滚
  • 每当变更写入WAL时,就会产生一条记录,并没有单独的提交记录
  • 一台RegionServer挂了之后,WAL记录写成功的但未执行的事务最终会在另外一台RegionServer上重新执行,WAL记录未写成功的则会被丢弃

转自:http://archfan.sinaapp.com/2012/04/18/acid-in-hbase/

HBase事务的更多相关文章

  1. HBase 事务和并发控制机制原理

    作为一款优秀的非内存数据库,HBase和传统数据库一样提供了事务的概念,只是HBase的事务是行级事务,可以保证行级数据的原子性.一致性.隔离性以及持久性,即通常所说的ACID特性.为了实现事务特性, ...

  2. 如何解决分布式系统数据事务一致性问题(HBase加Solr)

    如何解决分布式系统数据事务一致性问题 (HBase加Solr) 摘要:对于所有的分布式系统,我想事务一致性问题是极其非常重要的问题,因为它直接影响到系统的可用性.本文以下所述所要解决的问题是:对于入H ...

  3. HBase的写事务,MVCC及新的写线程模型

    MVCC是实现高性能数据库的关键技术,主要为了读不影响写.几乎所有数据库系统都用这技术,比如Spanner,看这里.Percolator,看这里.当然还有mysql.本文说HBase的MVCC和0.9 ...

  4. HBase之七:事务和并发控制机制原理

    作为一款优秀的非内存数据库,HBase和传统数据库一样提供了事务的概念,只是HBase的事务是行级事务,可以保证行级数据的原子性.一致性.隔离性以及持久性,即通常所说的ACID特性.为了实现事务特性, ...

  5. 大数据学习day34---spark14------1 redis的事务(pipeline)测试 ,2. 利用redis的pipeline实现数据统计的exactlyonce ,3 SparkStreaming中数据写入Hbase实现ExactlyOnce, 4.Spark StandAlone的执行模式,5 spark on yarn

    1 redis的事务(pipeline)测试 Redis本身对数据进行操作,单条命令是原子性的,但事务不保证原子性,且没有回滚.事务中任何命令执行失败,其余的命令仍会被执行,将Redis的多个操作放到 ...

  6. HBase框架学习之路

    1 背景知识 1.1 解决问题 解决HDFS不支持单条记录的快速查找和更新的问题. 1.2 适用情况 存在亿万条记录的数据库,只有千万或者百万条记录使用RDBMS更加合适 确保你的应用不需要使用RDB ...

  7. Hbase+ Phoenix搭建教程

    Hbase+ Phoenix搭建教程 一.Hbase简介 HBase是基于列存储.构建在HDFS上的分布式存储系统,其主要功能是存储海量结构化数据. HBase构建在HDFS之上,因此HBase也是通 ...

  8. NoSQL生态系统——事务机制,行锁,LSM,缓存多次写操作,RWN

    13.2.4 事务机制 NoSQL系统通常注重性能和扩展性,而非事务机制. 传统的SQL数据库的事务通常都是支持ACID的强事务机制.要保证数据的一致性,通常多个事务是不可能交叉执行的,这样就导致了可 ...

  9. HBase 实战(2)--时间序列检索和面检索的应用场景实战

    前言: 作为Hadoop生态系统中重要的一员, HBase作为分布式列式存储, 在线实时处理的特性, 备受瞩目, 将来能在很多应用场景, 取代传统关系型数据库的江湖地位. 本篇主要讲述面向时间序列/面 ...

随机推荐

  1. BeanUtils 读取数据

    前两篇文章都是关于setProperty的,下面来说一个关于getProperty 的小案例.如下: MyClass.java package beanutils; public class MyCl ...

  2. 树莓派初体验,安装Ubuntu 14.04 LTS

    转载自:http://www.polarxiong.com/archives/%E6%A0%91%E8%8E%93%E6%B4%BE%E5%88%9D%E4%BD%93%E9%AA%8C-%E5%AE ...

  3. 关于在eclipse开发环境上打开手机data文件

    使用Eclipse开发Android上的数据库应用,需要把数据库文件放到/data/data/mynamespace/database文件夹下,普通手机通过ROOT后经常还是看不到这个文件夹,这时需要 ...

  4. ENVI自带的非监督分类测试情况

    最近写了两个关于遥感图像的简单的非监督分类算法KMEAN和ISODATA,发现结果和ENVI的一直有差异,而且还蛮大的,找了好久也没有找到原因.于是用PS自己绘制了一个简单的图像用于测试.如图1所示, ...

  5. C++对象模型的那些事儿之六:成员函数调用方式

    前言 C++的成员函数分为静态函数.非静态函数和虚函数三种,在本系列文章中,多处提到static和non-static不影响对象占用的内存,而虚函数需要引入虚指针,所以需要调整对象的内存布局.既然已经 ...

  6. (NO.00004)iOS实现打砖块游戏(七):关卡类的实现

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 关卡游戏的精髓都集中在游戏的关卡里,其中包含了游戏的所有要素,至 ...

  7. UE4利用Save Game创建全局变量

    因为盲目的做了一个UE4的项目,没有用到UE4的无缝加载,我只能在一个个关卡中手动切换,然后每次的数据都会重置,这对于项目来说,造成了体验感的极度下降. 然而我查了一下怎样在UE4中创建全局变量,找到 ...

  8. iOS中 static变量与全局、局部变量的区别 !

    static变量与全局.局部变量的区别 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式. 这两者在存储方式上并 ...

  9. 测试adb功能(后续学习会不断添加)

    在安卓中最常用来调试的工具就是ADB,废话不多说,看看几个常用的ADB命令: 1.查看设备的连接状态 在windows cmd中输入 adb devices 会显示设备的相关信息. 2.adb she ...

  10. Dynamics CRM 2013 subgrid刷新后刷新主表单

    项目中会遇到这样的需求,会根据subgrid中的数据变化去更新主表单中的某个或多个字段值,一般的做法就是写插件根据subgrid中实体数据的变化在后台更新主表数据库,但后台更新了要反映到前台就得使用刷 ...