HBase与HDFS之间的WAL(HLog)存储机制答疑解惑

HBase与HDFS之间的WAL(HLog)存储机制答疑解惑,第1张

HBase与HDFS之间的WAL(HLog)存储机制答疑解惑

解答疑问一:

单机模式的Hbase应该是默认把数据存在本机硬盘中,直接对接的是本机的文件系统对吧?没有用到HDFS吧?单机模式要对接HDFS应该要主动配置HDFS的对吧?

作为hbase无论单机也好,集群也好,它都内置了hdfs客户端,如果在hbase配置了hdfs集群地址它就依赖,数据存储到hdfs;配置了本地目录,它就不依赖hdfs,直接存储到本地磁盘。

解答疑问二:

Hbase 的 Hlog (WAL)问题,每次 Hbase 的客户端的一个写 *** 作,都会产生一条 Hlog 记录是吗?

WAL的原子格式为,Hbase的事务为行级写入,每增加一个写 *** 作(包括一行多列更新),Hlog中就产生一条。HLogKey中的log sequence number作为WAL中一次 *** 作的唯一标识符。

此时产生的 Hlog 是攒够一定体积(64KB之类的),在一次性发送到 HDFS 存储吗? 如果是的话,那这些 Hlog 存在哪里呢? 是存在 Hbase 进程的用户态内存?

问题中也列出了Hbase HLog持久化等级的几种策略:SKIP_WAL、ASYNC_WAL、SYNC_WAL、FSYNC_WAL,我们只谈默认策略:SYNC_WAL。

Hbase写入流程:

  • 第一线程会启动MVCC事务、争夺行锁、写MemeStore缓存、追加本地Log队列缓存、释放行锁、休眠。

  • 第二线程会将本地Log队列缓存写入HDFS,但是缓存在HDFS DataNode尚未落盘。

  • 第三线程Sync HDFS,实现DataNode落盘,并唤醒第一线程。

  • 第一线程结束MVCC事务,并推进可读点,客户端才可以访问写入的此条记录。

因此写入WAL的记录会先存在Hbase HRegionServer本机的内存缓冲队列、其次存在HDFS DataNode缓冲区,最后才会在HDFS落盘。基于HDFS存储的模式,Hlog肯定是存在HDFS之上。

可是这样的话 Hbase 这个软件宕机了(假设承载 Hbase 的 Server 不宕机,只是 Hbase 这个软件崩了,可能是被 kill -9 了或者自己的 Bug 把自己搞死了) ,Hlog 不就没了吗?这不完犊子吗? 或者是先存到本机的硬盘上?即发往 HDFS 前先通过本机的文件系统存在本机的硬盘中防丢?

Hbase宕机后,缓冲区的记录存在丢失情况,但是基于强一致性要求和行级事务保证,这个过程MVCC事务并为结束,客户端会回馈写入失败,由客户端解决数据写入失败后的处理方式。

Hbase并未在本地磁盘做WAL的二次存储,而是利用本地内存的缓冲队列提升批量写入分布式文件系统性能,由于WAL已经接入HDFS的目的就是满足高可靠性,因此没必要再做一层本地磁盘副本增加可靠性保证,有些框架例如Cassandra、InfluxDB会有hint off机制,在本地保存一份数据,主要是满足其他副本节点故障的高可用性。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5679275.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存