整个Hadoop生态中大量使用了master-slave的主从式架构,如同HDFS中的namenode和datanode,MapReduce中的JobTracker和TaskTracker,YARN中的资源管理器和节点管理器,Zookeeper中的leader和follower。我们将看到HBase同样是基于这种主从式的一种运行机制。

1、HBase实现原理

  正如前面所说,HBase将表水平分裂为区域,集群中的每个节点管理若干个区域,区域是HBase集群上分布数据的最小单位,因此存储数据的节点就构成了一个个的区域服务器,叫做RegionServer。

  在HBase中,同样采用了主从式的架构,用一个master节点协调管理多个RegionServer从属机,主控机负责启动安装,将区域分配给注册的RegionServer,恢复RegionServer的故障,管理和维护HBase表的分区信息,master 的负载很轻。而区域服务器RegionServer负责存储和维护分配给自己的Region,响应客户端的读写请求

  客户端并不是直接从Master主服务器上读取数据,而是在获得Region的存储位置信息后,直接从Region服务器上读取数据,因此主控机的负载很轻。

  那么这里我们需要理清的一个重要问题就是如何定位区域在哪个服务器上,即Region的定位问题

  【Region是如何定位的?】

  在HBase内部维护了一张名为hbase:meta的特殊目录表,这张表记录了当前集群上所有区域的列表、状态和位置,这张表的行键是区域名,即meta表的结构是:<区域名,位置,状态>,而区域名是由所属表名,区域的起始行,创建时间以及对前三者进行MD5哈希之后的结果共同组成的。

  如表TestTable中起始行为xyz的区域的名称是:TestTable,xyz,1279729913622,1b6e176fb8.........(哈希值)

  有了meta这张表,表是根据行键排序的,所以要查询某一行只需要与行键进行比较,即可得到对应的区域,进而得到对应的位置,然后直接到那个服务器上去读取数据。

  更进一步,我们考虑这样的问题:meta表保存着所以区域的位置信息,因此这张表是很重要的,而且当数据量很大,区域很多时,这张表也可能大到一个区域无法保存,因此HBase实际上是有一个三层结构来完成区域定位的。

  理解这个三层结构可以类别文件系统的多级索引机制,首先在Zookeeper中用一个文件保存Root表的位置,Root表中记录meta表的区域位置信息,meta表中记录数据的区域位置。

层次 名称 作用
第一层 Zookeeper文件 记录了-ROOT-表的位置信息
第二层 -ROOT-表 记录了.META.表的Region位置信息 -ROOT-表只能有一个Region通过-ROOT-表,就可以访问.META.表中的数据
第三层 .META.表 记录了用户数据表的Region位置信息,.META.表可以有多个Region,保存了HBase中所有用户数据表的Region位置信息

  至此,我们就可以完全理解HBase的运行机制了,客户端首先连接到Zookeeper集群,进而通过三级索引查找到hbase:meta表的位置,通过查meta表就可以获取数据区域所在的节点及位置,然后直接和管理那个区域的regionServer交互,进行数据的读写。

  总结起来,我们可以看到每个行操作可能需要三次远程访问,一次是连接Root所在节点,一次是连接meta所在节点,还有一次是连接需要的RegionServer,为了节省这些开销,客户端可以通过缓存来存储之前访问meta表得到的信息,这样,后续可以现在缓存中查找,节省多次远程访问的开销。

2、HBase系统架构

   实际上通过前面的实现原理,我们对HBase已经基本了解,再来从整体的角度理解其系统的架构。

  如图所示,HBase的整体系统架构如图所示,其中包含了客户端、Zookeeper、Master、RegionServer、HDFS这些基本实体。我们来做一个总结:

  客户端:客户端包含访问HBase的接口,同时在缓存中维护着已经访问过的Region位置信息,用来加快后续数据访问过程。

  Zookeeper服务器:HBase依赖于Zookeeper,它管理一个Zookeeper实例,作为集群的权威机构,之前我们看到root表的位置信息保存在Zookeeper服务器上,客户端通过Zookeeper才可以得到meta目录表的位置以及主控机的地址等信息,也就是说Zookeeper是整个HBase集群的注册机构,另外,Zookeeper可以帮助选举出一个Master作为集群的总管,并保证在任何时刻总有唯一一个Master在运行,这就避免了Master的“单点失效”问题。

  主控机Master:主服务器Master主要负责表和Region的管理工作:管理用户对表的增加、删除、修改、查询等操作、实现不同Region服务器之间的负载均衡、在Region分裂或合并后,负责重新调整Region的分布、对发生故障失效的Region服务器上的Region进行迁移等。

  Region服务器:Region服务器是HBase中最核心的模块,负责维护分配给自己的Region,并响应用户的读写请求。

  HDFS:我们在一开始提到:HBase是基于HDFS开发的,也提到过一个列族的数据在磁盘上作为一个文件存储在一起,这里实际就是使用HDFS来持久化存储数据,是实际的数据存储的地方。

