【问题标题】:How does HBase guarantee row level atomicity?HBase 如何保证行级原子性?
【发布时间】:2011-07-31 09:08:26
【问题描述】:

考虑到 HBase 将每个列族存储在单独的 HFile 中以及一行可以跨越多个列族的事实。 HBase 如何确保跨多个列族的行上的 put/delete 操作确实是原子的?

【问题讨论】:

  • 据我所知,对于任何行操作(如Put/Delete/checkAndPut),操作顺序是append -> sync -> memstore。每个 KeyValue 中还有一个时间戳,您可以在其中存储多个版本的 KeyValue 对在列族中(由列族的版本决定)。您还可以使用 RowLock 来确保操作完全安全。

标签: database nosql hadoop hbase distributed-system


【解决方案1】:

对一行的所有写入,无论该行中有多少列族,都转到一个区域服务器,然后该区域服务器将编辑写入区域 WAL (Hlog),然后写入同步,然后将数据添加到 memstore,以便提供服务。然后 - 一旦 memstore 达到其限制 - memstore 将被刷新到磁盘。如果 regionserver 发生任何问题并且它崩溃/死亡/拔掉了插头,则可以运行 WAL 以保持一切一致。更多血腥细节请参阅HBASE-2283Hbase Architecture 101

【讨论】:

  • 感谢您的链接。我实际上对 HBase 如何确保对所有 HFile 的写入(如果为 Put/Delete 调用触及超过 1 个列族,则将涉及多个 HFile)以原子方式发生感兴趣。但就像你提到的,由于仍然可以从 WAL 中检索更新,HBase 可以保证其客户端的原子性。
  • 完全正确 - WAL 用于解决多个 hfile 问题等。
【解决方案2】:

尽管通过同时刷新所有列族来编写多个 HFile,HBase 目前仍实现了行级原子性。当最大的列族达到配置的刷新大小时,将触发刷新。还有一个额外的 MemStore 级时间戳,允许对 MemStore 读取进行多版本并发控制,但对于写入 HFile 的键/值不存在。切换到按列族刷新(提高效率的理想功能)也需要将类似的时间戳添加到文件格式中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 2011-07-28
    相关资源
    最近更新 更多