HBase的数据大致存储原理
存储结构
- Table中的所有行都按照row key的字典序排列
- Table 在行的方向上分割为多个Region
- Region按大小分割的,每个表开始只有一个region,随着数据增多, region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region,之后会有越来越多的region ,不同Region分布到不同RegionServer上
- 每个Region包含多个Store,上一篇文章提到过一个Store用来存储一个列族
- Store又由一个memStore和0至多个StoreFile组成。memStore存储在内存中, StoreFile存储在HDFS上。这两者的作用接下来会提到
采用LSM树的方式存储数据
LSM树全称Log-Structured Merge-Tree(日志结构的合并树),它是B+树的变体
B+树的数据结构并不适合Hbase中的应用场景。这样的数据结构在内存中效率是很高的,但是 Hbase中数据是存储在文件中的,如果按照这样的结构来存储,意味着我们每一次插入数据都要由一级索引找到文件再在文件中间作操作来保证数据的有序性, 这无疑是效率低下的。
所以Hbase采用的是LSM树的结构,这种结构的关键是,每一次的插入操作都会先进入MemStore(内存缓冲区),当 MemStore达到上限的时候,Hbase会将内存中的数据输出为有序的StoreFile文件数据(根据Rowkey、列名、版本进行排序,这里已经和列簇无关了因为Store里都属于同一个列簇)。
这样会在Store中形成很多个小的StoreFile,当这些小的File数量达到一个阀值的时 候,Hbase会用一个线程来把这些小File合并成一个大的File。这样,Hbase就把效率低下的文件中的插入、移动操作转变成了单纯的文件输出、 合并操作。
LSM树的原理是把一颗大树拆分成N棵小树, 它首先写入到内存中(内存没有寻道速度的问题,随机写的性能得到大幅提升),在内存中构建一颗有序小树,随着小树越来越大,内存的小树会flush到磁盘上。
当读时,由于不知道数据在哪棵小树上,因此必须遍历所有的小树,但在每颗小树内部数据是有序的。
在内存中的小树即memstore,每次flush,内存中的memstore变成磁盘上一个新的storefile
Meta表
Meta表的作用
我们知道HBase的表是会分割为多个Region的,不同Region分布到不同RegionServer上。Region 是 HBase中分布式存储和负载均衡的最小单元。
所以当我们从客户端读取,写入数据的时候,我们就需要知道我们数据的 Rowkey是在哪个Region的范围以及我们需要的Region是在哪个RegionServer上。
而这正是Meta表所记录的信息。
Region的名字=MD5(region所在的表名+region的StartKey+时间戳)
Meta表的列族和列
- info列族:包含三个列,regioninfo,、server和serverstartcode
- regioninfo列:记录的Region的详细信息,包括StartKey, EndKey以及每个Family的信息等
- server:存储的是管理这个Region的RegionServer的地址
所以当Region被拆分、合并或者重新分配的时候,都需要来修改这张表的内容
Region的定位
Zookeeper中记录了-ROOT-表的location
-ROOT-表包含.META.表所在的region列表
- 第一次读取:步骤1,读取ZooKeeper中META表的位置。 步骤2,读取.META表中用户表的位置。 步骤3,读取数据
- 非第一次读取:-ROOT-表和.META表已经被缓存到本地,直接去用户表的位置读取数据。
在最新的Hbase版本中meta表和root表合并成了一个hbae:meta表
HBase的基本架构
在Hbase的概念中,RegionServer对应于集群中的一个节点,而一个RegionServer负责管理多个Region。一个Region代表一张表的一部分数据,
所以在Hbase中的一张表可能会需要很多个Region来存储其数据,但是每个Region中的数据并不是杂乱无章 的,Hbase在管理Region的时候会给每个Region定义一个Rowkey的范围,
落在特定范围内的数据将交给特定的Region,从而将负载分摊到多个节点上,充分利用分布式的优点
各个服务
Zookeeper
- Hbase中会存在多个Zookeeper实例,但是主要只使用其中一个
-
保证任何时候,集群中只有一个Master
-
存储所有的Region的寻址入口
- 存储-ROOT-表地址,Master地址
- 监控RegionServer,并实时通知给Master
Master
-
负责Region server的负载均衡
-
为Region server分配region
-
管理用户对table的增删改查操作
Region Server
- 维护region,处理对这些region的IO请求
- 负责切分在运行过程中变得过大的region
HBase与Zookeeper的关系
-
默认情况下,HBase管理Zookeeper实例,比如,启动或者停止Zookeeper
-
Master和RegionServer都需要和Zookeeper交互,
因为RegionServer上线后Zookeeper知道了告诉Master,而下线或断开了Zookeeper知道了也告诉Master -
Master与RegionServer启动时会向Zookeeper注册
-
Zookeeper的引入使得HMaster不再是单点故障