首页  >  文章  >  数据库  >  (timestamp-) HBase中的一致备份

(timestamp-) HBase中的一致备份

WBOY
WBOY原创
2016-06-07 16:28:13966浏览

HBase 中的一致性备份这个主题时不时就会出现。在本文中,我将概述一个提供时间戳一致备份的方案。 HBase 中可以实现一致的备份。 “一致”是指“截至

一致” HBase 中的一致性备份这个主题时不时就会出现。
在本文中,我将概述一个确实提供时间戳一致性备份的方案。

HBase 中可以实现一致的备份。我所说的“一致”是指“与特定时间戳一致”(这受到 HBase 时间戳粒度的限制。)

在过去的几个月里,我为 HBase 做出了各种更改,现在希望这些更改能够带来完整的结果“记录系统”类型数据保留的更连贯的故事。

基本设置很简单。您需要
  • HBASE-4071(0.92 - 适用于MIN_VERSIONS)
  • HBASE-4536(0.94 - 保留已删除的单元格和原始扫描)
  • HBASE-4682 (0.94 - 删除导出中的单元格)
(HBase 0.94 一旦发布就会拥有所有相关补丁 - 现在应该是任何时间)

HBase 的内置导出工具可以用于生成一致的快照。

通常,导出作业收集的数据会在执行作业所需的时间间隔内“模糊”;导出扫描会在它碰巧到达时看到一行(准确地说是行的单元格),并且在导出运行时行可能会发生变化。

这是有问题的,因为它不可能从以这种方式生成的导出中重新创建一致的数据库视图。

技巧是将所有数据保留在 HBase 中足够长的时间以便备份作业完成,并且仅收集信息在导出作业开始时间之前

假设备份不超过 T 即可完成(是的,很难提前知道导出将运行多长时间)。在这种情况下,表的列族可以设置如下:
  • 将 TTL 设置为 T 一些余量(所以也许 2T 是安全的)
  • 将 VERSIONS 设置为一个非常大的数字, (例如 max int = 2147483647,即不会因版本而从 HBase 中驱逐任何内容)
  • 将 MIN_VERSIONS 设置为您想要保留的版本数,否则如果 TTL 过期,所有版本都可能被删除
  • 将 KEEP_DELETED_CELLS 设置为 true(这可确保删除的单元格和删除标记被保留,直到它们在 TTL 到期之前)
在 shell 中(将 TTL 设置为两个小时):

创建、{NAME=>、VERSIONS=>2147483647、TTL=>7200、MIN_VERSIONS=>1、KEEP_DELETED_CELLS=>true}


导出现在可以使用如下:
  • 将版本设置为 2147483647(即所有版本)
  • 将 startTime 设置为 -2147483648(最小整数,即一切都是保证包含)
  • 将 endTime 设置为导出的开始时间(即导出开始的当前时间。这是关键部分)
  • 启用对已删除单元的支持

hbase org.apache.hadoop.hbase.mapreduce.Export
-D hbase.mapreduce.include.deleted.rows=true
;
2147483647 -2147483648


只要导出在 2T 内完成,就会创建截至导出开始时一致的快照。否则,某些数据可能会丢失,因为在导出有机会看到它之前,这些数据可能已被压缩。

由于备份还复制了已删除的行并删除了标记,因此可以将备份恢复到 HBase 实例使用时间范围进行查询(请参阅扫描)以在任意时间检索数据的状态。

导出当前仅限于单个表,但如果实时集群中有足够的存储空间,则可以扩展到多个表表导出,只需将所有导出作业的结束时间设置为第一个作业的开始时间即可。


同样的技巧也可以用于增量备份。在这种情况下,TTL 必须足够大,以覆盖增量备份之间的间隔。
例如,如果增量备份频率是每天,则上述 TTL 可以设置为 2 天(TTL=>172800)。然后再次使用Export:

hbase org.apache.hadoop.hbase.mapreduce.Export
-D hbase.mapreduce.include.deleted.rows=true
;
2147483647 <现在在MS>


较长的 TTL 保证不会有增量备份未覆盖的间隙。

示例:
  1. A Put (p1 ) 发生在 T1
  2. 完全备份在 T2 开始,时间间隔 [0, T2)
  3. 另一个 Put (p2) 在 T3
  4. 完全备份作业完成
  5. 删除发生在 T4
  6. 增量备份在 T5 开始,时间间隔 [T2, T5)
  7. 另一个 Put (p3)
  8. 增量备份完成
请注意,在这种情况下,备份作业何时完成并不重要。

完整备份仅包含p1。增量备份包含p2和Delete。 p3 尚未包含在任何备份中。
T2 (p1) 和 T5 (p1p2 时的状态、删除)可以直接恢复。一旦两个备份都恢复到同一个 HBase 实例中(您需要 HBASE-4536 才能与删除正确配合使用),也可以使用时间范围扫描或获取截至 T4 和 T3 的状态进行检索。

最后,如果在实时 HBase 集群中保留足够的数据来覆盖两次增量备份之间的时间对您的组织来说是个问题,那么还可以存档 HBase 的预写日志 (WAL),然后使用内置的 WALPlayer (HBASE- 5604),但那是另一篇文章的事了。
声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn