扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
这是旧版本的hbase的架构图,一个regionserver中只有一个Hlog。
这一张是新版本的图,每一个regionserver中可以有30个Hlog。
老版本和新版本的变动:
- 0.96版本以前,一个regionserver只有一个HLog,并且管理元数据有.meta. -root-两个元数据表。
- 0.98版本以后,一个regionserver可以有多个Hlog,并且管理元数据,只有.meta.表。
- .MEAT.:记录了用户所有表拆分出来的region映射信息(各个region的rowkey范围,以及存在的节点),.MEAT.可以有多个region。对应的用户表中切分出来的每一个region就对应.META.表中的一个记录
- -ROOT-:记录了.META.表的 Region 信息,-ROOT-只有一个 Region,无论如何不会分裂,同样的.META.表切分出来的一个region就是- ROO-表中的一个记录。
- Client访问用户表前需要首先访问zookeeper,找到对应的-ROOT-表的region所在位置,然后访问-ROOT-表,找到.meta.表的访问位置,然后找到.meta.表,最后通过.meta.表找到用户数据的位置去访问,中间需要多次网络操作,并且client 端会做 cache 缓存(即如果下一次查找的记录在上一次已经查询了,可以不进行以上操作,直接在缓存中得到)
- zookeeper为HBASE提供failover机制,选主master,避免单点故障,其实HBASE中的master,宕机一段时间对集群影响不大,因为master,及时master宕机,HBASE集群仍然可以做:查看,上传操作,但是不能创建和修改表。但是master宕机很长时间是不行的,因为master需要做负载。
- 存储所有Region 的寻址入口:-ROOT-表在哪台服务器上。-ROOT-这张表的位置信息
- 实时监控regionserver的状态,将regionserver的上线和下线信息实时通知给master
- 存储HBASE的schema(包括有哪些 Table,每个 Table 有哪些 Column Family);默认情况下: /hbase/table:是zookeeper中存储HBASE中表名的目录
- 为regionserver分配region(并且做负载均衡)
- 发现失效的 RegionServer 并重新分配其上的 Region(即,如果有相应的RegionServer宕机的时候,master会将其宕机节点上的region,复制到其他节点上),高容错。
- HDFS 上的垃圾文件(HBase)回收
- 处理HBASE的schema(表的创建、删除、修改、列簇的增加…)
- RegionServer 维护 Master 分配给它的 Region,处理对这些 Region 的 IO 请求(即对表中数据的增、删、改)
- 负责和底层的文件系统hdfs交互,存储数据到hdfs
- 负责 Store 中的 HFile 的合并工作
- RegionServer 负责 Split 在运行过程中变得过大的 Region,负责 Compact (切分)操作
切分原则:
第一次:128*(1*1)
第二次:128*(3*3)
第三次:128*(5*5) 直到计算的结果>10G的时候,以后就按照10G切分
上图是一个regionserver的存储
- Table中的所有行按照rowkey进行字典排序,然后根据rowkey范围,切分出不同的region
- Region的默认大小为10G,每个表一开始只有一个 HRegion,随着数据不断插入 表,HRegion 不断增大,当增大到一个阀值的时候,HRegion 就会等分会两个新的 HRegion。 当表中的行不断增多,就会有越来越多的 HRegion
- Region是Hbase 中分布式存储和负载均衡的最小单元。同一个region中的数据一定是存储在同一个节点上的,但是region切分后,可以存储的不同的节点
- Region虽然是负载的最小单元,但是不是物理存储的最小单元。实际上,region由一个或者多个store组成,每一个store,存储的是region中的一个列簇中的所有数据。每个 Strore 又由一个 MemStore 和 0 至多个 StoreFile 组成
一个region由多个store组成,每一个store包含一个列簇的所有数据,一个region由多个store组成,每一个store包含一个列簇的所有数据。
原理:在写入数据的时候,现将数据写入到Memstore,当 Memstore 中的数据量达到某个阈值,regionserver启动flushcache 进程写入 Storefile,每次写入形成单独一个 HFile。(即,当达到阈值的时候,首先会将存储在Memstore中的数据写入磁盘,形式为hfile,当磁盘中有多个Hfile的时候,又会进行合并,合并成一个storefile)。
StoreFile 以 HFile 格式保存在 HDFS 上,请看下图 HFile 的数据组织格式:
其中:首先 HFile 文件是不定长的,长度固定的只有其中的两块:Trailer 和 FileInfo。
- Trailer:有指针,指向其他数据块的起始点
- FileInfo:记录本文件的元数据信息
- Data:存储的是表中的数据
- Meta:保存用户自定义的 kv 对
- Data Index:data的索引,每条索引的 key 是被索引的 block 的第一条记录的 key
- Meta Index:Meta的索引,记录着Meta数据的起始位置
- Data中的magic:用于校验,判断是否有数据损坏
其中,除了trailer和fileinfo两个定长的数据以外,其他的数据都可以进行压缩。
data中的K-V键值的介绍:
两个固定长度的数值,分别表示key的长度和value的长度。紧接着是key,开始是固定长度的数值,表示rowkey的长度,紧接着是rowkey,然后是固定长度的数值,紧接着是列簇名(最好是16),接着是 Qualifier(列名),然后是两个固定长度的数值,表示 TimeStamp 和 KeyType(Put/Delete)。Value 部分没有这么复杂的结构,就是纯粹的二进制数据了。
WAL 意为 Write ahead log,用于做灾难恢复的,HLog 记录数据的所有变更,一旦数据修改,就可以从 Log 中 进行恢复。
灾难恢复的解释:开始的时候region的数据时存储在内存中的metestore,此时还没有达到阈值,数据仍在内存中,没有持久化到磁盘,如果此时机器突然宕机,储存在内存的数据,会丢失,此时需要hlog进行数据的恢复。但是hlog只会保存,在没有同步到磁盘中的那部分操作的日志,已同步到磁盘的数据,那部分的日志,会被存放到oldWAL目录下,10分钟后删除。
HLog 的文件结构:
- HLog Sequence File 的 Key 是 HLogKey 对象,HLogKey 中记录了写入数据的归属信息,除 了 table 和 region 名字外,同时还包括 sequence number 和 timestamp,timestamp 是”写入 时间”,sequence number 的起始值为 0,或者是最近一次存入文件系统中 sequence number。
- HLog Sequece File 的 Value 是 HBase 的 KeyValue 对象,即对应 HFile 中的 KeyValue
介绍 :读写是在regionserver上发生,每个 RegionSever 为一定数量的 Region 服务,如果client要对某一行数据做读写的时候,我们该访问哪一个regionserver?,可以使用寻址的方式解决。
解释:
- client请求zookeeper获得-root-所在的regionserver地址
- client请求-root-所在的regionserver,获取取.META.表的地址。client 会将-ROOT-的相关 信息 cache 下来,以便下一次快速访问
- client请求.META.表的regionserver,获取访问数据所在的regionserver的地址(仍然有缓存)
- client请求访问数据所在的regionserver,获取相应的数据
- Client 请求 ZooKeeper 获取.META.所在的 RegionServer 的地址
- Client 请求.META.所在的 RegionServer 获取访问数据所在的 RegionServer 地址,Client 会将.META.的相关信息 cache 下来,以便下一次快速访问
- Client 请求数据所在的 RegionServer,获取所需要的数据
- 客户端通过zookeeper以及-root-表和.mate.表找到目标数据所在的regionserver(寻址)
- 联系regionserve查询目标数据
- Region先在memstore中查找,命中则返回
- 如果memstore找不到,则在storefile中扫描 , 为了能快速的判断要查询的数据在不在这个 StoreFile 中,应用了 BloomFilter(布隆过滤)
- Client先根据rowkey找到对应的region所在的regionserver(寻址)
- Client向regionserver提交请求
- Regionserver找到目标region
- Regionserver检查数据是否与 Schema 一致
- 如果客户端没有指定版本,则获取当前系统时间作为数据版本
- 将更新写入Hlog
- 将数据写入memstore
- 判断memstore的是否需要flush为storefile
注意:
- 数据在更新时首先写入 HLog(WAL Log),再写入内存(MemStore)中,MemStore 中的数据是排序的
- Storefile是只读的,一旦创建就不能在修改,因此HBASE的更新/修改其实是不断追加的操作,根据版本的保留策略,会将旧的数据删除
任何时刻,一个region只能分配一个regionserver。Master记录了当前有哪些可用的regionserver。以及当前哪些region分配给了哪些regionserver,哪些region还没有分配。当需要分配新的region的时候,master就给一个有可用空间的regionserver发送装载region的请求。把这个region分配个这个regionserver。
Master 使用 zookeeper 来跟踪 RegionServer 状态。当某个 RegionServer 启动时,会首先在 ZooKeeper 上的 server 目录下建立代表自己的 znode。由于 Master 订阅了ZooKeeper server 目录上的变 更消息,当 server 目录下的文件出现新增或删除操作时,Master 可以得到来自 ZooKeeper 的实时通知。因此一旦 RegionServer 上线,Master 能马上得到消息
当 RegionServer 下线时,它和 zookeeper 的会话断开,ZooKeeper 而自动释放代表这台 server 的文件上的独占锁。Master 就可以确定,regionserver和zookeeper之间无法通行了,regionserver可能宕机了。
- 从zookeeper上获取唯一代表Active Master 的锁,用来阻止其它 Master 成为 Master
- 扫描zookeeper上的server的节点,获得当前可用的regionserver节点列表。
- 和每一个regionserver通信,获得当前分配的region和regionserver的对应关系。
- 扫描.META. Region 的集合,计算得到当前还未分配的region,将他们放入待分配region列表。
由于master只维护表和region的元数据,而不参与数据IO的过程,master下线仅导致所有的元数据的修改被冻结(无法创建表,无法修改表的schema,无法进行region的负载均衡),表的数据读写还可以正常进行。因此master可以短暂的下线。从上线过程可以看到,Master 保存的信息全是可以冗余信息(都可以从系统其它地方 收集到或者计算出来)
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流