HBase MVCC(Multi Version Consistencey Control)
mvcc多版本并发控制,是相对锁来说对并发处理的一种方法,
在HBase中,当writernumber > reade number
表明这个memstore在写,如此时读需要等待。
1. MVCC初始化
在HRegion 的initializeRegionInternals方法中,初始化
Return the largest memstoreTS found across all storefiles in the given list. Store files that were created by a mapreduce bulk load are ignored,
long maxStoreMemstoreTS = store.getMaxMemstoreTS();
if (maxStoreMemstoreTS > maxMemstoreTS) {
maxMemstoreTS = maxStoreMemstoreTS;
}
---
mvcc.initialize(maxMemstoreTS + 1);
2. 例如 HRegion中internalFlushcache方法
首先.
w = mvcc.beginMemstoreInsert();
主要是为了设置nextWriteNumber并生成WriteEntry的对象e并加入writeQueue(LinkList)队尾。
简单的说就是通过MVCC表明当前的memstore已经开始写了,并且写的位置是nextWriteNumber
public WriteEntry beginMemstoreInsert() {
synchronized (writeQueue) {
long nextWriteNumber = ++memstoreWrite;
WriteEntry e = new WriteEntry(nextWriteNumber);
writeQueue.add(e);
return e;
}
}
mvcc.advanceMemstore(w);
主要是有个while循环从writeQueue队头中取出WriteEntry的对象一个个判断
如果nextWriteNumber>0, if (nextReadValue+1 != queueFirst.getWriteNumber()),抛异常 。
如果WriteEntry的对象已经完成,更新nextReadValue并从writeQueue中删除当前对象,否则break;
跳出while后更新memstoreRead并通知readWaiters.notifyAll().
简单的说这个方法主要是为了更新memstoreRead,也就是可以读的位置, 并通知readWaiters.notifyAll()。
boolean advanceMemstore(WriteEntry e) {
synchronized (writeQueue) {
e.markCompleted();
long nextReadValue = -1;
boolean ranOnce=false;
while (!writeQueue.isEmpty()) {
ranOnce=true;
WriteEntry queueFirst = writeQueue.getFirst();
if (nextReadValue > 0) {
if (nextReadValue+1 != queueFirst.getWriteNumber()) {
throw new RuntimeException("invariant in completeMemstoreInsert violated, prev: "
+ nextReadValue + " next: " + queueFirst.getWriteNumber());
}
}
if (queueFirst.isCompleted()) {
nextReadValue = queueFirst.getWriteNumber();
writeQueue.removeFirst();
} else {
break;
}
}
if (!ranOnce) {
throw new RuntimeException("never was a first");
}
if (nextReadValue > 0) {
synchronized (readWaiters) {
memstoreRead = nextReadValue;
readWaiters.notifyAll();
}
}
if (memstoreRead >= e.getWriteNumber()) {
return true;
}
return false;
}
}
3. 例如 HRegion中internalFlushcache方法中调用
mvcc.waitForRead(w);
这个方法就是wait直到memstore可以读,那么memstore什么时候可以读呢?
memstoreRead >= e.getWriteNumber()时才可以读。
public void waitForRead(WriteEntry e) {
boolean interrupted = false;
synchronized (readWaiters) {
while (memstoreRead < e.getWriteNumber()) {
try {
readWaiters.wait(0);
} catch (InterruptedException ie) {
// We were interrupted... finish the loop -- i.e. cleanup --and then
// on our way out, reset the interrupt flag.
interrupted = true;
}
}
}
if (interrupted) Thread.currentThread().interrupt();
}
那么在internalFlushcache中,调用waitForRead主要作用是为了在flush之前等待还在处理中的事务commit到Hlog中,并阻止未提交的事务写到HFile中。
之后就进行flush.
同样在HRegion的doMiniBatchMutation方法中有类似的mvcc应用,通过mvcc实现写完成的数据能被及时读到。
// ------------------------------------
// Acquire the latest mvcc number
// ----------------------------------
w = mvcc.beginMemstoreInsert();
// ------------------------------------------------------------------
// STEP 8. Advance mvcc. This will make this put visible to scanners and getters.
// ------------------------------------------------------------------
if (w != null) {
mvcc.completeMemstoreInsert(w);
w = null;
}
分享到:
相关推荐
《HBase权威指南中文版》是一本全面深入介绍HBase技术的书籍,涵盖了从基础概念到高级应用的各个层面。...通过学习这本书,读者不仅可以掌握HBase的核心原理,还能获得在实际项目中运用HBase的宝贵经验。
1. **源代码**:允许开发人员深入理解HBase的工作原理,并进行定制化开发或调试。 2. **bin目录**:包含可执行脚本,如启动和停止HBase服务的命令,以及用于管理表和操作数据的工具。 3. **conf目录**:提供默认配置...
3. **Region管理**:Region是HBase中的基本存储单元,随着数据增长,Region会自动分裂以保持性能。Row Key的设计至关重要,因为它决定了数据的分布和访问效率。 4. **HBase与Hadoop的集成**:HBase构建在HDFS之上,...
3. **Column Family**:列族是HBase的基本存储结构,每个表由一个或多个列族组成,列族内的列可以动态添加。 4. **Versioning**:HBase使用时间戳来管理版本,每个单元格可以有多个版本的数据。 5. **Scanning**:...
通过分析"HBaseTest"源码,我们可以更直观地理解HBase的工作原理和使用方式,为实际项目中的数据存储和处理提供有力的支持。在实际应用中,还需要根据具体需求进行性能调优,以充分利用HBase的优势,解决大数据场景...
源代码的发布对于开发者来说极其重要,因为它允许他们深入理解HBase的工作原理,进行定制化开发,或者为项目贡献代码。 在“hbase-rel-2.5.6”这个压缩包中,我们可以期待找到HBase的源代码目录结构,包括核心模块...
它还能帮助设置表的属性,如是否启用压缩、是否是多版本并发控制(MVCC)等。 2. **DML操作**:对于插入、更新和删除数据,PhoenixUtils 提供了一套简洁的API,允许开发者通过SQL语句直接操作HBase数据。这些操作...
随着大数据和分布式系统的兴起,NoSQL数据库如MongoDB、Cassandra和HBase提供了非关系型、高可扩展和高性能的解决方案。 本教程“数据库原理及应用”将涵盖以上所有知识点,并可能通过实例和练习加深理解,帮助学习...
数据库系统原理是计算机科学中的一个核心领域,它涵盖了数据存储、数据管理、数据查询和数据安全等多个方面。...通过学习,不仅可以理解数据库的基本工作原理,还能掌握实际应用中的设计和管理技巧。
- 大数据与云数据库:Hadoop,HBase,MongoDB等,以及云计算环境下的数据库服务。 - 数据库发展趋势:内存数据库,实时分析,数据仓库,数据湖等。 以上各章节覆盖了数据库原理和技术的全面知识,从基础理论到...
《数据库系统概论》是学习数据库原理的经典教材,第四版更是结合了最新的技术发展,深入浅出地介绍了数据库的基础理论、设计与管理。本课件PPT将帮助我们全面理解数据库的各个方面。 首先,我们需要了解数据库的...
非关系型数据库则更加灵活,如文档数据库(如MongoDB)、键值对存储(如Redis)、列族数据库(如HBase)和图形数据库(如Neo4j)。混合型数据库结合了关系型和非关系型的特点,以适应不同的应用场景。 在复习数据库...
整个特训营的目的是让学员通过理论学习和实践操作,理解分布式数据库的设计理念,熟悉各种分布式数据库系统(如HBase、Cassandra、MySQL Cluster、TiDB等),并能解决实际工作中的挑战。视频教程链接提供了更直观的...
6. **事务处理与并发控制**:学习事务的ACID属性(原子性、一致性、隔离性、持久性),了解锁、多版本并发控制(MVCC)和死锁的概念。 7. **备份与恢复**:掌握数据库备份类型(如全备、增量备、差异备),以及如何...
这份资料可能包含了数据库的基本概念、设计原理、操作技术以及应用实例,旨在促进大家共同学习,共同进步。 1. **数据库基本概念**:数据库是按照数据结构来组织、存储和管理数据的仓库。它不仅包含数据本身,还...
以上就是“database 重点”所涵盖的一些关键内容,这些知识点不仅涵盖了数据库的基本原理,还涉及到了实际应用中的重要技术和策略。学习并掌握这些内容,对于提升你在IT行业的专业能力至关重要。
9. **NoSQL与大数据**:非关系型数据库(NoSQL)如MongoDB、Cassandra和HBase的原理和应用,以及大数据处理技术,如Hadoop和Spark。 10. **数据库应用开发**:使用JDBC或ODBC接口与数据库交互,开发数据库驱动的...
6. **并发控制**:讲解多用户环境下如何处理事务,避免数据不一致性,如封锁协议、两阶段锁定、多版本并发控制(MVCC)等。 7. **故障恢复**:介绍日志记录、检查点技术、事务的持久性和原子性,以及如何应对系统...