众所周知,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. Struts 1 之配置文件

    web.xml中配置Struts的入口Servlet--ActionServlet,ActionServlet不负责任何的业务处理,它只是查找Action名单,找到path属性与URL属性一致的Act ...

  2. iOS注册远程推送消息证书后提示此证书签发者无效的解决办法

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们在编写关于远程推送消息的App时需要注册一个相关的证书,我 ...

  3. 剑指offer-面试题7:俩个栈实现队列(c)

  4. 关于V4L2中操作比较重要的几个命令以及一般操作流程总结

    最近在做关于摄像头测试程序相关的一些开发,主要是想要实现在摄像头采集视频的过程中,通过按键来实现拍照,然后将拍照得到的数据保存到一个文件中,通过了解V4L2的一些相关操作,原来,拍照后的数据是保存在一 ...

  5. 操作系统处理内存时内存页为4k

    windows和unix处理内存时,一个内存页的大小都为4k. 测试代码 int main() { while (1) { int *p = (int *)malloc(1024); getchar( ...

  6. 1068. Find More Coins (30)

    题目如下: Eva loves to collect coins from all over the universe, including some other planets like Mars. ...

  7. UNIX网络编程——I/O复用:select和poll函数

    我们看到TCP客户同时处理两个输入:标准输入和TCP套接字.我们遇到的问题是就在客户阻塞于(标准输入上)fgets调用,服务器进程会被杀死.服务器TCP虽然正确的给客户TCP发送了一个FIN,但是既然 ...

  8. iOS开发之六:常用控件--UIImageView的使用

    UIImageView是我们做iOS开发用的非常多的一个控件,IOS中的各种图片,包括头像,有的背景图片等基本都要用到这个控件. 1.常用的属性以及方法 <span style="fo ...

  9. Cocos2D:塔防游戏制作之旅(十八)

    在Enemy.m的getDamaged:方法只给你添加如下1行(在if条件内): [theGame awardGold:200]; 现在运行游戏你将注意到你不能放置超出你资源金币的炮塔了.当然杀死敌人 ...

  10. 对“传统BIOS”与“EFI/UEFI BIOS”的基本认识

    硬盘(MBR磁盘)分区基本认识+Windows启动原理 大家常会看到硬盘分区中这样的几种说法:系统分区.启动分区.活动分区.主分区.拓展分区.逻辑分区,MBR.PBR.DPT.主引导扇区等.尤其是看到 ...