HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,是谷歌BigTable的开源实现,主要用来存储非结构化和半结构化数据。
HBase数据模型
HBase是一个稀疏、多维度、排序的映射表,表的索引是行键(Row Key)、列族(Column Family)、列限定符(Column Qualifier)和时间戳(Timestamp)。值是一个未经解释的字符串,没有数据类型。用户在表中存储数据,每一行都有一个可排序的行键和任意多的列。
表
HBase采用表来组织数据,表由行和列组成,列划分为若干个列族。
行
HBase表由若干行组成,每个行由行键标识。访问行的三种方式:1、通过单个行键访问;2、通过一个行键的区间;3、全表扫描。行键可以是任意字符串(最大长度64KB,实际应用中10~100byte)。行键保存为字节数组,并按照字典序排序存储。
列族
HBase表是许多列族的集合,列族是基本的访问控制单元。存储在一个列族的所有数据,通常都属于同一数据类型。列名都以列族作为前缀,例如course:history和course:math都属于course这个列族。访问控制、磁盘和内存的使用统计都是在列祖层面进行的。
列限定符
列族数据通过列限定符来定位,列限定符没有数据类型,视为字节数组byte[]。
单元格
HBase表中,通过行键、列族和列限定符确定一个单元格(Cell),单元格存储的数据没有数据类型,也视为byte[]。每个单元格可以保存一个数据的多个版本,每个版本对应一个时间戳。
时间戳
时间戳是每个单元格数据版本的索引,一般是64位整型,用户赋值或HBase数据写入时自动赋值。每次对单元格执行操作(新建、修改、删除)时,HBase会隐式生成并存储一个时间戳,在单元格中顺序存储来表征数据版本。

表在水平方向由一个或多个列族组成,一个列族可以包含任意多个列,同一个列族的数据存储在一起。列族支持动态扩展,可以任意添加多个列族或列。由于同一张表里每一行数据都可以有截然不同的列,因此对于整个映射表数据来说,有些列的值就是空的,所以说HBase是稀疏的。
HBase执行更新操作时,不会删除数据的旧版本,而是生成一个新版本,旧版本仍然保留。查询数据时,可以有两种数据返回方式:1、返回最近的n个版本;2、返回最近一段时间内的版本。
数据坐标
HBase根据行键、列族、列限定符和时间戳来确定一个单元格,因此可以视为一个四维坐标,即[行键,列族,列限定符,时间戳]。也可以看成一个键值数据库。

概念视图
概念视图中,一个表可以视为一个稀疏、多维的映射关系。每个行都包含相同的列族,尽管存在列族没有数据,可以看出稀疏这一特点。

物理视图
采用基于列的存储方式。如果某些列是空的,则在物理视图中不会有存储体现。

行式数据库:使用NSM(N-ary Storage Model)存储模型,一个元组(行)会被连续存在磁盘页。数据是一行行存储,第一行写入磁盘页,然后再继续写入第二行。适合处理小批量数据。
列式数据库:使用DSM(Decomposition Storage Model)存储模型,一个有n个属性的关系会被分解成n个子关系,每个子关系单独存储,每个子关系只有相应的属性被请求时才会被访问。适合批量数据处理和即席查询。
HBase实现原理
HBase实现包括3个功能组件:库函数,负责链接到每个客户端;一个Master主服务器,负责管理和维护HBase表的分区信息(如Region的分配和维护),以及处理模式变化(如表和列族的创建、维护);许多Region服务器,负责存储和维护分配给自己的Region,处理来自客户端的读写请求。
根据行键对表进行分区,每个行区间构成一个分区,称为Region,包含了位于某个值域区间的所有数据,是负载均衡和数据分发的基本单位。每个Region有一个RegionID来标识唯一性,所以一个Region标识符可以表示为“表名+开始主键+RegionID”。
HBase使用类似B+树的三层结构来保存Region位置信息:

三级寻址:客户端访问数据前,需要先访问Zookeeper,获取-ROOT-表位置信息,然后访问-ROOT-表获得.META.表信息,接着访问.META.表找到所需Region位于哪个Region服务器,最后到该服务器读取数据。
HBase运行机制
HBase系统架构包括:客户端、Zookeeper服务器(集群的总管理者)、Master服务器(负责表和Region的管理)、Region服务器(最核心模块,维护分配给自己的Region,响应客户端读写请求),一般采用HDFS作为底层数据。

Region服务器内部管理一系列Region对象和一个HLog文件,HLog保存在磁盘,记录所有的更新操作,来保证系统发生故障时能恢复到正确状态。每个Region对象由多个Store组成。每个Store对应一个列族的存储,包含一个MemStore和若干个StoreFile,MemStore是内存中的缓存,保存最近更新的数据;StoreFile保存在磁盘,这些文件都是B树结构,底层是HDFS的HFile,采用压缩式存储,大大减少了网络I/O和磁盘I/O。
Not Only SQL
NoSQL四大类型:键值数据库、列族数据库、文档数据库、图数据库。
NoSQL BASE 特性:基本可用(basically available)、软状态(soft-state)、最终一致性(eventual consistency)。
数据库事务ACID特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
云数据库系统功能:容灾、读写分离、分库分表、资源管理、资源调度、资源隔离、数据安全。