Hbase的存储机制

Hbase的存储机制

Hbase在存储时各个组件的工作

HMaster

Hmaster在启动时会将region分配到具体的Hregionserver上,当region因为不断的写入数据变得过大到达阈值时,
Hmaster会分割Region为两个新的Region并重新分配regionserver上,以尽可能保障每个regionserver的负载均衡。因为读写数据与master没有关系所以master宕机hbase还可正常的工作一段时间

regionserver

regionsever上管理多个master分配的region,我们读写数据是通过regionsever来进行的。在进行读写操作采用的WAL的方式。在执行前先将操作写入Hlog中,这样就算是写数据时出现问题也可以通过日志回滚来保障数据的安全。写入日志后会数据放在基于内存的Memstore中,只有等到一定数据量时才会flush到最终存储的HFile内。
每个region相当于一个数据分片,每个region都有起使的rowkey和结束的rowkey,标识着她的存储范围

region

region是表或者表的一部分
每个region中有多个store,一个store对应着一个列簇的数据,store内部有一个Memstore(内存的存储对象大小为128M),和一个Hfile(具体的hdfs的存储文件)

store

1.Memstore
每个store有一个Memstore实例,数据再写入WAL之后,就会被放入MenStore。Memstore是内存的存储对象,当memstore满了会将数据fushdaoHfile中
2.Hfile
memstore满了,Hbase会在hdfs上生成一个新的Hfile,然后将Memstore的内容写入HFile中,因此Hfile会随着数据的增减而有多个

Memstore

当数据写入WAL后就会被放入,Memstore中。然后随着大小的增加到一定的阈值(Hbase可以使用的内存的0.4)就会被写入hdfs上,以Hfile的形式持久化

因为Hbase是将文件存储在hdfs上的,hdfs只允许对文件追加,不能修改,对于一个数据库来说数据有序是非常重要的,是性能的保障,提高读取效率,所以因该先将数据写入内存,在内存中整理为有序的数据,再写入磁盘。
在读取时会将先读取BlockCache,读取不到从才会读HFIle+Memstore
2.一些临时数据可以不用写入hdfs上,可以提高hbase的效率

HFile

HFile是数据存储的实际的载体,Hfile和StoreFile,storefile是是Hfile的抽象类,hbase是基于java的,所有的物体都有一个对象与之对应,物理存储上我们管StoreFile刷写而成得文件叫HFile,StoreFile是HFile得抽象类而已。
在storefile的实例中,数据是由一个一个的数据块组成的,hbase中的一个块大小默认是64kb,由列簇上的blocksize属性来定义,内部存储的是kv对默认大小是64kb

. 增删改查的真正面目

Hbase是一个可以随机读写的数据,而它是基于HDFS的,HDFS的特点是只能新增,要么整个删除,不能修改。那么HDFS是如何实现我们的增删改查的呢。实际上Hbase几乎总是在做新增操作。

  • 新增单元格数据时,在HDFS上新增一条记录
  • 修改一个单元格时,也是新增一条记录,只是版本号比之前大了。
  • 删除时,还是新增一条记录,只不过没有value值,类型为DELETE。

为了提高性能,Hbase没间隔一段时间或者文件大小达到阀值后,都会进行一次合并,合并的对象就是HFile文件。当合并成一个HFile时,会忽略掉DELETE类型的记录,从而达到了删除的目的,并对剩下的数据做排序和版本合并。形成一个大的HFile,当Hfile的大小达到需要切分的阀值时,会等分为两个HFile。。

你可能感兴趣的:(hbase)