HBase架构简析
一、HBase架构简介
HBase架构图1、StoreFile
HBase数据的存储单元,底层使用HDFS存储。数据按照Cell(RowKey、Column Family、Column)排列,相同Cell按照timestamp倒序排列
2、HStore
对应一个Table在一个HRegion中的一个Column Family
3、HRegion
对应一个Table的一个Region在一个HRegionServer中的表达
HBase使用RowKey将表水平切割为多个Region
4、HRegionServer
用于存放和管理本地HRegion;
HBase在启动时由HMaster将HRegion分配给HRegionServer管理;
Client直接连接HRegionServer读写数据;
5、WAL
Write Ahead Log。它是HDFS上的文件,所有写操作都会先保证将数据写入WAL文件,防止HRegionServer宕机时MemStore中的数据丢失;
WAL以table + rowkey的方式记录一条条数据操作记录;
6、HMaster
管理HRegionServer,管理和分配HRegion给HRegionServer以实现负载均衡功能;
admin功能:table的DDL操作;
7、Zookeeper
协调系统,存放整个HBase集群的元数据和集群状态信息;
存放了hbase:meta文件所在位置,Client通过该文件定位table:rowkey所属Region及Region所在的RegionServer;
二、数据切分
HBase将Table按照RowKey的范围切分为多个Region,对应RowKey的数据被划分到对应的Region存储;
Region底层使用HDFS存储,在HBase启动时被分配给某一个HRegionServer管理;
总结:
- 一个Table对应多个Region
- 一条RowKey数据只存在于一个Region中
- 一个Region同时只被一个HRegionServer管理
- 一个HRegionServer管理多个Region,这些Region可以属于不同的Table
三、集群容灾
1、HFile存储容灾
- HFile底层基于HDFS存储,HDFS的3个DataNode备份数据的方式保证数据分布式存储不丢失;
- 当HDFS某个DataNode挂掉时,由HStore内置的HDFS客户端自动感知并切换到备份DataNode读写,切换过程对上层透明;
2、HRegionServer服务容灾
- HBase启动时,HMaster分配HRegion给HRegionServer管理;
- 某台HRegionServer服务不可用时,HMaster通过zk感知,并将对应收到影响的* HRegion列表分配给其他HRegionServer管理;
- 其他HRegionServer通过读取WAL重建HRegion中table:rowkey的对应数据,重建完成后对外提供HRegion的读写服务;
- 重建过程中,对应HRegion所属的数据服务不可用;
3、HMaster服务容灾
- HMaster一般部署2台服务,通过zk完成热备;
- 同时只有一台HMaster提供服务,当主HMaster服务宕机时,备HMaster立即通过zk感知并提供服务;
四、数据读写过程
1、数据的写入
- client发起某table:rowkey数据的Put操作
- client从Zookeeper获取hbase:meta文件所在的HRegionServer节点
- client查询hbase:meta获取table:rowkey对应的HRegion,以及HRegion所在的HRegionServer,并缓存信息到本地
- client直接发送put()请求给HRegionServer
- HRegionServer将对应table:rowkey的put请求记录在WAL中
- HRegionServer将对应table:rowkey的put请求数据写入HRegion对应的MemStore中
- HRegionServer返回响应给client,put()操作完成
- MemStore中的数据会在特定条件下持久化到HFile中,WAL文件也会定期roller精简
2、数据的读取
寻找Region的过程类似,略
五、HBase特性
1、CP系统(强一致性+分区容错性)
- 每个RowKey的值只出现在一个Region
- 同一时间一个Region只分配给一个HRegionServer
- 行内的mutation操作都是原子的
- 单个RowKey的put操作要么成功,要么完全失败
当某台RegionServer fail的时候,它管理的Region failover到其他RegionServer时,需要根据WAL来redo(redolog,有一种日志文件叫做重做日志文件),这时候进行redo的Region是unavailable的;所以hbase降低了可用性,提高了一致性。
设想一下,如果redo的region能够响应请求,那么可用性提高了,则必然返回不一致的数据(因为redo可能还没完成),那么hbase就是降低一致性来提高可用性了。
2、顺序磁盘IO
MemStore中的数据Cell是按照RowKey + Column Family + Column排序的,所以持久化到HFile的过程是顺序磁盘IO。数据一旦刷入HFile中就是持久化不可变的。