hbase 基础 —— 架构
典型的主从架构。其中 RegionServers 负责与客户端的交互,访问数据 HMaster 负责 Region 分配,DDL(create, delete tables) 操作。
1. Regions
hbase table 根据 RowKey 划分成多个 Region,Region 包含所划分范围的所有行数据,每个 Region 默认大小是 1GB。Region 存放于集群中的某个节点,称为 Region Server,其负责数据的读取与写入。一个 Region Server 可以处理大约 1000 个 regions.
2. HMaster
主要有两个作用,一个是协调 Region Server,包括启动时分配 Region,故障恢复或负载均衡时重分配 Region,还包括监控集群中的所有 Region Server 实例(监听来自 zk的通知)。二是管理功能,比如 creating, deleting, updating tables
3. Zookeeper
负责维护集群中 Server的状态(可用或不可用),并且提供服务故障通知。如果 RegionServer 失败了,通知给 active HMaster。如果 active HMaster 失败了,通知给 Inactive HMaster。
4. meta cache
hbase 中有一个特殊的 catalog 表叫作 meta 表,用于存储集群中 Region 的位置。 Zookeeper 用于保存 meta 表所在位置。
举例:
① 客户端从 Zookeeper 中查询 meta 表位于哪个 rs
② 再查询 META 表获取想要找的 row key 所在 rs。缓存这两步操作(下次直接从缓存中读,不需要经过这两个步骤)。
③ 从第二步查询到的 rs 中查询 row key 所在 Row
5. meta 表
meta 表保存系统中所有 region 的信息,类似一个 b tree
6. region server 中的组件
wal (Write Ahead Log)用于数据恢复。新增的数据会首先写到 wal 中,其次再写到 MemStore
BlockCache 读缓存
MemStore 写缓存。每一个 column family 有一个 MemStore。
Hfiles 磁盘存储。当 MemStore 累计了足够数据的时候,整个 sorted k-v 数据 将会有序写入到 hfile 中。每个 cf 可能有多个 hfiles,这些文件是根据时间的推移而创建的。
7. hfile 结构
HFile 包含多层索引,因此查询数据时无须读取整个文件。 多级索引类似一个B+Tree
① k-v 对是以递增的顺序存储的
② 每个 block 默认是 64k
当文件打开时会加载索引并保存到内存中(BlockCache)。
读合并步骤:
一个 row的kv单元可能保存在多个地方。先查 BlockCache 找最近的读缓存,再查 Memstore 找最近的写缓存,再去查 hfiles(根据 index 与 bloom filter 将可能的 hfiles 加载到内存中)。
由于每个 memstore 可能有多个 hfiles,导致有多个文件被读取测试,称之为读放大(read amplification)。
轻度压实:
hbase 会自动将一些小文件压实成稍微大的文件。
高度压实:
可以定期运行一个压实。使得一个 region中的一个 column family 只保留一个 hfile,在此过程中丢弃已删除或过期的单元。提高了读效率,但是此过程需要重写大量文件,会有大量的磁盘IO与网络IO开销,因此通常建议在周末或夜间运行此类操作。
参考文章
https://mapr.com/blog/in-depth-look-hbase-architecture/
https://moon-rui.github.io/2018/11/19/in_depth_look_at_hbase_architecture.html