解答疑问一:
单机模式的Hbase应该是默认把数据存在本机硬盘中,直接对接的是本机的文件系统对吧?没有用到HDFS吧?单机模式要对接HDFS应该要主动配置HDFS的对吧?
作为hbase无论单机也好,集群也好,它都内置了hdfs客户端,如果在hbase配置了hdfs集群地址它就依赖,数据存储到hdfs;配置了本地目录,它就不依赖hdfs,直接存储到本地磁盘。
解答疑问二:
Hbase 的 Hlog (WAL)问题,每次 Hbase 的客户端的一个写操作,都会产生一条 Hlog 记录是吗?
WAL的原子格式为<HLogKey,WALEdit>,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机制,在本地保存一份数据,主要是满足其他副本节点故障的高可用性。