众所周知,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. Socket实现单客户端与服务器对话功能

    单客户端,顾名思义,就是客户端只有一个用户去访问服务器,然后服务器根据该客户请求返回信息,先看下效果图: 服务端(左)和客户端(右): 注意,我是用了两个eclipse,一个只放服务端文件,一个只放客 ...

  2. 安卓开发过程中空指针的问题Java.lang.NullPointerException

    最近做一个新闻客户端的应用,经常出现空指针的问题,我想一方面可能是自己水平有限,二是开发过程中有一些遗漏的地方.一般情况下新手出现空指针的概率较高.下面来总结一下经常出现的问题. 1.所谓的指针,就是 ...

  3. 关于Lt分发系统的时序图分析

    我们已经知道,系统共分为两个模块,mather与son 同时系统允许的操作也有三种,向mather提交war包,我某个服务器更新代码,为所有服务器更新代码 我们一个一个来看 先说,向mather提交w ...

  4. Android的四个基本概念(线程通信和GLSurfaceView)

    GLSurfaceView提供了下列特性: 1> 管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上. 2> 管理一个EGL disp ...

  5. 04 AutoCompleteTextView

    作用:输入部分文字跳处下拉框列出相应的条目 <pre name="code" class="html"> <!-- 当文本框出现两个字符才开始 ...

  6. Android性能优化之常见的内存泄漏

    前言 对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想检测程序中是否有内存泄漏的产生,通常我们可以借助LeakCanary.MAT等工具来检 ...

  7. (NO.00002)iOS游戏精灵战争雏形(八)

    子弹的初始化工作前2篇基本做好了,下面就是如何射出子弹. 通常来说,子弹射向目标对象,需要走一条直线.直线由2点定位,分别为发射点和目标点. 发射点就是开枪精灵自身的位置,目标点则为敌方精灵的位置,大 ...

  8. 【翻译】Ext JS最新技巧——2015-1-2

    原文:http://www.sencha.com/blog/top-support-tips-january-2015?mkt_tok=3RkMMJWWfF9wsRolvqvIZKXonjHpfsX7 ...

  9. 客户地点分配多OU

    DECLARE l_num_user_id NUMBER; l_num_appl_id NUMBER; l_num_resp_id NUMBER; cust_account_rec_type hz_c ...

  10. 【Unity Shaders】Using Textures for Effects介绍

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...