HBase 原理
HBase 读写流程
- Client 访问 zk ,根据 ROOT 表获取 meta表所在的Region的位置信息,并将该位置信息写入 Client Cache,(将元数据,Region位置预读取到 Client Cache 中,可以加快查询)
- Client 读取 meta 表,再根据 meta 表中查询得到的 Namespace、表名、RowKey等相关信息,获取将要写入Region的位置信息,最终client端会将meta 表写入Client Cache。
- HBase使用memstore和storefile存储对表的更新操作,数据在更新的时候首先写入hlog和memstore,memstore是排序的
- 当memstore积累到一定的阈值时,就会创建一个新的memstore,并将老的memstore加入flush队列,由单独的线程的flush到磁盘上成为一个StoreFile,系统zookeeper中记录一个checkpoint,表示这个时刻之前的数据变更已经持久化,发生故障只需要恢复到checkpoint的数据,StoreFile是只读的,一旦创建就不可修改,当一个store的storefile达到一定的阈值后,就会进行一次合并操作,将对同一个key的修改合并到一起,同时进行版本合并和数据删除,形成一个大的storefile,当storefile的大小达到一定阈值后,又会对storefile进行切分操作,等分为两个storefile
- HBase中只有添加数据,所有的更新和删除都是在后续的合并中进行的,使得用户的写操作只要进入内存就可以立刻返回,实现HBase的高速存储
架构分析:
HMaster | 1. 负责管理 HBase 的元数据,表结构, 2. 表的 Region 信息 负责表的创建,删除和修改 3. 负责HRegionServer分配Region,分配后将元数据写入相应的位置 |
HRegionServer | 1. 含有多个 HRegion 2. 处理 Client 端的读写请求(根据HMaster返回的元数据找到对应的HRegionServer) 3. 管理 Region 的 Split分裂、StoreFile 的 Compaction合并 |
HRegion | 1. 一个 HRegion 里会有1到多个Store 2. HRegionServer 维护一个HLog 3. HRegion 是分布式存储和负载的最小单元 4. 表通常被保存在多个 HRegionServer 的多个 Region 中 |
Store | 1. Store 是存储在磁盘的最小单元,由于内存中的MemStore和磁盘中的若干StoreFile组成 2. 一个 Store 里会有一个或多个StoreFile 和 一个MemStore 3. 每个Store存储一个列族 |
Zookeeper | 1. 分布式管理服务,来维护集群中所有服务的状态 ,(一致性协议至少要三台以上的实例) |
写操作 | 1. Client 通过访问zk的调度,向RegionServer发出写的请求 2. 数据被写入Region的Memstore,直到MemStore达到预设阈值 3. Memstore中的数据被flush成一个StoreFile 4. 随着StoreFile文件的不断增多,达到设定阈值的后,触发Compact合并操作,并将Compact合并 压缩,即多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除 5. StoreFile 通过不断的Compact合并操作,逐步形成越来越大的StoreFile 6. 当个StoreFile大小超过一定阈值后,触发Split操作,把当前的Region Split成2个新的Region,父Region会下线,新Split出的2个子Region会被HMaster分配到相应的RegionServer上 |
读操作 | 1. Client访问Zookeeper,查找-ROOT-表,获取.META.表信息 2. 从.META.表查找,获取存放在目标数据的Region信息,从而找到对应的RegionServer 3. 通过RegionServer获取需要查找的数据 4. RegionServer的内存划分为MemeStore和BlockCache两部分,MemStore主要用于写数据,BlockCache主要用于读数据,请求先到MemStore中,查不到再到BlockCache中查,再查不到就会到StoreFile,并把读的结果放入到BlockCache中 |