HRegion是HBase中的基本存储单元,负责存储一部分行键(Row Key)对应的数据。HRegion内部由多个HStore组成,每个HStore存储一部分列族(Column Family)的数据。HRegion支持自动分区,即当HRegion的大小达到阈值时,会自动拆分成多个新的HRegion。
- HBase中的一个表,刚创建时,只有一个HRegion,随着数据量递增,达到阈值20G时,等分成两个HRegion,分布在不同的HRegionServer结点上。
- 阈值由属性hbase.hregion.max.filesize指定,默认10G
- 一个HRegion由N个Store(HStore,N>=1)构成
- 一个Store对应一个列族,有一个MemoryStore和多个StoreFile组成
MemStore是一个写缓存(In Memory Sorted Buffer),所有数据在写完WAL日志后,会写入MemStore中。
MemStore数据达到阈值,由MemStore根据一定的算法(LSM-TREE算法,这个算法的作用是将数据顺序写入磁盘,而不是随机写,减少磁头调度时间,从而提高写入性能)将数据Flush到底层的HDFS文件中(HFile)。
HFile(StoreFile) 用于存储HBase的数据(Cell/KeyValue)。在HFile中的数据是按RowKey、Column Family、Column排序,对于相同的Cell(即这三个值都一样),则按timestamp倒序排列(即最新的数据在最前面)
HBase数据库是怎样存储数据的
HBase分布式数据库最重要的就是存储数据,下面,从四个方面详细介绍HBase的物理存储。
1.HBase表的数据按照行键RowKey的字典序进行排列,并且切分多个HRegion存储,存储方式如图1所示。
图1 Region在行方向上的存储
2.每个Region存储的数据是有限的,如果当Region增大到一个阀值(128)时,会被等分切成两个新的Region,切分方式如图2所示。
图2 HRegion的切分
3.一个HRegion Server上可以存储多个Region,但是每个Region只能被分布到一个HRegion Server上,分布方式如图3所示。
图3 HRegion的分布
4.MemStore中存储的是用户写入的数据,一旦MemStore存储达到阈值时,里面存储的数据就会被刷新到新生成的StoreFile中(底层是HFile),该文件是以HFile的格式存储到HDFS上,具体如图4所示。
图4 HBase表的存储
总结一下
Table在行的方向上分割为多个HRegion,HRegion是HBase中分布式存储和负载均衡的最小单元,即不同的HRegion可以分别在不同的HRegionServer上,但同一个HRegion是不会拆分到多个HRegionServer上的。HRegion按大小分割,每个表一般只有一个HRegion,随着数据不断插入表,HRegion不断增大,当HRegion的某个列簇达到一个阀值(默认256M)时就会分成两个新的HRegion。
①、在Hbase中,会将一个表从行键方向上进行切分,切分成1个或者多个HRegion
②、切分之后,每一个HRegion都会交给某一个HRegionServer来进行管理
③、一个表至少会包含一个HRegion,可以包含多个HRgion
④、在HBase中,行键是有序的,因此从行键方向上来进行切分,所以HRegion之间的数据是不交叉的
⑤、因为HRegionServer会交给HRegionServer来管理,并且HRegion之间的数据相互不交叉,所以保证请求不会集中于某一个节点上而是会分散到不同的节点上
⑥、随着运行时间的推移,HRegion管理的数据会不断增多,达到指定条件的时候,会自动进行分裂
⑦、每一个HRegion包含一个到多个HStore,HStore的数量有列族的数量来决定
⑧、每一个HStore都会包含1个memStore以及包含0到多个StoreFile/HFile