HBase MVCC 和内置原子操作
作者:Lars Hofhansl(这是我今年 3 月发布的 HBase 中的 ACID 帖子的后续内容)HBase 有一些特殊的原子操作:checkAndPut、checkAndDelete - 这些只是检查列的值作为前提条件,然后应用 Put或 D
作者:Lars Hofhansl(这是我今年 3 月份在 HBase 中的 ACID 帖子的后续)
HBase 有一些特殊的原子操作:
- checkAndPut、checkAndDelete - 这些只是检查列的值作为先决条件,然后如果检查成功则应用 Put 或 Delete。
- 增量、追加 - 这些允许原子添加到解释为整数,或附加到列的末尾,分别
增量和追加不是幂等的。它们是 HBase 中唯一不可重复的操作。 Increment 和 Append 也是唯一 HBase 的 MVCC 模型提供的快照隔离不足以满足要求的操作......稍后会详细介绍。
事实证明, checkAndPut 和 checkAndDelete 并不像预期的那样原子(这个问题是由 Gregory 提出的,尽管我一开始并不相信他是对的 - 请参阅 HBASE-7051)。
看一下代码就可以很明显地看出这一点:
一些 Put 优化 (HBASE-4528) ) 允许在更改同步到 WAL 之前释放行锁。这也要求在提交 MVCC 更改之前释放锁,以便在保证更改持久之前,更改对其他事务不可见。
获取行锁以进行原子更改的另一个操作(例如 checkAndXXX)可能会事实上,尽管持有行锁,但看不到当前的情况,因为仍然可能存在未完成的 MVCC 更改,这些更改只有在行锁释放并重新获取后才可见。因此它可能会在陈旧的数据上运行。 HBASE-4528 后,持有行锁已经不够好了。
Increment 和 Append 也有同样的问题。
这部分的修复相对简单:我们需要某种“MVCC 屏障”。我们不是在更新阶段结束时完成单个 MVCC 事务(这将等待所有先前的事务完成),而是早一点等待先前的事务完成
之前我们开始检查或获取原子操作的阶段。这只会稍微降低并发性,因为在操作结束之前我们无论如何都必须等待所有先前的事务。 HBASE-7051 正是针对 checkAndXXX 操作执行此操作。
此外 - 如上所述 - Increment 和 Append 还有另一个问题,
它们需要是可序列化的事务。快照隔离不够好。例如:如果您从 0 开始并发出增量 1 和另一个增量 2,则结果必须始终为 3。如果两者可以以相同的起始值开始(a快照)结果可能是 1 或 2,具体取决于哪一个先完成。
增量和追加目前通过一个丑陋的“黑客”解决了这个问题:当他们将更改写入memstore时,他们将所有新KeyValues的memstoreTS设置为0!结果是它们立即对其他事务可见,违反了 HBase 的 MVCC。再次参见 HBase 中的 ACID 以获取 memstoreTS 的说明。
这保证了并发增量和追加操作的正确结果,但对并发扫描器的可见性并不是您所期望的。即使扫描仪应该看到数据的早期快照,即使对于部分行,增量和附加值也可以随时对任何扫描仪可见。
增量和附加也设计用于非常高的吞吐量,因此它们实际上操纵 HBase memstore 删除刚刚修改的列的旧版本。因此,您会丢失更改的版本历史记录,以换取避免内存存储因许多增量或追加的版本而爆炸。这在 HBase 中称为“更新插入”。 Upsert 很好,因为它可以防止内存存储被填满,如果没有人关心它们,就会有很多旧值。缺点是这是对 memstore 的特殊操作,并且很难正确执行。 MVCC。它也不适用于 mslab(请参阅此 Cloudera 博客文章以了解 mslab 的说明)。
如果您不关心可见性,这是一个简单的问题,因为您可以只查看内存存储并删除旧的价值观。不过,如果您关心 MVCC,则必须首先证明删除 KV 是安全的。
我几乎在一年前尝试修复此问题(HBASE-4583),但经过与同事的一些讨论后我们集体放弃了这一点。
几天前,我重新打开了 HBASE-4583,并开始使用一个激进的补丁,该补丁消除了所有 upsert 类型的逻辑(将 memstoreTS 设置为 0),并在开始增量/追加之前等待先前的事务。然后,我依靠对 HBASE-4241 的更改,仅在将内存存储刷新到磁盘时刷新所需列的版本。事实证明这仍然慢了很多(10-15%),因为它需要经常刷新内存存储,即使它会导致大部分空文件。不过,这仍然是一个很好的尝试,因为它摆脱了很多特殊代码,并将增量和追加变成普通的 HBase 公民。
第二个不太激进的版本使 upsert MVCC 意识到。
那就是实际上并不像看起来那么容易。为了从 memstore 中删除列的版本(KeyValue),您必须证明它不会被任何并发或未来的扫描器看到。这意味着我们必须找到任何扫描仪的最早读取点并确保至少有一个版本的KV早于该最小读取点;然后我们就可以安全地从 memstore 中删除该 KV 的所有旧版本 - 因为任何扫描仪都保证能看到更新版本的 KV。
中的“不太激进”补丁正是这样做的。
在最后,我最终使用 HBASE-4583 提交的补丁同时执行以下两项操作:
如果要递增或追加的列的列族的版本设置为 1,我们会执行补丁添加的 MVCC 感知更新插入。如果 VERSIONS 是 > 1、我们使用通常的逻辑向memstore添加一个KeyValue。所以现在这在所有情况下都符合预期。如果请求多个版本,它们将被保留,并且即使使用增量和追加,时间范围查询也将起作用;当 VERSIONS 设置为 1 时,它还保留了(大部分)性能特征。
译文地址:HBase MVCC 和内置原子操作,感谢原作者分享。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