【HBase】二、HBase实现原理及系统架构的更多相关文章

  1. Android入门(二):Android的系统架构

    android的系统架构和其操作系统一样,采用了分层的架构.从架构图看,android分为四个层,从高层到低层分别是应用程序层.应用程序框架层.系统运行库层和linux核心层.   从技术方面看,An ...

  2. 【Tomcat】Tomcat原理与系统架构

    目录 版本: 一,目录说明 二,浏览器访问服务器的流程 三,Tomcat系统总体架构 3.1 Tomcat请求的大致流程 3.2 Servlet容器处理请求流程 3.3 Tomcat系统总体架构 四, ...

  3. 消息队列RabbitMQ(二):RabbitMQ的系统架构概述

    前言 RabbitMQ是基于AMQP协议的,要想深入理解RabbitMQ,就必须先了解AMQP是个什么东东? AMQP协议 AMQP即Advanced Message Queuing Protocol ...

  4. 【Java进阶面试系列之一】哥们,你们的系统架构中为什么要引入消息中间件?

    转: [Java进阶面试系列之一]哥们,你们的系统架构中为什么要引入消息中间件? **这篇文章开始,我们把消息中间件这块高频的面试题给大家说一下,也会涵盖一些MQ中间件常见的技术问题. 这里大家可以关 ...

  5. HBase 学习之路(二)—— HBase系统架构及数据结构

    一.基本概念 一个典型的Hbase Table 表如下: 1.1 Row Key (行键) Row Key是用来检索记录的主键.想要访问HBase Table中的数据,只有以下三种方式: 通过指定的R ...

  6. HBase 系列(二)—— HBase 系统架构及数据结构

    一.基本概念 一个典型的 Hbase Table 表如下: 1.1 Row Key (行键) Row Key 是用来检索记录的主键.想要访问 HBase Table 中的数据,只有以下三种方式: 通过 ...

  7. HBase 系统架构及数据结构

    一.基本概念     2.1 Row Key (行键)     2.2 Column Family(列族)     2.3 Column Qualifier (列限定符)     2.4 Column ...

  8. Hbase 系统架构(zhuan)

    一.系统架构 客户端连接hbase依赖于zookeeper,hbase存储依赖于hadoop client: 1.包含访问 hbase 的接口, client 维护着一些 cache(缓存) 来加快对 ...

  9. 列式存储hbase系统架构学习

    一.Hbase简介 HBase是一个开源的非关系型分布式数据库(NoSQL),它参考了谷歌的BigTable建模,实现的编程语言为 Java.它是Apache软件基金会的Hadoop项目的一部分,运行 ...

随机推荐

  1. Codeforces 976 正方格蛇形走位 二维偏序包含区间 度数图构造 贪心心火牧最大dmg

    A #include <bits/stdc++.h> using namespace std; typedef unsigned long long ull; int main() { i ...

  2. Yii和ThinkPHP对比心得

    本人小菜鸟一只,为了自我学习和交流PHP(jquery,linux,lamp,shell,javascript,服务器)等一系列的知识,小菜鸟创建了一个群.希望光临本博客的人可以进来交流.寻求共同发展 ...

  3. FCC 成都社区·前端周刊 第 3 期

    01. Chrome65 的新功能 CSS Paint API 允许使用编程方式生成图像:Server Timing API允许服务器将时间信息通过HTTP headers传递给浏览器: CSS di ...

  4. 基础习题1——print

    引号内,空格就表示空格,引号外,逗号表示空格 print('100+200 =',100 + 200)===100+200 = 300 print('hello','world')===hello w ...

  5. python 面向对象_1

    self #self 是相当于c++的 this指针 class Ball: def setName(self,name): self.name = name def kick(self): prin ...

  6. 一些 sql 调优的总结

    一.sql 优化方案 1)列类型尽量定义成数值类型,且长度尽可能短,如主键和外键,类型字段等等   2)建立单列索引   3)根据需要建立多列联合索引.当单个列过滤之后还有很多数据,那么索引的效率将会 ...

  7. asp.net批量下载

    1.首先读取文件夹下的文件,可能同时存在多个文件 2.选中文件,然后点击下载,同时可以选择多个文件. 思路:通过生产压缩包的形式进行下载,然后再清楚压缩包,这样用户可以一次性全部下载下来. 一.获取目 ...

  8. Codeforces 960F Pathwalks ( LIS && 树状数组 )

    题意 : 给出若干个边,每条边按照给出的顺序编号,问你找到一条最长的边权以及边的编号同时严格升序的一条路径,要使得这条路径包含的边尽可能多,最后输出边的条数 分析 :  这题和 LIS 很相似,不同的 ...

  9. UML——概述

    1. 静态视图(类图)      静态视图不描述与时间相关的系统行为,这种行为在其他视图中描述,因此称之为静态试图.      静态视图用类图来实现,正因为它以类图为中心,因此也称之为类图.     ...

  10. 【学习小记】Berlekamp-Massey算法

    Preface BM算法是用来求一个数列的最短线性递推式的. 形式化的,BM算法能够对于长度为n的有穷数列或者已知其满足线性递推的无穷数列\(a\),找到最短的长度为m的有穷数列\(c\),满足对于所 ...