Hbase结构图

hbase结构简介_时间戳

hbase结构简介_时间戳_02

hmaster负责给 regionserver分配region,region处理具体的数据存储和查找,zk是一个注册中心,hmaster通过zk 感知regionserver存活与否。客户端是通过zk取到hmater的位置,然后取到位于namespace下面的mate表里面的region分区信息才能知道对应得rowkey应该去哪里取得。

Hbase的数据是已hfile的形式存在hdfs上

hbase一个列族对应一个store,同一个列族的数据存在存一起的。看下图,hfile里面最小的数据单元不是行,而是cell,相当于一行里面的一个格子。

hbase结构简介_时间戳_03

这个cell的结构大概是这样的
key=rowKey+列族+列+时间戳+操作类型
操作类型指的是添加和删除,和时间戳一起控制版本

key长度+value长度+row长度+rowKey+列族长度+列族+列+时间戳+操作类型+值
  • 1.

hbase结构简介_写数据_04

其实看到这里我们可以知道hbase存的数据和b+tree的行结构不一样,b+tree同一行的数据都是存一起的,hbase,同一列族的数据是在一起的,不同列族是有不同store 管理的存在不同地方。而且hbase是一个cell一个cell的存储数据。

总的来说,一个表的数据通过根据rowKey的字典顺序拆分成不同的region。不同region由不同regionServer管理。同一个region的数据又根据列族分成不同的store。store分成两部分一部分位于内存,叫做memstore,另外一部分位于磁盘。memstore存储的写入但是还有落盘的数据。store里面用hfile的形式存放数据(一个一个小cell),在一个hfile上有存放数据rowkey的最大值和最小值,方便能快速的确认是否有数据。即便rowkey在指定范围,也可以通过布隆过滤器进一步排斥不存在的rowkey。剩下的才会正在在hfile 这块有序存储中查询。

查询流程大概是这样:

rowKey-->定位到region-->去指定regionServer-->根据查询列族去指定列族的store-->根据hfile上面的rowKey范围和hfile上的布隆过滤器确定哪些hfile应该被查找-->在指定几个hfile查询数据。

位于不同region的数据,和同一个region的不同store的数据,甚至不同 hfile 的数据是可以并发查询的。

LSM结构

LSM树(Log-Structured-Merge-Tree)

hbase用的LSM结构,这种结构在写入数据的时候直接写入内存,然后当数据积累到一定大小才或者超过指定,会写入磁盘。为了保证数据的一致性,写入内存前还会写落盘的日志(WAL). WAL 是 write ahead log 的缩写,也就是预写日志。meetable是内存里面的数据,可变而且有序,sstable是硬盘上的数据有序,且不可被修改,如果要修改数据也是通过多条记录合并出来的结果,比如写入1,然后修改成2,实际是3条数据,并且时间戳不同。

第一条:时间1,操作是put,数据1。
第二条:时间2,操作delte,数据空。
第三条:时间3,操作put,数据2。
这三条数据可能可能位于不同的 table上。memtable和sstable 就是 hbase里面的 hfile。

sstable的文件不能修改,但是和按照一定规则合并,合并的时候会删除会删除一些多余的修改记录.比如上面的修改过程只会保留第三条。

读取数据的时候同样要考虑 memtable里面的数据和 sstable里面的数据。因为有版本的存在,所以即便memtable里面有数据,还是要看sstable里面有没有,比如之前存的数据设置时间戳可能是100年以后,这样的话它即便最先添加,也是最新数据。

hbase结构简介_时间戳_05

mysql,es,hbase写日志文件,写缓存对比

几乎所有软件保证数据完整性都是通过一边写数据一边写日志来做到的,写数据因为要维持结构所以比只是追加的日志慢。我们来看看几种软件保持数据完整性的做法差异。

  • mysql的不同点
    mysql和另外两个最大的差异在于写入数据是直接修改的原数据,不是通过追加的方式,所以他的修改是随机写的概率比较高。
  • es和hbase写数据的相同点
    es和hbase都是追加新记录的方式来覆盖老数据,实际老数据还在,写入位置顺序写入的概率比较高。
  • es和hbase写数据的不同点
    hbase有类似es内存bufer的结构,在habase里面叫做memstore,他们都是还没有落盘的数据,但是已经有日志信息保证了他们的完整性。
    es的写buffer的数据是查询不到的,hbase的memstore里面的数据是可以查询到的。
    hbase数据持久化是直接通过网卡写入到hdfs,在regionServer这边是不存在oscache中间状态的。es是内存缓存一部分数据,然后自己写磁盘,有oscahce中间状态存在。加上磁盘状态,数据有三种状态。