负责启动的时候分配Region到具体的RegionServer,执行各种管理操作,如:Region的分割与合并、创建表、修改列族配置等操作。
存在一个或多个Region,所有的数据是存储在Region上的。Region所有数据存取都是调用HDFS的客户端实现的。
表的一部分数据。HBase是一个会自动分片的数据库。一个Region就相当于关系型数据库中分区表的一个分区。
HBase并不直接跟服务器的硬盘交互,而是跟HDFS交互,HDFS是真正承载数据的载体。
HBase中组件的高可用是基于ZooKeeper实现,以及元数据一般都是存储在ZooKeeper上的。
一个RegionServer会存在一个或多个Region。
Region相当于一个数据分片,每个Region都有起始rowkey和结束rowkey,代表它所存储的Row范围。
WAL(Write-Ahead Log),当操作到达Region的时候,HBase会先将操作写入WAL中
,在把数据放到基于内存实现的MemStore
中,等到数据达到一定的数量时才刷写(flush)到最终存储的HFile中。当遇到故障的时候可以根据WAL恢复数据。
操作类型有:Put、Append、Increment、Delete。当操作到达时会立即被写入WAL中,写入调用的是HDFS客户端接口写入HDFS的。
WAL模式默认是开启的,可以通过调用下列语句关闭WAL。
Meutaion.setDurability(Durability.SKIP_WAL);
还可以关闭/开启指定操作类型的WAL。这样虽然可以让数据操作更快一点,当服务器宕机时,会导致数据丢失。
通过异步写入WAL,可以让数据操作更快一点,但是也会导致部分数据丢失。
WAL异步写入,调用方法
Meutaion.setDurability(Durability.ASYNC_WAL);
WAL是一个环状的滚动日志结构,因为这种结构可以写入效果最高,而且可以保证空间不会持续变大。
WAL的检查间隔由hbase.regionserver.logroll.period定义,默认值1小时。检查的内容是把当前WAL中的操作跟实际持久化到HDFS上的操作比较,看哪些操作已经别持久化了,被持久化的操作就会被移动到.oldlogs文件夹内(也存储在HDFS上)。
一个WAL实例包含多个WAL文件。WAL文件的最大数量通过hbase.regionserver.maxlogs定义,默认值32。
触发滚动的条件:
hbase.regionserver.hlog.blocksize * hbase.regionserver.logroll.multiplier
。hbase.regionserver.hlog.blocksize:存储系统块(Block)大小,一般是HDFS的块大小即可,不设定HBase会自己去尝试获取这个参数的值。
hbase.regionserver.logroll.multiplier:默认0.95,如果WAL文件所占空间大于或等于95%的块大小,则这个WAL文件就会被归档到.oldlogs文件夹中。
WAL文件被创建出来后会被放在/hbase/.log下,一旦WAL文件被归档,则会被移动到/hbase/.oldlogs文件夹下。
Master会负责定期地清理.oldlogs文件夹,条件是”当这个WAL不需要作为用来恢复数据的备份“时候。判断条件是”没有任何引用指向这个WAL文件“,才会被系统彻底删除。
一个Region可能包含多个Store实例。一个Store对应一个列族的数据,Store内部含有MemStore和HFile这两个组件。
每个Store只有一个MemStore实例,多个HFile实例。当MemStore满了之后HBase就会在HDFS上生成一个新的HFile,然后把MemStore中的内容写到HFile中。
数据被写入WAL之后就会被加载到MemStore中,当MemStore的大小增加到超过一定阀值的时候就会被刷写到HDFS上,以HFile形式被持久化起来。
设计MemStore的原因有以下几点
HFile是数据存储的实际载体,创建的所有标、列等数据都存储在HFile里面。
HFile是由一个一个的块组成的。在HBase中一个块的大小默认是64KB,由列族上的BLOCKSIZE属性定义。
Data数据块的第一位存储的是块的elixir,后面存储多个Cell(KeyValue键值对)。
因HBase是持久化到HDFS的,所有不支持修改。
通过Minor Compaction 和 Major Compaction合并实现删除数据