随着大数据时代的到来,数据处理和存储变得越来越重要,如何高效地管理和分析大量的数据也成为企业面临的挑战。Hadoop和HBase作为Apache基金会的两个项目,为大数据存储和分析提供了一种解决方案。本文将介绍如何在Beego中使用Hadoop和HBase进行大数据存储和查询。一、Hadoop和HBase简介Hadoop是一个开源的分布式存储和计算系统,它可

深入解析MySQLMVCC原理与实现MySQL是目前最流行的关系型数据库管理系统之一,它提供了多版本并发控制(MultiversionConcurrencyControl,MVCC)机制来支持高效并发处理。MVCC是一种在数据库中处理并发事务的方法,可以提供高并发和隔离性。本文将深入解析MySQLMVCC的原理与实现,并结合代码示例进行说明。一、M

MySQLMVCC原理深入解读及最佳实践一、概述MySQL是使用最广泛的关系型数据库管理系统之一,其支持多版本并发控制(Multi-VersionConcurrencyControl,MVCC)机制来处理并发访问问题。本文将深入解读MySQLMVCC的原理,并给出一些最佳实践的例子。二、MVCC原理版本号MVCC是通过为每个数据行添加额外

了解MySQLMVCC原理,优化数据库事务处理近年来,随着数据量的不断增长和应用需求的提升,数据库事务处理的性能优化成为了数据库开发和运维中一个非常重要的环节。MySQL作为最常用的开源关系型数据库之一,其MVCC(Multi-VersionConcurrencyControl)原理在事务处理中发挥了重要的作用。本文将介绍MySQLMVCC原理,并

掌握MySQLMVCC原理,提升数据读取效率简介:MySQL是一种常用的关系型数据库管理系统,而MVCC(Multi-VersionConcurrencyControl)是MySQL中常用的并发控制机制。掌握MVCC原理可以帮助我们更好地理解MySQL的内部工作原理,并且可以提升数据读取的效率。本文将介绍MVCC的原理以及如何运用此原理来提升数据读取效

线程安全当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协调,这个类都能表现出正确的行为,那么就称这个类时线程安全的。线程安全主要体现在以下三个方面原子性:提供了互斥访问,同一时刻只能有一个线程对它进行操作可见性:一个线程对主内存的修改可以及时的被其他线程观察到有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序的存在,该观察结果一般杂乱无序JUC中的Atomic包详解Atomic包中提供了很多Atomicxxx的类

1、MVCCMVCC,全称Multi-VersionConcurrencyControl,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。MVCC在MySQLInnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读写冲突,做到即使有>读写冲突时,也能做到不加锁,非阻塞并发读。2、当前读像selectlockinsharemode(共享锁),selectforupdate;update,insert,de

1.什么是MVCCMVCC(MultiversionConcurrencyControl),多版本并发控制。顾名思义,MVCC是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读.操作有了保证。换言之,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样在做查询的时候就不用等待另一个事务释放锁。MVCC没有正式的标准,在不同的DBMS中MVCC的实现方式可能是不同的,也不是普遍使用的(大家可以参考相关的DBMS文档)。
