文章首先回顾 HBase 的数据模型和数据层级结构,对数据的每个层级的作用和构架均进行了详细阐述;随后介绍了数据写入和读取的详细流程;最后介绍老版本到新版本 Region 查找的演进。
一.数据模型
1.重要概念回顾
Namespace(表命名空间):将多个表分到一个组进行统一管理。
Table(表):一个表由一个或者多个列族组成;数据属性比如:超时时间(TTL),压缩算法(COMPRESSION)等,都在列族的定义中定义;定义完列族后表是空的,只有添加了行,表才有数据。
Row(行):一个行包含了多个列,这些列通过列族来分类;行中的数据所属列族只能从该表所定义的列族中选取;由于 HBase 是一个列式数据库,所以一个行中的数据可以分布在不同的服务器上。
Column Family(列族):列族是多个列的集合,HBase 会尽量把同一个列族的列放到同一个服务器上,这样可以提高存取性能,并且可以批量管理有关联的一堆列;所有的数据属性都是定义在列族上;在 HBase 中,建表定义的不是列,而是列族。
Column Qualifier(列):多个列组成一个行,列族和列经常用
Column Family: Column Qualifier
来一起表示,列是可以随意定义的,一个行中的列不限名字、不限数量。Cell(单元格):一个列中可以存储多个版本的数据,而每个版本就称为一个单元格(Cell),所以在 HBase 中的单元格跟传统关系型数据库的单元格概念不一样;HBase 中的数据细粒度比传统数据结构更细一级,同一个位置的数据还细分成多个版本。
Timestamp(时间戳/版本号):既可以把它称为是时间戳,也可以称为是版本号,因为它是用来标定同一个列中多个单元格的版本号的。不指定版本号的时候,系统会自动采用当前的时间戳来作为版本号;当手动定义了一个数字来当作版本号的时候,这个 Timestamp 就真的是只有版本号的意义了。
2.几个小问题
HBase是否支持表关联?
官方给出的答案是干脆的,那就是“不支持”。如果想实现数据之间的关联,就必须自己去实现了,这是挑选 NoSQL 数据库必须付出的代价。
HBase 是否支持 ACID?
ACID 就是 Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)、Durability(持久性)的首字母缩写,ACID 是事务正确执行的保证,HBase 部分支持 了 ACID。
表命名空间有什么用?
表命名空间主要是用来对表分组,那么对表分组有什么用?命名空间可以填补 HBase 无法在一个实例上分库的缺憾,通过命名空间我们可以像关系型数据库一样将表分组,对于不同的组进行不同的环境设定,比如配额管理、安全管理等。
HBase 中有两个保留表空间是预先定义好的:
hbase:系统表空间,用于组织 HBase 内部表;
default:那些没有定义表空间的表都被自动分配到这个表空间下。
二.HBase 的存储数据方式
1.架构回顾
一个 HBase 集群由一个 Master(也可以把两个 Master 做成 HighAvailable)和多个 RegionServer 组成。
Master:负责启动的时候分配 Region 到具体的 RegionServer,执行各种管理操作,比如 Region 的分割和合并。HBase 中的 Master 的角色功能比其他类型集群弱很多,HBase 的 Master 很特别,因为数据的读取和写入都跟它没什么关系,它挂了业务系统照样运行。当然 Master 也不能宕机太久,有很多必要的操作,比如创建表、修改列族配置,以及更重要的分割和合并都需要它的操作。
RegionServer:RegionServer 上有一个或者多个 Region,我们读写的数据就存储在 Region 上。如果你的 HBase 是基于 HDFS 的(单机 HBase 可基于本地磁盘),那么 Region 所有数据存取操作都是调用了 HDFS 的客户端接口来实现的。
Region:表的一部分数据,HBase 是一个会自动分片的数据库,一个 Region 就相当于关系型数据库中分区表的一个分区,或者 MongoDB 的一个分片。
HDFS:HBase 并不直接跟服务器的硬盘交互,而是跟 HDFS 交互,所以 HDFS 是真正承载数据的载体。
ZooKeeper:ZooKeeper 在 HBase 中的比 Master 更重要,把 Master 关掉业务系统照样跑,能读能写;但是把 ZooKeeper 关掉,就不能读取数据了,因为读取数据所需要的元数据表
hbase:meata
的位置存储在 ZooKeeper 上。
![2466d3e05dc43e53648bf0327c7dfc84.png](https://i-blog.csdnimg.cn/blog_migrate/c69203d58c820119e27627504243ecd0.jpeg)
2.RegionServer 内部架构
一个 RegionServer 包含有:
一个 WAL:预写日志,WAL 是 Write-Ahead Log 的缩写,就是:预先写入。当操作到达 Region 的时候,HBase 先把操作写到 WAL 里面去,HBase