Hbase的是主从架构,经过zookeeper来保证高可用服务器
Hbase的存储机构是LSM架构
数据—①—>内存—②—>小文件—③—>大文件负载均衡
①:Hbase采用了WAL预写日志,保证写内存的数据不丢失,载体是Hlog 以后就把写的数据写到内存里 ②:当内存的数据量达到必定的程度后,会将数据写到磁盘中,载体是HFile,而且采用B+树的存储结构 ③:在小文件达到必定的数量后,会触发compact,此时会合并小文件成大文件 (生产环境下大合并会尽可能避开使用高峰)
Client—①—>Zookeeper—②—>HRegionServer1 —③—>HRegionServer2
—④—>MemStore—⑤—>BlockCache—⑥—>StoreFile—⑦—>key-valuejvm
①:从Zookeeper读取meta表位于哪台HRegionServer上 ②:去①获取的HRegionServer中查询meta表 (根据命名空间、表名以及rowkey定位数据所存储的Region以及Region所处的服务器) ③:根据②获取的信息访问目标HRegionServer ④:在目标HRegionServer的目标Region里的MemStore查询 ⑤:若④没找到,则在BlockCache中查询 ⑥:所⑤没找到,则在目标Region里的StoreFile中查找 ⑦:如果⑥找到了,则将数据存储在BlockCache中并根据版本组织key-val返回
Client—①—>Zookeeper—②—>HRegionServer1—③—>HRegionServer2
—④—>HLog—⑤—>MemStore—⑥—>StoreFile分布式
①:从Zookeeper读取meta表位于哪台HRegionServer上 ②:去①获取的HRegionServer中查询meta表 (根据命名空间、表名以及rowkey进行Hash,肯定数据应该存储的Region,而且返回该Region的服务器信息) ③:去②返回的服务器进行数据写入 ④:将写入操做先记录在磁盘HLog中(WAL 存储在HDFS) ⑤:再将实际的数据写到目标Region的目标Store里的MemStore中 ⑥:当MemStore知足条件后刷写磁盘StoreFile(存储在HDFS)并删除HLog ⑦:StoreFile在知足必定条件下进行compact
缘由:
存储在MemStore中的数据变多后,不只持有太多的内存资源,并且对数据恢复也很差,所以会将MemStore中的数据刷写到磁盘文件StoreFile中性能
flush流程优化
刷写的条件分为⑥种,知足任意一种都会触发
① MemStore级别
Region中任意MemStore大小达到上限 hbase.hregion.memstore.flush.size,默认128MB
触发:是单个MemStore刷写仍是该Region中全部的MemStore刷写日志
② Region级别
当Region中全部的MemStore占有资源达到上限code
hbase.hregion.memstore.block.multiplier * hbase.hregion.memstore.flush.size,默认 2* 128M = 256M
③ Server级别
当Region Server上全部Region资源超太低水位阈值
低水位阈值:低水位百分比 * RegionServer分配的MemStore资源
低水位百分比:hbase.regionserver.global.memstore.size.lower.limit
(默认95%)
RegionServer的MemStore资源:hbase.regionserver.global.memstore.size
(默认jvm40%)server
按照占用资源数量从大到小依次flush Region
若是写入速度大于flush速度,致使占用的资源到达RegionServer分配的MemStore资源,会阻塞Region Server的写入直到资源占用小于低水位阈值
④ HLog数量过多
当HLog的数量达到hbase.regionserver.maxlogs
设置的值后,会将最先的HLog对应的Region进行flush,以后删除该HLog
⑤ 按期Flush
默认周期为1小时,确保Memstore不会长时间没有持久化
为避免全部MemStore同时flush致使的问题,按期的flush操做有20000左右的随机延时
⑥ 主动触发
经过命令flush tablename
或者flush regionname
分别对一个表或者一个Region进行flush
问题:
每一次刷写文件都是新的一个StoreFile吗
缘由:
因为每次MemStore知足条件都会刷写磁盘文件Store,而且因为Region不一样或Region内部的Store不一样,会刷写不一样的StoreFile,所以会产生大量的小文件。
影响查询效率以及系统性能
① minor compaction
② major compaction
表建立的时候,只会默认给它生成一个Region,所以数据可能会所有写到该Region所处的那个Region Server上,致使负载不均衡
分区的好处
分区的原理:每一个Region都有一个startRowKey和endRowKey,若读写数据rowKey落在该范围,则读写该Region
缘由:
当删除大量的数据以后,可能会致使不少小的Region,此时最好进行合并
合并Region并不能带来的性能的提高,只是方便管理