Hbase深入学习(8) ―― region server and hmaster server

Hbase深入学习(八) ―― region server and hmaster serverHbase深入学习(八) ―― region server and hmaster

Hbase深入学习(八) ―― region server and hmaster server

Hbase深入学习(八) ―― region server and hmasterserver

Hbase在逻辑上的存储最小单位是region,物理上来说是hfile。每个region由多个hfile组成。那么,是否有一个推荐值,确定每台regionserver上运行多少个region,每个region的size多大是最合适的呢?

以目前主流服务器的能力计算,给出了以下推荐值:每台regionserver管理10-1000个regions,每个region大小在1-2gb.对应于hbase-site.xml中的一个配置项为hbase.hregion.max.filesize.如果按推荐值计算每台regionserver管理的数据量,最少可以到10*1gb=10gb,最大可以到1000*2gb=2tb。考虑到3份备份,总数据量在6tb左右。通常来讲这里磁盘的配置就有两种方案:一是3快2tb的硬盘;二是12块500gb的硬盘。两种硬盘容量一样,后者硬盘快速增加。如果硬盘总线带宽够用,后一种能提供更大的吞吐率,更细粒度的磁盘冗余备份,更快的单盘故障恢复时间。那么,hbase是如何划分region的呢?

在hbase表中的所有行都按照行键的字典序排列,在行的方向上分割为多个region。

Region是按大小分割的,每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阙值的时候,region就会等分成两个region.当table中的不断增多,就会有越来越多的region。

Region是hbase中分布式存储和负载均衡的最小单元。最小单元就表示不同的region可以分布在不同的hregion server上,但一个region是不会拆分到多个server上的。

Region虽然是分布式存储的最小单元,但并不是存储的最小单元。事实上,hregion由一个或者多个store组成,每个store保存一个列族的数据。每个store又由一个memstore和0到多个storefile组成。

当客户端进行更新操作时,先连接到相关的hregionserver,然后向region提交变更。提交的数据首先要写入wal和memstore中,当memstore中的数据累计到某个阙值时,hregionserver就会启动一个单独的线程讲memstore中的内容刷新到磁盘,形成一个storefile文件。当storefile文件的数量增长到一定的阙值后,就会将多个storefile文件合并到一个storefile,合并过程中将进行版本合并和数据删除。因此可以看出hbase其实只能增加数据,所有的更新和删除操作都是在后续的合并过程中进行的。Storefile在合并过程中组件形成更大的storefile,当storefile大小达到一定阙值后,会把当前的region分割成两个region,并由hmaster分配到相应的region服务器上,实现负载均衡。

Hmaster主服务器

Hbase每时每刻只有一个hmaster主服务器程序在运行,hmaster将region分配给region服务器,协调region服务器的负载并维护集群的状态。Hmaster不会对外提供数据服务,而是由region服务器负责所有regions的读写请求及操作。

由于hmaster只维护表和region的元数据,而不参与数据的输入/输出过程,hmaster失效仅仅会导致所有的元数据无法被修改,但表的数据读/写还是可以正常进行的。

  1. hmaster的作用

为region server分配region.

负责region server的负载均衡。

发现失效的region server并重新分配其上的region.

Gfs上的垃圾文件回收。

处理schema更新请求。

  1. region server的作用

region server维护master分配给它的region,处理对这些region的i/o请求。

Region server负责切分在运行过程中变得过大的region.

可以看到,client访问hbase上数据的过程并不需要master参与(寻址访问zookeeper和regionserver,数据读写访问region server),master仅仅维护着table和region的元数据信息,负载很低。

元数据表

用户表的regions元数据被存储在meta表中,随着region的增多,meta表中的数据也会增大,并分割成多个regions。为了定位meta表中各个regions的位置,把meta表中所有regions的元数据保存在root表中,最后由zookeeper记录root的位置,然后访问root表获得meta的位置,最后根据meta表中的信息确定用户数据存放的位置。

Root表永远不会被分割,它只有一个region,这样就保证了最多需要3次跳转就可以定位任意一个region.为了加快访问速度,meta表的regions全部保存在内存中。客户端会将查询过的信息缓存起来,且缓存不会自动失效。如果客户端根据缓存信息还访问不到数据,则询问持有meta表的region服务器,试图获取数据的位置。如果还是失效,则访问root表相关的meta表在哪里。

什么是zookeeper?

Zookeeper 作为 Hadoop 项目中的一个子项目,是Hadoop 集群管理的一个必不可少的模块,它主要用来控制集群中的数据,如它管理 Hadoop 集群中的 NameNode,还有 Hbase 中 Master Election、Server 之间状态同步等。