HBase之MVCC
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相关推荐
- hbase 客户端_HBase架构与原理详解
一.概述 HBase是基于列式存储的分布式数据库,底层存储采用的是LSM树,是Hadoop生态下核心技术之一. 1.1 架构图 1.2 组件介绍 HBase由三种类型的服务器以主从模式构成: Regi ...
- 一条数据的HBase之旅,简明HBase入门教程-Write全流程
如果将上篇内容理解为一个冗长的"铺垫",那么,从本文开始,剧情才开始正式展开.本文基于提供的样例数据,介绍了写数据的接口,RowKey定义,数据在客户端的组装,数据路由,打包分发, ...
- hbase实践之写流程拾遗
keyvalue KeyValue中包含了丰富的自我描述信息: KeyValue是支撑"稀疏矩阵"设计的一个关键点:一些Key相同的任意数量的独立KeyValue就可以构成一行数据 ...
- Hbase问题汇总与解答
今天早上分享了下HBase,分享的时候同事提出了一些问题,可能大部分有有这样的困惑,汇总下来: HBase问题汇总与解答 两个独立的服务器,一台用HDFS,一台不用HDFS可以吗?HDFS和Hbase ...
- hbase 使用disruptor_一条数据的HBase之旅,简明HBase入门教程-Write全流程
如果将上篇内容理解为一个冗长的"铺垫",那么,从本文开始,"剧情"才开始正式展开.本文基于所给出的样例数据,介绍了将数据从Client写到RegionServe ...
- hbase集群 数据写入_HBase架构与原理详解
一.概述 HBase是基于列式存储的分布式数据库,底层存储采用的是LSM树,是Hadoop生态下核心技术之一. 1.1 架构图 1.2 组件介绍 HBase由三种类型的服务器以主从模式构成: Regi ...
- 大数据最佳实践-hbase
目录 概述 架构 MemStore WAL HMaster 读流程 写流程 Memstore Flush Flush过程 StoreFile Compaction Region Split 优化 re ...
- Hbase学习笔记(一)
HBASE介绍 特点: 1.大:行列可存储的数据量大 2.面向列:面向列簇的存储和权限控制,列簇单独索引. 3.稀疏:对于为空的列,并不占用存储空间(物理存储以row key,版本号和单独列簇组成对应 ...
- mysql安装文件瘦身_MySQL瘦身
转:PCL+VS2010环境配置 1.下载 http://www.pointclouds.org/downloads/windows.html出下载PCL完全安装包1.6.0 all-in-one-i ...
最新文章
- python如何选择命令_python 解析命令行选项
- c语言 inline函数的总结,C++中inline函数详解
- linux mysql-proxy 0.8.0_mysql主从复制及mysql-proxy0.8安装
- python反向代理服务器_主机、服务器,代理服务器,反向代理服务器理解(自用)...
- WPF依赖属性(续)(4)依赖属性与数据绑定
- 获取本机IP可区分系统可区分虚拟机和本机java程序跨平台
- kubernetes管理之使用yq工具截取属性
- 基于Jsoup爬虫Demo
- AngularJs的UI组件Datepicker Popup
- 如何解决SpringBoot的单测启动慢的问题
- 1:72 美M26龙式重型坦克拖车
- 随心所欲b超工作站图像处理_正版B超随心所欲超声工作站vista版最新版模拟数字影像软件win7...
- python爬取豆瓣电影top250_Python 爬取豆瓣电影Top250排行榜,爬虫初试
- SVG排版点击可以输入内容
- 竞态条件(race condition)
- 网易云信入选《SegmentFault 思否 2019 中国技术品牌影响力企业榜单》!
- 前后端分离实现高校学生健康档案管理系统
- 序(C# in depths)
- 【SPIE独立出版--EIScopus检索--前四届均已检索】2023年第五届人工智能与计算机科学国际学术会议(AICS 2023)
- java swing暂停继续_如何在Java Swing应用程序中暂停/睡眠/等待?
热门文章
- kubernetes 部署 dashboard(详细步骤)
- 数据科学入门与实战:Matplotlib绘图基础一
- 量子计算机接口,量子计算机接口架构设计与研究
- 计算机计算资源估计,项目时间管理中的计算题三点估算和关键路径法
- 平流式沉淀池表面负荷怎么计算_沉淀池表面负荷
- 3个阶段 项目征名_项目管理的3个关键动作:启动、推进、复盘
- jsp 动态添加一行数据_大数据从入门到深入:JavaEE 之 动态网页开发基础 JSP的数据交互(3)...
- java模拟时间_使用生成器模拟时间分片
- pandas按照字典格式替换dataframe的值
- python填充数组到指定长度