HBase架构原理
HBase是一个高可靠、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价的PC Server上搭建大规模结构化存储集群。
HBase是Google BigTable的开源实现,与Google BigTable利用GFS作为其文件存储系统类似,HBase利用Hadoop HDFS作为其文件存储系统;
Google运行MapReduce来处理BigTable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据;
Google BigTable利用Chubby作为协同服务,HBase利用Zookeeper作为协同服务。
HClient、HMaster、HRegionSever、HRegion、HLog、Store、MemStore、StoreFile、HFile角色组件
HClient
包含访问的HBase的接口并维护cache来加快对HBase的访问
接口会去meta表查询目标region所在位置(此信息会放入缓存),并连接对应RegionServer进行数据读写。
当master rebalance region时,Client会重新进行查找。
HBase Client通过RPC机制与HMaster和HRegionServer进行通信。
管理类操作:Client---->HMaster
数据读取类操作:Client---->HRegionSrever
Zookeeper
保证任何时候,集群中只有一个master
存储所有Region的寻址入口
实时监控RegionServer的上线和下线信息,并实时通知Master
存储HBase的schema和table元数据
HMaster
- 监控RegionServer
- 处理RegionServer故障转移
- 处理元数据变更
- 处理region的分配或移除
- 空闲时对数据进行负载均衡
- 通过zookeeper发布自己的位置给客户端
HRegionServer
- 负责存储Hbase的实际数据
- 处理分配给它的region
- 刷新缓存到HDFS上
- 维护HLog
- 执行压缩
- 负责处理Region分片
HRegion
HBase自动把表水平划分为多个区域(region,每个region会保存一个表里面的某段连续的数据;每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,region就会等分两个新的region,这个过程也叫裂变。
当table中的行不断增多,就会有越来越多的region。这样一张完整的表就会被保存在多个RegionServer上。
table在行的方向上分隔为多个Region。Region是HBase中分布式存储和负载均衡的最小单元,即不同的region可以分别在不同的Region Server上,但同一个Region是不会拆分到多个server上。
Region按大小分隔,每个表一般是只有一个region。随着数据不断插入表,region不断增大,当region的某个列族达到一个阈值(默认256M)时就会分成两个新的region。
每个region由以下信息标识:
1、< 表名,startRowkey,创建时间>
2、由目录表(-ROOT-和.META.)记录该region的endRowkey
HRegion定位:Region被分配给哪个Region Server是完全动态的,所以需要机制来定位Region具体在哪个region server。
HBase使用三层结构来定位region:
1、 通过zk里的文件/hbase/rs得到-ROOT-表的位置。-ROOT-表只有一个region。
2、通过-ROOT-表查找.META.表的第一个表中相应的region的位置。其实-ROOT-表是.META.表的第一个region;.META.表中的每一个region在-ROOT-表中都是一行记录。
3、通过.META.表找到所要的用户表region的位置。用户表中的每个region在.META.表中都是一行记录。
-ROOT-表永远不会被分隔为多个region,保证了最多需要三次跳转,就能定位到任意的region。client会将查询的位置信息保存缓存起来,缓存不会主动失效,因此如果client上的缓存全部失效,则需要进行6次网络来回,才能定位到正确的region,其中三次用来发现缓存失效,另外三次用来获取位置信息。
table 和region 的关系
table 默认最初只有一个region,随着记录数的不断增加而变大,起初的region会逐渐分裂成多个region,一个region有【startkey,endkey】表示,不同的region会被master分配给相应的regionserver管理
region 是hbase分布式存储和负载均衡的最小单元,不同的region分不到不同的regionserver
注意:region 虽然是分布式存储的最小单元,但并不是存储的最小单元
region 是由一个或者多个store 组成的,每个store就是一个 column family
每个stroe 又由一个memstore 和 1至多个store file组成(memstore 到一个阈值会刷新,写入到storefile,有hlog 来保证数据的安全性,一个 regionserver 有且只有一个hlog)
Store
每一个HRegion由一个或多个Store组成,至少是一个Store,HBase会把一起访问的数据放在一个Store里面,即为每个ColumnFamily建一个Store,如果有几个ColumnFamily,也就有几个Store。一个Store由一个MemStore和0或者多个StoreFile组成。 HBase以Store的大小来判断是否需要切分HRegion。
一个region由多个store组成,一个store对应一个CF(列族)
store包括位于内存中的memstore和位于磁盘的storefile写操作先写入memstore,当memstore中的数据达到某个阈值,hregionserver会启动flashcache进程写入storefile,每次吸入形成单独的一个storefile
当storefile文件的数量增长到一定阈值后,系统会进行合并(minor、major compaction),在合并过程中会进行版本合并和删除工作(majar),形成更大的storefile
当一个region所有的storefile的大小和超过一定阈值后,会把当前的region分割为两个,并有hmaster分配到相应的regionserver服务器,实现负载均衡
客户端检索数据,现在memstore找,找不到再找storefile
MemStore
MemStore 是放在内存里的,保存修改的数据即keyValues。当MemStore的大小达到一个阀值(默认64MB)时,MemStore会被Flush到文件。
即生成一个快照。目前HBase会有一个线程来负责MemStore的Flush操作。
Storefile
MemStore内存中的数据写到文件后就是StoreFile,StoreFile底层是以HFile的格式保存。
HFile
HBase中KeyValue数据的存储格式,是Hadoop的二进制格式文件。 首先HFile文件是不定长的,长度固定的只有其中的两块:Trailer和FileInfo。
Trailer中有指针指向其他数据块的起始点,FileInfo记录了文件的一些meta信息。Data Block是HBase IO的基本单元,为了提高效率,
HRegionServer中有基于LRU的Block Cache机制。每个Data块的大小可以在创建一个Table的时候通过参数指定(默认块大小64KB),
大号的Block有利于顺序Scan,小号的Block利于随机查询。每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成,
HLog
HLog(WAL log):WAL意为write ahead log,用来做灾难恢复使用,HLog记录数据的所有变更,一旦region server 宕机,就可以从log中进行恢复。
参考资料:https://www.cnblogs.com/steven-note/p/7209398.html
https://blog.youkuaiyun.com/lds_include/article/details/88826262
侵权联系删除!!!