作者: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 和内置原子操作,感谢原作者分享。

MySQL是一种开源的关系型数据库管理系统,主要用于快速、可靠地存储和检索数据。其工作原理包括客户端请求、查询解析、执行查询和返回结果。使用示例包括创建表、插入和查询数据,以及高级功能如JOIN操作。常见错误涉及SQL语法、数据类型和权限问题,优化建议包括使用索引、优化查询和分表分区。

MySQL是一个开源的关系型数据库管理系统,适用于数据存储、管理、查询和安全。1.它支持多种操作系统,广泛应用于Web应用等领域。2.通过客户端-服务器架构和不同存储引擎,MySQL高效处理数据。3.基本用法包括创建数据库和表,插入、查询和更新数据。4.高级用法涉及复杂查询和存储过程。5.常见错误可通过EXPLAIN语句调试。6.性能优化包括合理使用索引和优化查询语句。

选择MySQL的原因是其性能、可靠性、易用性和社区支持。1.MySQL提供高效的数据存储和检索功能,支持多种数据类型和高级查询操作。2.采用客户端-服务器架构和多种存储引擎,支持事务和查询优化。3.易于使用,支持多种操作系统和编程语言。4.拥有强大的社区支持,提供丰富的资源和解决方案。

InnoDB的锁机制包括共享锁、排他锁、意向锁、记录锁、间隙锁和下一个键锁。1.共享锁允许事务读取数据而不阻止其他事务读取。2.排他锁阻止其他事务读取和修改数据。3.意向锁优化锁效率。4.记录锁锁定索引记录。5.间隙锁锁定索引记录间隙。6.下一个键锁是记录锁和间隙锁的组合,确保数据一致性。

MySQL查询性能不佳的原因主要包括没有使用索引、查询优化器选择错误的执行计划、表设计不合理、数据量过大和锁竞争。 1.没有索引导致查询缓慢,添加索引后可显着提升性能。 2.使用EXPLAIN命令可以分析查询计划,找出优化器错误。 3.重构表结构和优化JOIN条件可改善表设计问题。 4.数据量大时,采用分区和分表策略。 5.高并发环境下,优化事务和锁策略可减少锁竞争。

在数据库优化中,应根据查询需求选择索引策略:1.当查询涉及多个列且条件顺序固定时,使用复合索引;2.当查询涉及多个列但条件顺序不固定时,使用多个单列索引。复合索引适用于优化多列查询,单列索引则适合单列查询。

要优化MySQL慢查询,需使用slowquerylog和performance_schema:1.启用slowquerylog并设置阈值,记录慢查询;2.利用performance_schema分析查询执行细节,找出性能瓶颈并优化。

MySQL和SQL是开发者必备技能。1.MySQL是开源的关系型数据库管理系统,SQL是用于管理和操作数据库的标准语言。2.MySQL通过高效的数据存储和检索功能支持多种存储引擎,SQL通过简单语句完成复杂数据操作。3.使用示例包括基本查询和高级查询,如按条件过滤和排序。4.常见错误包括语法错误和性能问题,可通过检查SQL语句和使用EXPLAIN命令优化。5.性能优化技巧包括使用索引、避免全表扫描、优化JOIN操作和提升代码可读性。


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

Atom编辑器mac版下载
最流行的的开源编辑器

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3 Linux新版
SublimeText3 Linux最新版

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能