最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

hbase的行锁与多版本并发控制(MVCC)

来源:懂视网 责编:小采 时间:2020-11-09 13:13:51
文档

hbase的行锁与多版本并发控制(MVCC)

hbase的行锁与多版本并发控制(MVCC):MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是,把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高
推荐度:
导读hbase的行锁与多版本并发控制(MVCC):MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是,把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高

MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是,把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高

MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是,把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能。

HBase正是通过行锁+MVCC保证了高效的并发读写。

为什么需要并发控制

HBase系统本身只能保证单行的ACID特性。ACID的含义是:

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 持久性(Durability)
  • 传统的关系型数据库一般都提供了跨越所有数据的ACID特性;为了性能考虑,HBase只提供了基于单行的ACID。

    下面是一个hbase并发写的例子。

    原始数据如下
    mvcc

    从Apache HBase Write Path一文可以知道hbase写数据是分为两步:
    1. 写Write-Ahead-Log(WAL)文件
    2. 写MemStore:将每个cell[(row,column)对]的数据写到内存中的memstore

    写写同步

    假定对写没有采取并发控制,并考虑以下的顺序:

    mvcc

    最终得到的结果是:

    mvcc

    这样就得到了不一致的结果。显然我们需要对并发写操作进行同步。
    最简单的方式是提供一个基于行的独占锁来保证对同一行写的独立性。所以写的顺序是:

  • (0) 获取行锁
  • (1) 写WAL文件
  • (2) 更新MemStore:将每个cell写入到memstore
  • (3) 释放行锁
  • 读写同步

    尽管对并发写加了锁,但是对于读呢?见下面的例子:
    mvcc

    如果在上面的图中红线所示的地方进行读操作,最终得到的结果是:
    mvcc

    可见需要对读和写也进行并发控制,不然会得到不一致的数据。最简单的方案就是读和写公用一把锁。这样虽然保证了ACID特性,但是读写操作同时抢占锁会互相影响各自的性能。

    MVCC算法

    HBase采用了MVCC算法来避免读操作去获取行锁。

    对于写操作:

  • (w1) 获取行锁后,每个写操作都立即分配一个写序号
  • (w2) 写操作在保存每个数据cell时都要带上写序号
  • (w3) 写操作需要申明以这个写序号来完成本次写操作
  • 对于读操作:

  • (r1) 每个读操作开始都分配一个读序号,也称为读取点
  • (r2) 读取点的值是所有的写操作完成序号中的最大整数(所有的写操作完成序号<=读取点)
  • (r3) 对某个(row,column)的读取操作r来说,结果是满足写序号为“写序号<=读取点这个范围内”的最大整数的所有cell值的组合
  • 在采用MVCC后的数据执行图:
    mvcc

    注意到采用MVCC算法后,每一次写操作都有一个写序号(即w1步),每个cell数据写memstore操作都有一个写序号(w2,例如:“Cloudera [wn=1]”)),并且每次写操作完成也是基于这个写序号(w3)。

    如果在“Restaurant [wn=2]” 这步之后,“Waiter [wn=2]”这步之前,开始一个读操作。根据规则r1和r2,读的序号为1。根据规则3,读操作以序号1读到的值是:

    mvcc

    这样就实现了以无锁的方式读取到一致的数据了。

    重新总结下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

    参考:深入理解MVCC多版本并发控制

    文档

    hbase的行锁与多版本并发控制(MVCC)

    hbase的行锁与多版本并发控制(MVCC):MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是,把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高
    推荐度:
    标签: 控制 版本 锁定
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top