HBase
HBase 工作机制及读写流程
前言
本篇博客,为大家梳理 HBase 工作机制及读写流程。HBase 工作机制涉及 Master 工作机制和RegionServer 工作机制;读写流程涉及Region split分裂机制和compact 合并机制。过程难免枯燥乏味,但结果却很充实。
HBase 工作机制
HBase 工作机制涉及 Master 工作机制和RegionServer 工作机制。
Master工作机制
Master 的工作机制也分为上线和下线两种。
Master 上线
HBase集群中可以设置多个Hmaster,真正对外提供服务的只有一个。这是HBase集群 Master 上线 的前提条件。
HBase 高可用集群多个Hmaster设置步骤如下:
- 关闭 hbase: stop-hbase.sh
- 在conf目录下创建backup-masters文件:写入本机的hostname
- 将backup-masters文件拷贝至其他节点同目录
- 不要在非主机上启动hbase: start-hbase.sh
配置成功结果如下:
Master启动进行以下步骤:
-
从zookeeper上获取唯一 一个首先获得 active master的排他锁,用来阻止其它master成为真正的Master。
-
扫描zookeeper上的/hbase/rs节点,通过zookeeper集群协调监督的特性(主要通过心跳包机制)获得当前可用的region server列表。
-
Master和每个region server通信,获得当前已分配的region和region server的对应关系。
-
Master扫描META表,计算得到当前还未分配的region,将他们放入待分配region列表。
从 Master 的上线过程可以看到,Master 保存的信息全是可以冗余的信息(都可以从系统其它地方(WAL)收集或者计算得到)。因此,一般 HBase 集群中总是有一个 Master 在提供服务,还有一个以上的 Master 在等待时机抢占它的位置。
Master下线
master只维护表和region的元数据,不参与表数据IO的过程,所以master下线短时间内对整个hbase集群几乎没有影响。表的数据读写还可以正常进行。
Hmaster下线后的影响有无法创建删除表,无法修改表的schema,无法进行region的负载均衡,无法处理region 上下线,无法进行region的合并(region的split可以正常进行,它只有 RegionServer 参与)。
当Master下线后,启动Zookeeper的选举机制,选出新的Master,新的Master上线,执行上线流程。
RegionServer 工作机制
RegionServer 工作机制的前提条件是 Master 使用 ZooKeeper集群 来跟踪 RegionServer 状态。
Region 管理
任何时刻,一个Region只能分配给一个RegionServer。具体如下:
- Master记录了当前有哪些可用的RegionServer。以及当前哪些Region分配给了哪些RegionServer,哪些Region还没有分配。
- 当需要分配的新的Region,并且有一个RegionServer上有可用空间时,Master就给这个RegionServer发送一个装载请求,把Region分配给这个RegionServer。
- RegionServer得到请求后,就开始对此Region提供服务。
region server上线
当某个 RegionServer 启动时,会首先在 ZooKeeper 上的 server 目录下创建一个代表自己的临时 ZNode,相当于抢占了server文件的独占锁。由于 Master 订阅了 server 目录下的变更消息(Watcher),当 server 目录下的文件出现新增或删除操作时,Master 可以得到来自 ZooKeeper 的实时通知,并将实时信息和操作记录到HLog文件中。因此一旦 RegionServer 上线,Master 就能马上得到消息。
region server下线
当 RegionServer 下线时,它和 ZooKeeper 的会话就会断开,ZooKeeper 会自动删除代表这台 RegionServer 的 ZNode,意味着该台 RegionServer 自动释放了 server 文件的独占锁(ZNode),也就是说Master 就可以确定这台 RegionServer 节点挂了。
无论出现哪种情况,RegionServer 都无法继续为它的 Region 提供服务了,此时,ZooKeeper 会将该台节点的变化信息反馈给Master,Master收到反馈, 就会将这台 RegionServer 上的未完成的 Region 任务分配给其它还活着的 RegionServer。
HBase 读写流程
HBase 读流程
HBase meta表
meta表存储了所有用户HRegion的位置信息,meta表内记录一行数据是用户表一个region的start key 到endkey的范围。meta表存储在一个zookeeper 知道的一个regionserver里。
HBase meta表 是HBase 读流程 寻址的关键所在。具体步骤如下图所示:
如上图HBase meta 寻址的过程一致,HBase 读流程具体步骤如下:
-
客户端通过 ZooKeeper 以及META表找到目标数据所在的 RegionServer(就是数据所在的 RegionServer 的主机地址);
-
客户端发生查询请求:联系 RegionServer 查询目标数据,然后 RegionServer 定位到目标数据所在的 Region,将信息反馈给RegionServer ;
-
客户端直接读取装载目标数据的 RegionServer读取 Region的结果数据。
此外, RegionServer 查询目标数据,会因为相同的cell(RowKey/ColumnFamily/Column相同)可能存在3个不同的位置,即Block Cache,MemStore,HFile中读取目标数据。具体如下图所示:
总结如下:
- 从Block Cache中读取
- 从MemStore中读取
- 从多个HFile中读取,用Bloom Filter筛掉明显不存在所需数据的HFile,Index用于