HBase如何保证行级原子性?

8

考虑到HBase将每个列族存储在单独的HFile中,而一行可能跨越多个列族。那么,HBase如何确保对跨越多个列族的行进行的put/delete操作确实是原子的?


据我所知,对于任何行操作(例如Put/Delete/checkAndPut),操作顺序为追加->同步->内存存储。此外,每个KeyValue中都有一个时间戳,在其中可以在列族内存储多个版本的KeyValue对(由列族的版本确定)。您还可以使用RowLock来确保操作是完全安全的。 - frail
2个回答

7
所有对于一行的写入,无论这一行有多少列族,都会被发送到一个regionserver上,并且该regionserver将该编辑写入regions WAL(Hlog),然后进行同步写入,接着数据被添加到内存存储器中以便提供服务。当内存存储器达到其上限时,内存存储器中的内容将被刷新到磁盘。如果regionserver发生任何问题并且崩溃/死机/断电,WAL可以通过运行来保持一致性。更多详细信息请参见HBASE-2283Hbase Architecture 101

谢谢提供链接。我实际上对HBase如何确保所有HFiles的写入(如果一个Put/Delete调用涉及多个列族,则会涉及多个HFiles)是原子性的感兴趣。但正如你所提到的,由于该更新仍然可以从WAL中检索,因此HBase可以为其客户端保证原子性。 - arun_suresh
确切地说,WAL 用于解决多个 HFile 问题,以及其他一些问题。 - cftarnas

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接