HBase 底层原理(系统架构、物理存储、寻址机制、读写过程、主从节点工作机制)
1、系统架构
每一个 RegionServer 就只有一个 HLog。
(1)Client 职责:
A、HBase 有两张特殊表:
.META.:记录了用户所有表拆分出来的的 Region 映射信息,.META.可以有多个 Regoin;
-ROOT-:记录了.META.表的 Region 信息,-ROOT-只有一个 Region,无论如何不会分裂。
B、Client 访问用户数据前需要首先访问 ZooKeeper,找到 -ROOT- 表的 Region 所在的位置,然后访问 -ROOT- 表,接着访问 .META. 表,最后才能找到用户数据的位置去访问,中间需要多次网络操作,不过 client 端会做 cache 缓存。
(2)ZooKeeper 职责:
A、ZooKeeper 为 HBase 提供 Failover 机制,选举 Master,避免单点 Master 单点故障问题;
B、存储所有 Region 的寻址入口:-ROOT- 表在哪台服务器上。-ROOT- 这张表的位置信息;
C、实时监控 RegionServer 的状态,将 RegionServer 的上线和下线信息实时通知给 Master;
D、存储 HBase 的 Schema,包括有哪些 Table,每个 Table 有哪些 Column Family。
(3)Master 职责:
A、为 RegionServer 分配 Region;
B、负责 RegionServer 的负载均衡;
C、发现失效的 RegionServer 并重新分配其上的 Region;
D、HDFS 上的垃圾文件(HBase)回收;
E、处理 Schema 更新请求(表的创建,删除,修改,列簇的增加等等)。
(4)RegionServer 职责:
A、RegionServer 维护 Master 分配给它的 Region,处理对这些 Region 的 IO 请求;
B、RegionServer 负责 Split 在运行过程中变得过大的 Region,负责 Compact 操作。
(5)总结:
A、可以看到,client 访问 HBase 上数据的过程并不需要 master 参与(寻址访问 zookeeper 和 RegioneServer,数据读写访问 RegioneServer),Master 仅仅维护者 Table 和 Region 的元数据信息,负载很低。
B、.META. 存的是所有的 Region 的位置信息,那么 RegioneServer 当中 Region 在进行分裂之后的新产生的 Region,是由 Master 来决定发到哪个 RegioneServer,这就意味着,只有 Master 知道 new Region 的位置信息,所以,由 Master 来管理.META.这个表当中的数据的 CRUD。
所以结合以上两点表明,在没有 Region 分裂的情况,Master 宕机一段时间是可以忍受的。
2、物理存储
2.1、整体物理结构
(1)Table 中的所有行都按照 RowKsey 的字典序排列。
(2)Table 在行的方向上分割为多个 HRegion。
(3)HRegion 按大小分割的(默认 10G),每个表一开始只有一个 HRegion,随着数据不断插入表,HRegion 不断增大,当增大到一个阀值的时候,HRegion 就会等分会两个新的 HRegion。当表中的行不断增多,就会有越来越多的 HRegion。
(4)HRegion 是 Hbase 中分布式存储和负载均衡的最小单元。最小单元就表示不同的 HRegion 可以分布在不同的 HRegionserver 上。但一个 HRegion 是不会拆分到多个 server 上的。
(5)HRegion 虽然是负载均衡的最小单元,但并不是物理存储的最小单元。事实上,HRegion 由一个或者多个 Store 组成,每个 Store 保存一个 Column Family。每个 Strore 又由一个 memStore 和 0 至多个 StoreFile 组成。
2.2、StoreFile 和 HFile 结构
StoreFile 以 HFile 格式保存在 HDFS 上。
(1)请看下图 HFile 的数据组织格式:
首先 HFile 文件是不定长的,长度固定的只有其中的两块:Trailer 和 FileInfo。正如图中所示:
A、Trailer 中