参考:http://www.rigongyizu.com/hbase-row-lock-and-multiversion-concurrency-control/
MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是,把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能。
HBase正是通过行锁+MVCC保证了高效的并发读写。
为什么需要并发控制
HBase系统本身只能保证单行的ACID特性。ACID的含义是:
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)
传统的关系型数据库一般都提供了跨越所有数据的ACID特性;为了性能考虑,HBase只提供了基于单行的ACID。
下面是一个hbase并发写的例子。
原始数据如下
从Apache HBase Write Path一文可以知道hbase写数据是分为两步:
1. 写Write-Ahead-Log(WAL)文件
2. 写MemStore:将每个cell[(row,column)对]的数据写到内存中的memstore
写写同步
假定对写没有采取并发控制,并考虑以下的顺序:
最终得到的结果是:
这样就得到了不一致的结果。显然我们需要对并发写操作进行同步。
最简单的方式是提供一个基于行的独占锁来保证对同一行写的独立性。所以写的顺序是:
- (0) 获取行锁
- (1) 写WAL文件
- (2) 更新MemStore:将每个cell写入到memstore
- (3) 释放行锁
读写同步
尽管对并发写加了锁,但是对于读呢?见下面的例子:
如果在上面的图中红线所示的地方进行读操作,最终得到的结果是:
可见需要对读和写也进行并发控制,不然会得到不一致的数据。最简单的方案就是读和写公用一把锁。这样虽然保证了ACID特性,但是读写操作同时抢占锁会互相影响各自的性能。
MVCC算法
HBase采用了MVCC算法来避免读操作去获取行锁。
对于写操作:
- (w1) 获取行锁后,每个写操作都立即分配一个写序号
- (w2) 写操作在保存每个数据cell时都要带上写序号
- (w3) 写操作需要申明以这个写序号来完成本次写操作
对于读操作:
- (r1) 每个读操作开始都分配一个读序号,也称为读取点
- (r2) 读取点的值是所有的写操作完成序号中的最大整数(所有的写操作完成序号<=读取点)
- (r3) 对某个(row,column)的读取操作r来说,结果是满足写序号为“写序号<=读取点这个范围内”的最大整数的所有cell值的组合
在采用MVCC后的数据执行图:
注意到采用MVCC算法后,每一次写操作都有一个写序号(即w1步),每个cell数据写memstore操作都有一个写序号(w2,例如:“Cloudera [wn=1]”)),并且每次写操作完成也是基于这个写序号(w3)。
如果在“Restaurant [wn=2]” 这步之后,“Waiter [wn=2]”这步之前,开始一个读操作。根据规则r1和r2,读的序号为1。根据规则3,读操作以序号1读到的值是:
这样就实现了以无锁的方式读取到一致的数据了。
重新总结下MVCC算法下写操作的执行流程:
- (0) 获取行锁
- (0a) 获取写序号
- (1) 写WAL文件
- (2) 更新MemStore:将每个cell写入到memstore
- (2a) 以写序号完成操作
- (3) 释放行锁
本文是基于HBase 0.92. 在HBase 0.94中会有些优化策略,比如 HBASE-5541 提到的。
英文原文:https://blogs.apache.org/hbase/entry/apache_hbase_internals_locking_and
相关推荐
多线程 hbase
hadoop,hbase,hive版本整合兼容性最全,最详细说明【适用于任何版本】,避免下载后才发现不兼容的坑
为了实现事务特性,HBase采用了各种并发控制策略,包括各种锁机制、MVCC机制等。本文首先介绍HBase 的两种基于锁实现的同步机制,再分别详细介绍行锁的实现以及各种读写锁的应用场景,最后重点介绍MVCC机制的实现...
大数据安全-kerberos技术-hbase安装包,hbase版本:hbase-2.2.6-bin.tar.gz
本文来自于csdn,介绍了Hadoop的原理,HBase的特点,HBase 的高并发和实时处理数据,数据模型,工作流程等。(一)HDFS主要是用于做什么的?HDFS(HadoopDistributedFileSystem)分布式文件管理系统、是Hadoop项目的...
java代码使用thrift2操作hbase示例,thrift2连接hbase添加数据,单条查找,删除数据,根据扫描器查找,修改数据等测试实例
很多刚入门的同学找不到版本对应关系,这里从官网整理下来,供大家参考 hadoop、hbase、hive版本对应关系.新手指导hadoop、hbase、hive版本对应关系查找表
HBase开启审计日志
HBase AMWU-大数据一:hello HBase (HBase1.03伪单机版本安装,Windows7 JAVA远程调用)
phoenix-hbase各个版本源码的下载地址,由于phoenix对hbase的版本有要求,所以大家根据自己环境的情况下载
hadoop、hbase、hive、zookeeper版本对应关系续(最新版)
在本地模式下,hbase只需要安装JDK...若使用HDFS文件系统模式,除了JDK,还需要安装hadoop(HDFS是hadoop的旗舰级文件系统,是hadoop项目的核心子项目,安装hadoop会带有hdfs),本版本hbase依赖安装的hadoop版本是2.4.1
eclipse链接hbase所需jar包,hbase版本1.2.6,Hadoop版本2.7.1
HBase即Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在普通的PC Server上搭建起大规模结构化存储集群。 HBase是Google Bigtable的开源实现,类似Google Bigtable利用...
HBase应用架构 [美] 吉恩-马克·斯帕加里(Jean-Marc Spaggiari) 著,陈敏敏 夏锐 陈其生 译
eclipse链接hbase所需jar包,hbase版本1.2.6,Hadoop版本2.7.1(转载的另一篇下载的,亲测可用)
HBase入门与使用,可以了解如何使用HBase
本文档详尽的描述了 HBASE中的事务与锁等信息,是理解hbase事务与锁的好资料
5 5)最后,HBase不支持联合查询 5 mapreduce与HBase表配合使用 5 4. HBase的模式Schema设计的一些概念和原则 5 1)模式的创建与更新 5 2)列族的数量 6 3)行键设计RowKey 6 5. HBase的拓扑结构是什么? 7 1)拓扑...