一、架构设计
1、架构设计图
二、核心概念名词
- Client
- 发起读写的请求的角色。面向hbase client编程。
- 首先hbase查找meta表,找到读或者写的region区域位置信息。
- 然后向region对应的HRegionServer发送读写请求。
- Zookeeper
- 存储Hbase元数据。
- 负责HMaster的主备切换和选举。
- 负责对HRegionServer进行监控。
- 对RootRegion的管理,即meta表所在的,存储数据的region。
- Region管理,普通Region的上下线等信息管理。
- 分布式splitWAL任务管理。即当HRegionServer宕机后接收HMaster发布的用来回复数据的日志信息。通知其他健康的HRegionServerlai来恢复源数据。
- HRegionServer
- 维护本地的Region,并处理客户端对这些Region的IO请求。
- 切分本地Region。当storeFile大小超过阈值,则会触发Region的split操作,将当前Region切分为两个。老的Region会下线。新的两个被分配到RegionServer上。
- HRegionServer管理若干个HRegion。每个HRegion对应着Table中的Region。
- HRegion有多个Hstore。每一个HStore对应着一个列族。由此可以看出一个列族就是一个集中存储单元,因此将具有相同IO特性的列放在一个列族,保证读写的效率。
- HMaster
- 管理用户对table的增删改查操作。
- 管理HRegionServer,实现其负载均衡。
- 管理Region,当某个RegionServer宕机后,发指令使该Region迁移。
- HRegion
- Table在纵向上分为多个Region,Region是Hbase分布式存储和负载均衡的最小单位。即同一个Region不会拆分在多个Regionserver上。
- Region按大小分割,一般一个表只有一个Region,随着表数量的增多,达到一个阈值的时候就会分成两个Region。
- 每个Region由一下信息标识<表名,startRowkey,创建时间>
- HStore
- HStore是Hbase的核心,分为MemStore和StoreFile。
- MemStore是内存缓存,写入的数据先缓存到这里。当缓冲区满了就会flush到StoreFile中,当Store的数量达到阈值就会触发compact操作,合成一个大的StoreFile。
- 当合并后的StoreFile超过阈值时,会触发HRegion的split操作。分成两个HRegion,分配到相应的HRegionServer上。
- MemStore
- MemStore是放在内存中的,来保存修改的数据,即KeyValues。
- 当MemStore的大小达到一个阈值(默认128M)时,memStore会被flush到文件,生成一个快照。
- 由一个独立的线程来负责flush操作。
- StoreFile
- memStore的数据写入文件后就是StoreFile。
- storeFile的底层是以HFile 的格式保存。
- 在文件数量达到阈值时会进行合并,并进行版本合并和删除操作。形成更大的StoreFile。
- HFile
- 当MemStore数据足够多时整个KV集合就会被写入HDFS的HFile中
- K-V形式的数据存储文件,是一个二进制文件。
- StoreFile就是对HFile进行了一个小封装。
- Minor Compaction
- HBase会选择一些较小StoreFile,合并成数量少,个体大的StoreFile。这个过程即Minor Compaction。
- 通过这个操作来减少存储文件的数量。
- Major Compaction
- Major Compaction将Region所有的StoreFile合并,并重写到一个大的StoreFile。每个列族对应一个StoreFile。
- 由于该过程重写了所有HFile文件,有巨大的数据IO,被称为写入放大。
- Major Compaction操作可以自动执行,由于其占用IO较大,一般在晚上等集群低负载情况下执行。
- WAL 机制
- Writeahead Log的简称,即先写日志。
- 解决的是当数据写入MemStore后,HRegionServer宕机导致数据无法持久化的操作。
- WAL运行原理
- 写入时先写日志,再写入MemStore,当MemStore写入成功时客户端会得到写入成功的消息。
- 这中情况下如果出现宕机情况,可以通过replay日志的方式操作。
HLog
- 用来做灾难恢复使用。
- HLog记录所有数据的变更,一旦宕机可以从log中恢复操作。
- 物理上是一个sequenctfile。即文件队列。
- 每个HRegionServer下只有一个HLog,这个Hlog被所有HRegion共享。
三、HBase写流程
1、获取.META.的RootRegion信息
第一次写时,先通过zookeeper获取从.META.表对应的region位置信息。放入缓存中。后续再进行操作时直接通过缓存读取.META.表对应的Region信息即可。
2、找数据要写到哪个Region中
根据上边获得的RootRegion,请求region所再的RegionServer服务。找到写入数据对应的region信息。
找到小于rowkey并且最接近rowkey的startkey对应的region,即为目标region。
3、发起实际的写请求
-
4、WAL log写入
-
5、memstore写入storeFile落地
将数据写入到memstore中,当数据量达到阈值时,数据会被flush到hdfs中,形成storeFile。
6、StoreFile合并
随着StoreFile文件不断增多,当达到一定阈值时触发compact合并操作,将多个合成一个storeFile,并进行版本合并和数据删除。
通过不断地conpact操作,形成越来越大的storefile。
7、Region拆分
当storeFile大小超过一定的阈值时,会触发region的split操作,把当前的region拆分成两个。并且会被Matser分配到多个hregionserver上。
四、HBase读流程
1、获取.META.的RootRegion位置信息
在进行第一次读写时,client通过zookeeper从.META.表获取对应的region位置信息。并加入到缓存后,后续就可以直接通过缓存进行读取信息操作。
2、找到数据要存到哪个Region中
根据上边获取的RootRegion信息,请求region所在的regionserver信息,找到对应的region位置。
找到小于Region并且最接近Region的startkey对应的region,即为目标region。
3、发起实际读请求
-
4、先从memstore读数据,如果找到则返回
5、从blockcache读数据,找到则返回
6、从StroeFile中查找数据,找到则返回,没找到则返回null
如果实在StoreFIle中读取到的数据,则先写入blockcache再返回。