为什么要同时刷新hbase中的所有memstore?

mklgxw1f  于 2021-06-07  发布在  Hbase
关注(0)|答案(1)|浏览(353)

我在这里介绍一些hbase体系结构说明:https://mapr.com/blog/in-depth-look-hbase-architecture/ 看到它说
每个列族有一个memstore;当一个人吃饱了,他们都会脸红。它还保存最后写入的序列号,以便系统知道到目前为止保存的序列号。
我的问题是双重的。
为什么我们要一次冲洗所有的内存?我们就不能把满了的内存冲走吗?假设我们有两个memstore: 1 以及 2 . 如果 1 比我们将来还可以查到的要多 2 在检查磁盘(hfiles)之前 2 他的家人,对吗?
“最后写入的序列号”是什么意思?我试着想象一下刷新memstores是如何发生的,但也许一个直观的例子会有所帮助。假设我有memstore 1 带行键 a , b ,和 d 我把它们冲洗干净。“最后写入的序列号”是什么?

smtd7mpg

smtd7mpg1#

让我们从hbase如何处理写操作开始。在执行对hbase的写入时,它将执行以下操作(简化视图):
附加到wal
fsync沃尔
向memstore应用写操作
每个写操作都用“序列号”标记。这是某种mvcc事务id。引用hbase文档:
给定给每个细胞的一个区域特定的唯一单调递增序列id。它始终存在于memstore中的细胞中,但不会永远保留。
序列号作为写操作的一部分与新的kv一起写入wal。成功写入wal后,hbase将更改应用到 MemStore 并回复客户关于写作成功的信息。从这一点上说,新的kv将继续存在,如果 RegionServer 死了。
因为每次写入都会增加wal的大小,所以hbase应该截断它以减少磁盘使用量。为了完成这项工作,wal必须确保由它的条目描述的更改持久地保存到磁盘(如果服务器崩溃,则不会丢失更新)。为此,wal跟踪上述属于regionserver的每个区域的“最后写入的序列号”(lwsn)。
这些lwsn表示刷新到磁盘的最新写入。所有具有更大 seqnum 仅驻留在memstore中,尚未驻留在磁盘上。wal使用区域lwsn的值来查找“seqnum”小于区域lwsn的条目。这些条目可以从wal中删除,因为它们已刷新到磁盘,并且在服务器崩溃期间不会丢失。
让我们看看hbase如何跟踪lwsn的示例。假设有两列族“a”和“b”。执行200次写入操作:前100次写入“a”,后100次写入“b”与列族“a”相关的操作的序号在[1..100]范围内,而对于“b”,则为[101..201]。假设对“b”的写入的大小更大,导致“b”的memstore刷新,而不是“a”。在此刷新期间,hbase应更新区域的lwsn。将其更新为值201是不正确的,因为使用'seqnum's[1..100]的写入不会持久化(并且不能从wal截断)。
这就是hbase一次刷新所有列族的memstore的原因:如果它只刷新完整的memstore,它将无法更新区域的lwsn,并将延迟wal截断(在崩溃的情况下,这可能会导致长时间的服务器修复)。

相关问题