当前位置: 首页 > 科技观察

HBase服务器架构

时间:2023-03-15 20:53:00 科技观察

HBase服务器架构遵循简单的主从服务器架构,由HRegion服务器(HRegionServer)组和HBase主服务器(HBaseMasterServer)组成。HBaseMaster服务器负责管理所有的HRegion服务器,HBase中的所有服务器通过ZooKeeper进行协调,处理HBase服务器运行过程中可能遇到的错误。HBaseMasterServer本身并没有在HBase中存储任何数据。HBase逻辑表可能会被划分成多个HRegion,然后存储在HRegionServer集群中。HBaseMasterServer存储从数据到HRegionServers的映射。ClientHBaseClient使用HBase的RPC机制与HMaster和HRegionServer进行通信。对于管理操作,Client和HMaster进行RPC;对于数据的读写操作,Client和HRegionServer进行RPC。ZookeeperZookeeperQuorum不仅存储了-ROOT-表的地址和HMaster地址,HRegionServer也会以Ephemeral的方式将自己注册到Zookeeper中,以便HMaster随时感知各个HRegionServer的健康状态。另外Zookeeper也避免了HMaster的单点问题。请参阅下面有关HBase主服务器的说明。每个HRegion服务器将与HMaster服务器进行通信。HMaster的主要任务是告诉每个HRegion服务器它要维护哪个HRegion。当一个新的HRegion服务器登录到HMaster服务器时,HMaster会告诉它先等待分配数据。当一个HRegion崩溃时,HMaster会将其负责的HRegion标记为未分配,然后将它们分配给其他HRegion服务器。HRegionServerHRegionServer主要负责响应用户的I/O请求,读写数据到HDFS文件系统。它是HBase中的核心模块。所有的数据库数据一般都存储在Hadoop分布式文件系统上。用户通过一系列的HRegion服务器获取这些数据。一般一台机器上只运行一个HRegion服务器,HRegion的每一段只会被一个HRegion服务器使用。HRegion服务器维护。当用户需要更新数据时,会分配到对应的HRegion服务器提交修改,这些修改会写入Hmemcache(内存中的缓存,保存最新更新的数据)缓存和服务器的hlog(磁盘上的记录)文件,他记录了所有的更新操作)在文件里面。操作写入Hlog后,调用commit()将其返回给客户端。HRegion服务器在读取数据时,会先访问Hmemcache缓存。如果缓存中没有数据变化,就会回到Hstores磁盘中查找。每个列族都会有一个HStore集合,每个HStore集合包含很多HstoreFile文件。如下图所示:HStore存储是HBase存储的核心,由两部分组成,一个是MemStore,一个是StoreFiles。MemStore是一个排序的内存缓冲区。用户写入的数据会先放入MemStore。当MemStore满时,它会被刷新到一个StoreFile(底层实现是HFile)。当StoreFile文件数量增加到一定阈值时,会触发Compact合并操作。多个StoreFile合并为一个StoreFile,合并过程中会进行版本合并和数据删除。因此可以看出,HBase只是增加数据,所有的update和delete操作都在后续的compact流程中进行,这使得用户的写操作只要进入内存,就可以立即返回,保证了高性能HBase输入/输出。StoreFiles被压缩后,会逐渐形成越来越大的StoreFiles。当单个StoreFile的大小超过一定阈值时,会触发Split操作,将当前Region拆分成两个Region。父Region会下线,新的Split会产生2个子Region,每个子Region会被HMaster分配给对应的HRegionServer,这样就可以将原来1个Region的压力分摊到2个Region上。HRegion当表的大小超过设定值时,HBase会自动将表划分为不同的区域,每个区域包含所有行的一个子集。对于用户来说,每张表都是数据的集合,通过主键来区分。物理上,一张表被拆分成多个block,每个block是一个HRegion。我们使用表名+开始/结束主键来区分每个HRegion。一个HRegion会保存一张表中某一段连续的数据,从起始主键到结束主键。一个完整的表存储在多个HRegion上。HBase存储格式HBase中的所有数据文件都存储在HadoopHDFS文件系统上,主要包括上面提到的两种文件类型:1.HFile,KeyValue数据在HBase中的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile是对HFile的轻量级封装,即StoreFile的底层是HFile2。HLogFile,HBase中WAL(WriteAheadLog)的存储格式,物理上是Hadoop的SequenceFile。HFile介绍完了,接下来介绍HLogFile。在分布式系统环境中,系统出错或者宕机是不可避免的,所以一旦HRegionServer意外退出,MemStore中的内存数据就会丢失,这就需要引入HLog。每个HRegionServer都有一个HLog对象。HLog是一个实现WriteAheadLog的类。每次用户操作写入MemStore时,也会向HLog文件中写入一段数据(后面会看到HLog文件格式),HLog文件会周期性的推出新的和旧的(已经持久化到StoreFile的数据)被删除。当HRegionServer意外终止时,HMaster会通过Zookeeper感知。HMaster会先对遗留的HLog文件进行处理,将不同Region的Log数据拆分,放到对应的Region目录下,然后对失效的Region进行重新分配,接收到这些region的HRegionServer在LoadRegion过程中会发现有历史的HLogs需要处理,于是会把HLog中的数据replay到MemStore,然后flush到StoreFiles完成数据恢复。HFile的下图是HFile的存储格式:首先,HFile文件是可变长度的,只有两种是固定长度的:Trailer和FileInfo。如图所示,Trailer中有指针指向其他数据块的起始点。FileInfo中记录了文件的一些Meta信息,如:AVG_KEY_LEN、AVG_VALUE_LEN、LAST_KEY、COMPARATOR、MAX_SEQ_ID_KEY等。DataIndex和MetaIndex块记录了每个Datablock和Metablock的起始点。DataBlock是HBaseI/O的基本单元。为了提高效率,HRegionServer有一个基于LRU的BlockCache机制。创建Table时可以通过参数指定每个Datablock的大小。大块适合顺序扫描,小块适合随机查询。除了一开始的Magic之外,每个Datablock都是由KeyValue对拼接而成的。Magic内容是一些随机数,以防止数据损坏。每个KeyValue对的内部结构将在后面详细介绍。HFile中的每个KeyValue对都是一个简单的字节数组。但是这个字节数组包含很多项并且具有固定的结构。我们看一下里面的具体结构:一开始有两个定长值,分别代表Key的长度和Value的长度。接着是Key,以定长值开头,表示RowKey的长度,后面是RowKey,然后是定长值,表示Family的长度,然后是Family,后面是Qualifier,再后面是两个固定的-length值,表示时间戳和密钥类型(放置/删除)。Value部分没有这么复杂的结构,是纯二进制数据。HLogFile上图显示了HLog文件的结构。HLog文件其实就是一个普通的HadoopSequenceFile。SequenceFile的Key是HLogKey对象。HLogKey记录写入数据的属性信息。除了表名和区域名外,还包含包括序号和时间戳,时间戳是“写入时间”,序号的初始值为0,或者是文件系统最后存储的序号。