解读
- 一个RegionServer有多个Region;
- 一个Region有多个HLog和多个Store;
- 一个Store 包括位于内存的一个 Memstore 和位于硬盘的多个 Storefile 组成,包含一个列族的所有数据
- 一个HFile对应hdfs中的一个数据块即128M;
- Table 中的所有行都按照 RowKey 的字典序排列;
- Table 在行的方向上分割为多个 HRegion;
- HRegion 按大小分割的(默认 10G);
- HRegion 是 Hbase 中分布式存储和负载均衡的最小单元;
- HRegion 虽然是负载均衡的最小单元,但并不是物理存储的最小单元;
- 一个 HRegion 是不会拆分到多个 server 上;
- 写操作先写入 Memstore,当 Memstore 中的数据量达到某个阈值,HRegionServer 启动flushcache 进程写入 Storefile,每次写入形成单独一个 HFile;
- 当总 Storefile 大小超过一定阈值后,会把当前的 Region 分割成两个,并由 HMaster 分配给相应的 Region 服务器,实现负载均衡;
- StoreFile 是只读的,一旦创建后就不可以再修改,因此 HBase 的更新/ 修改 其实是不断追加 的操作
Client
- 通过寻址机制,实现对数据的访问
- HBase-0.96 版本以前详细步骤为:
第 1 步:Client 请求 ZooKeeper 获得-ROOT-所在的 RegionServer 地址第 2 步:Client请求-ROOT-所在的 RS 地址,获取.META.表的地址,Client 会将-ROOT-的相关 信息 cache下来,以便下一次快速访问第 3 步:Client 请求.META.表的 RegionServer 地址,获取访问数据所在RegionServer 的地址, Client 会将.META.的相关信息 cache 下来,以便下一次快速访问第 4 步:Client请求访问数据所在 RegionServer 的地址,获取对应的数据
- HBase-0.96 版本以后详细步骤为:
HBase-0.96 版本以后去掉了ROOT表
原因其一:提高性能
原因其二:2 层结构已经足以满足集群的需求第 1 步:Client 请求 ZooKeeper 获取.META.所在的 RegionServer 的地址。 第 2 步:Client请求.META.所在的 RegionServer 获取访问数据所在的 RegionServer 地址,Client会将.META.的相关信息 cache 下来,以便下一次快速访问。 第 3 步:Client 请求数据所在的RegionServer,获取所需要的数据。
Zookeeper职责
- ZooKeeper 为 HBase 提供 Failover 机制,选举 Master,避免单点 Master 单点故障问题;
- 存储所有 Region 的寻址入口:-ROOT-表在哪台服务器上。-ROOT-这张表的位置信息;
- 实时监控 RegionServer 的状态,将 RegionServer 的上线和下线信息实时通知给 Master;
- 存储 HBase 的 Schema,包括有哪些 Table,每个 Table 有哪些 Column Family;
Master职责
- ZooKeeper 为 HBase 提供 Failover 机制,选举 Master,避免单点 Master 单点故障问题
- 存储所有 Region 的寻址入口:-ROOT-表在哪台服务器上。-ROOT-这张表的位置信息
- 实时监控 RegionServer 的状态,将 RegionServer 的上线和下线信息实时通知给 Master
- 存储 HBase 的 Schema,包括有哪些 Table,每个 Table 有哪些 Column Family
Master工作机制
- Master上线
Master 启动进行以下步骤:
1、 从ZooKeeper上获取唯一一个代表ActiveMaster的锁,用来阻止其它Master成为Master。
2、扫描 ZooKeeper 上的 server 父节点,获得当前可 RegionServer 列表。
3、和每个 RegionServer 通信,获得当前已分配的 Region 和 RegionServer 的对应关系。
4、扫描.META. Region 的集合,计算得到当前还未分配的 Region,将他们放入待分配 Region 列表。
- Master下线
由于 Master 只维护表和 Region 的元数据,而不参与表数据 IO 的过程,Master 下线仅导致所有元数据的修改被冻结(无法创建删除表,无法修改表的 schema,无法进行 Region的负载均衡,无法处理 Region 上下线,无法进行 Region 的合并
唯一例外的是 Region 的 split可以正常进行,因为只有 RegionServer 参与),表的数据读写还可以正常进行。
因此 Master下线短时间内对整个 hbase 集群没有影响。从上线过程可以看到,Master 保存的信息全是可以冗余信息(都可以从系统其它地方收集到或者计算出来)
因此,一般 HBase 集群中总是有一个 Master 在提供服务,还有一个以上的 Master 在等待时机抢占它的位置
RegionServer职责
- RegionServer 维护 Master 分配给它的 Region,处理对这些 Region 的 IO 请求
- 负责和底层的文件系统 HDFS 的交互,存储数据到 HDFS 负责 Store 中的 HFile 的合并工作
- RegionServer 负责 Split 在运行过程中变得过大的 Region,负责 Compact 操作
Store
- 一个表会划分为多个Region存储
- 一个Region中的一个列簇即为一个store
- store在hdfs中会以文件夹的形式存在
HLog
- 用来做灾难恢复之用
- HLog 记录数据的所有变更,一旦数据修改,就可以从 Log 中 进行恢复
- HLog 文件就是一个普通的 Hadoop Sequence File:
1、HLog Sequence File 的 Key 是 HLogKey 对象,HLogKey 中记录了写入数据的归属信息,除了 table 和 region 名字外,同时还包括 sequence number 和 timestamp,timestamp是”写入”,sequence number 的起始值为 0,或者是最近一次存入文件系统中 sequence number。
2、HLogSequece File 的 Value 是 HBase 的 KeyValue 对象,即对应 HFile 中的 KeyValue