HBase在保证写数据一致性的同时,还保证读取的高性能。这一机制的实现就是通过MultiVersionConsistencyControl来控制的,简称MVCC

HBase为什么需要并发控制?

我们知道HBase是可以通过客户端往服务器写数据的,如果存在多个客户端,可能同时在操作某一个Region的某一行的某一列。

我们首先假定一个并发写的场景:

假设两个客户端同时往表中同一个Row的同一个Family(general)的两个列(qualifier)name和 price写数据,对于MemStore来讲这些数据是并发写入的。

写数据流程如下:

写入MemStore:讲每一个cell单元格写入MemStore缓存起来

写入HLog

上面例子中其实有4个key-value也就是4个cell,每一个请求来的时候,MemStore会写两个,但是这四个key-value写入顺序我们是无法在并发环境下保证的,就可能会出现以下情况:

本来在写完general:name= Gibson Guitar的时候,然后接着写入122.89

但是这个时候另一个线程抢在它之前执行了写入349.99

怎么办呢?

# 我们可以先获取Row Lock

# 更新MemStore,写入cell

# 再将cell写入HLog

# 释放Row Lock

那现在写的问题解决了,那我们读取数据的时候会不会有问题呢?

我们试想一下:当第一组数据general:name和 general:price<Gibson Guitar,122.89>已经写入完毕,已经释放锁

第二组数据开始写,正在写或准备写price349.99的时候,读请求过来,他已经把general:name=>GibsonGuitar更细了,但是还没有更新general:price=>349.99,这时候读取的数据就是

很显然这是有问题的。

怎么办呢?我们对读请求加锁,毫无疑问这肯定是没有问题的

但是不管读还是写都会涉及到锁的竞争,降低了系统的吞吐量。

所以MVCC出场了。

原理如下:

无论读写,每一次都被给一个Number,写操作叫做WriteNumber,读操作叫做memstoreRead。

一般情况下,为了确保数据一致性,在对数据进行写操作的时候,需要等到前面的操作完成,不然可能造成数据丢失。

所以当一个写操作来的时候,会把这个请求写入链表末尾writeQueue

,完成的操作标记为完成,并且从链表头部删除。

而最大的writeNumber会记录在memstoreRead,从而告知其他的所有的等待者,现在操作的最新sequenceId是多少,保证每一个等待着看到的数据都是最新的

HBase之MVCC相关推荐

  1. hbase 客户端_HBase架构与原理详解

    一.概述 HBase是基于列式存储的分布式数据库,底层存储采用的是LSM树,是Hadoop生态下核心技术之一. 1.1 架构图 1.2 组件介绍 HBase由三种类型的服务器以主从模式构成: Regi ...

  2. 一条数据的HBase之旅,简明HBase入门教程-Write全流程

    如果将上篇内容理解为一个冗长的"铺垫",那么,从本文开始,剧情才开始正式展开.本文基于提供的样例数据,介绍了写数据的接口,RowKey定义,数据在客户端的组装,数据路由,打包分发, ...

  3. hbase实践之写流程拾遗

    keyvalue KeyValue中包含了丰富的自我描述信息: KeyValue是支撑"稀疏矩阵"设计的一个关键点:一些Key相同的任意数量的独立KeyValue就可以构成一行数据 ...

  4. Hbase问题汇总与解答

    今天早上分享了下HBase,分享的时候同事提出了一些问题,可能大部分有有这样的困惑,汇总下来: HBase问题汇总与解答 两个独立的服务器,一台用HDFS,一台不用HDFS可以吗?HDFS和Hbase ...

  5. hbase 使用disruptor_一条数据的HBase之旅,简明HBase入门教程-Write全流程

    如果将上篇内容理解为一个冗长的"铺垫",那么,从本文开始,"剧情"才开始正式展开.本文基于所给出的样例数据,介绍了将数据从Client写到RegionServe ...

  6. hbase集群 数据写入_HBase架构与原理详解

    一.概述 HBase是基于列式存储的分布式数据库,底层存储采用的是LSM树,是Hadoop生态下核心技术之一. 1.1 架构图 1.2 组件介绍 HBase由三种类型的服务器以主从模式构成: Regi ...

  7. 大数据最佳实践-hbase

    目录 概述 架构 MemStore WAL HMaster 读流程 写流程 Memstore Flush Flush过程 StoreFile Compaction Region Split 优化 re ...

  8. Hbase学习笔记(一)

    HBASE介绍 特点: 1.大:行列可存储的数据量大 2.面向列:面向列簇的存储和权限控制,列簇单独索引. 3.稀疏:对于为空的列,并不占用存储空间(物理存储以row key,版本号和单独列簇组成对应 ...

  9. mysql安装文件瘦身_MySQL瘦身

    转:PCL+VS2010环境配置 1.下载 http://www.pointclouds.org/downloads/windows.html出下载PCL完全安装包1.6.0 all-in-one-i ...

最新文章

  1. python如何选择命令_python 解析命令行选项
  2. c语言 inline函数的总结,C++中inline函数详解
  3. linux mysql-proxy 0.8.0_mysql主从复制及mysql-proxy0.8安装
  4. python反向代理服务器_主机、服务器,代理服务器,反向代理服务器理解(自用)...
  5. WPF依赖属性(续)(4)依赖属性与数据绑定
  6. 获取本机IP可区分系统可区分虚拟机和本机java程序跨平台
  7. kubernetes管理之使用yq工具截取属性
  8. 基于Jsoup爬虫Demo
  9. AngularJs的UI组件Datepicker Popup
  10. 如何解决SpringBoot的单测启动慢的问题
  11. 1:72 美M26龙式重型坦克拖车
  12. 随心所欲b超工作站图像处理_正版B超随心所欲超声工作站vista版最新版模拟数字影像软件win7...
  13. python爬取豆瓣电影top250_Python 爬取豆瓣电影Top250排行榜,爬虫初试
  14. SVG排版点击可以输入内容
  15. 竞态条件(race condition)
  16. 网易云信入选《SegmentFault 思否 2019 中国技术品牌影响力企业榜单》!
  17. 前后端分离实现高校学生健康档案管理系统
  18. 序(C# in depths)
  19. 【SPIE独立出版--EIScopus检索--前四届均已检索】2023年第五届人工智能与计算机科学国际学术会议(AICS 2023)
  20. java swing暂停继续_如何在Java Swing应用程序中暂停/睡眠/等待?

热门文章

  1. kubernetes 部署 dashboard(详细步骤)
  2. 数据科学入门与实战:Matplotlib绘图基础一
  3. 量子计算机接口,量子计算机接口架构设计与研究
  4. 计算机计算资源估计,项目时间管理中的计算题三点估算和关键路径法
  5. 平流式沉淀池表面负荷怎么计算_沉淀池表面负荷
  6. 3个阶段 项目征名_项目管理的3个关键动作:启动、推进、复盘
  7. jsp 动态添加一行数据_大数据从入门到深入:JavaEE 之 动态网页开发基础 JSP的数据交互(3)...
  8. java模拟时间_使用生成器模拟时间分片
  9. pandas按照字典格式替换dataframe的值
  10. python填充数组到指定长度