About this Document

Apache HBase(TM)不是兼容ACID的数据库. 但是,它确实保证了某些特定的属性.

该规范列举了HBase的ACID属性.

Definitions

为了通用词汇,我们定义以下术语:

Atomicity
如果操作完全完成或根本不完成,则它是原子操作
Consistency
所有操作都会导致表从一种有效状态直接转换为另一种有效状态(例如,更新期间行不会消失,等等)
Isolation
如果操作似乎独立于任何其他并发事务完成,则将隔离该操作
Durability
向客户端报告"成功"的任何更新都不会丢失
Visibility
如果任何后续读取将更新视为已提交,则认为更新是可见的

and are used as specified by RFC 2119. In short, the word "must" implies that, if some case exists where the statement is not true, it is a bug. 术语" 和" 按照RFC 2119的规定使用.简而言之,"必须"一词表示,如果在某些情况下该语句不正确,则它是一个bug. "可能"一词表示即使在当前版本中提供了保证,用户也不应依赖它.

APIs to consider

  • 读取API
    • 得到
    • 扫描
  • 编写API
    • put
    • 批处理
    • delete
  • 组合(读-修改-写)API
    • incrementColumnValue
    • checkAndPut

Guarantees Provided

Atomicity

  1. 所有突变都是连续的原子. 任何认沽权将完全成功或完全失败.[3]
    1. 返回"成功"代码的操作已完全成功.
    2. 返回"失败"代码的操作已完全失败.
    3. 超时操作可能成功,也可能失败. 但是,它不会部分成功或失败.
  2. 即使突变在一行中跨越多个列族也是如此.
  3. 变异多行的API不会在多行中具有原子性. 例如,对行" a"," b"和" c"进行操作的多输入可能会使部分但并非全部行发生突变而返回. 在这种情况下,这些API将返回成功代码列表,如上所述,每个成功代码都可能成功,失败或超时.
  4. checkAndPut API原子地发生,就像在许多硬件体系结构中发现的典型compareAndSet(CAS)操作一样.
  5. 每一行的突变顺序都以明确定义的顺序发生,没有交错. be something like "a=1,b=2,c=1". 例如,如果一个作者发布了突变" a = 1,b = 1,c = 1",而另一个作者发布了突变" a = 2,b = 2,c = 2",则该行必须为" a = 1,b = 1,c = 1"或" a = 2,b = 2,c = 2",并且类似于" a = 1,b = 2,c = 1".
    1. 请注意,对于多行批量突变,这不是正确的"跨行".

Consistency and Isolation

  1. 通过任何访问API返回的所有行都将包含一个完整的行,该行存在于表历史记录中的某个时刻.
  2. 跨列族也是如此-即,获得与某些突变1,2,3,4,5同时发生的完整行将返回完整行,该完整行存在于某些突变i和i + 1之间的某个时间点我在1到5之间.
  3. 行的状态只会在编辑历史中向前移动.

Consistency of Scans

扫描不是表的一致视图. . 扫描不显示 .

扫描具有以下属性:

  1. 扫描返回的任何行都将是一致的视图(即完整行的版本在某个时间点存在)[1]
  2. the beginning of the scan. 扫描将始终反映出与扫描开始时的数据视图. 这满足了下面列举的可见性保证.
    1. 例如,如果客户端A写入数据X,然后通过边信道与客户端B通信,则客户端B启动的任何扫描都将包含至少与X一样新的数据.
    2. 扫描必须反映出在构造扫描仪之前发生的所有突变,并且可能反映出在构造扫描仪之后犯下的某些突变.
    3. 扫描必须包括在扫描之前写入的数据(除非随后对数据进行了突变,在这种情况下,它可能反映了突变)

那些熟悉关系数据库的人会将这种隔离级别识别为"读取已提交".

请注意,上面列出的有关扫描程序一致性的保证是指"事务提交时间",而不是每个单元格的"时间戳"字段. may see edits with a timestamp value greater than , if those edits were committed with a "forward dated" timestamp before the scanner was constructed. 也就是说,如果在时刻启动的扫描仪在构造扫描仪之前以"转发日期"时间戳进行提交,则该编辑可能会看到时间戳值大于编辑.

Visibility

  1. 当客户收到任何突变的"成功"响应时,该突变立即对该客户以及随后与客户通过副渠道进行通信的任何客户可见. [3]
  2. 行绝不能显示所谓的"时间旅行"属性. 也就是说,如果一系列突变在一系列状态中顺序移动一行,那么任何并行读取序列都将返回这些状态的子序列.
    1. 例如,如果使用" incrementColumnValue" API对行的单元格进行了突变,则客户端必须永远不会看到任何单元格减小的值.
    2. 无论使用哪种读取API来读取突变,都是如此.
  3. 已保证返回到读取操作的单元的任何版本都可以持久存储.

Durability

  1. 所有可见数据也是持久数据. 也就是说,读取将永远不会返回磁盘上未持久化的数据[2].
  2. 任何返回"成功"代码的操作(例如,不引发异常)将被设为持久性.[3]
  3. 返回"失败"代码的任何操作都不会变得持久(受上述原子性保证的约束)
  4. 所有合理的故障情况均不会影响本文档的任何保证.

Tunability

以上所有保证都必须在Apache HBase中实现. 对于想要权衡性能保证的用户,HBase可以提供几个调整选项. 例如:

  • 可以在每次读取的基础上调整可见性,以允许过时的读取或时间旅行.
  • 耐久性可以调整为仅定期将数据刷新到磁盘

More Information

有关更多信息,请参阅《 Apache HBase参考指南》中的客户端架构数据模型部分.

Footnotes

[1]不能保证一致的视图进行行内扫描-即在一个RPC中获取行的一部分,然后返回以在后续RPC中获取行的另一部分. 当您设置每个Scan#next返回多少值的限制时,将发生行内扫描(请参见Scan#setBatch(int) ).

[2]在Apache HBase的上下文中,"持久地在磁盘上"意味着对事务日志进行hflush()调用. 这实际上并不意味着将fsync()应用于磁性介质,而仅仅是将数据写入了日志的所有副本上的OS缓存中. 在整个数据中心断电的情况下,编辑可能不是真正持久的.

[3]认沽期权将完全成功或全部失败,前提是它们实际上已发送到RegionServer. 如果使用了写缓冲区,则在写缓冲区被填充或显式刷新之前,将不会发送Puts.


by  ICOPY.SITE