hbase概述
- 是一个面向列存储的NoSQL数据库
- 是一个分布式Hash Map,底层数据是Key-Value格式
- 基于Google Big Table论文
- 使用HDFS作为存储并利用其可靠性
HBase特点
- 数据访问速度快,响应时间约2-20毫秒
- 支持随机读写,每个节点20k~100k+ ops/s
- 可扩展性,可扩展到20,000+节点
- 高并发
HBase物理架构
-
ZooKeeper
1、存储-ROOT-表和.META.表的位置,.META.表记录普通用户表的HRegion标识符的信息(元数据的入口)
2、客户端访问数据前先访问ZooKeeper->-ROOT-表->.META.表
3、监控各个机器的状态,当HRegionServer发生故障,通知HMaster进行HRegion迁移;
4、ZooKeeper负责恢复HMaster(高可用)
-
HMaster
1、是HBase集群的主节点,可以配置多个,用来实现HA
2、管理用户对表的增删改查
3、管理HRegionServer的负载均衡,调整HRegion分布
4、在HRegion分裂后,负责新的HRegion分配
5、在HRegionServer停机后,负责失效HRegionServer上的HRegion迁移
6、通过ZooKeeper发布自己的位置给客户端
-
HRegionServer
一个RegionServer包含一个WAL、一个BlockCache (读缓存)和多个Region
WAL(Write-Ahead logfile)预写日志:数据在写入内存之前会先写在一个叫做Write-Ahead logfile的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建
1、负责和底层HDFS的交互,存储数据到HDFS,HBase是依托于HDFS的NoSQL数据库,数据会存储在HDFS上
2、负责响应用户的I/O请求,向HDFS中读写数据,刷新缓存到HDFS
3、处理分配给它的HRegion,负责处理HRegion变大后的拆分
4、负责StoreFile的合并工作
5、维护HLog(用于存储数据日志,HLog文件用于故障恢复)
-
HRegion
1、可以看成是表的横向切分,HBase表的分片
2、HBase每个表都会根据RowKey值被切分成不同的HRegion分散存储在HRegionServer 中
3、HRegionServer中可以有多个不同的HRegion,一个HRegion只能在一个HRegionServer 上,不能跨多个HRegionServer
4、每一个Region内部,又分为多个 Store,一个Store对应表中的一个列族
5、一个Store包含多个StoreFile和MemStore组成
6、一个StoreFile对应于一个HFile和一个列族
7、StoreFile是以HFile的形式存储在HDFS的,文件内容是二进制
8、MemStore:是内存存储,用来保存当前的数据操作,所以当数据保存在WAL中之后,HRegsionServer 会在内存中存储键值对
HBase 数据存储结构
-
RowKey
1、是用来检索记录的主键
2、可以是任意字符串,最大长度是64KB
3、在HBase内部,RowKey保存为字节数组;存储时数据按照 RowKey 的字典序排序存储
-
Column Family
1、Region,将一个表横向上切成多个 Region,列族是在纵向进行切分的,将多列分成一组进行管理
2、每一个列族对应一个Store,也对应HDFS一个目录
-
Cell
1、由{RowKey, ColumnFamily, Version} 唯一确定的单元。其中 Versions 实际上是TimeStamp。
2、Cell 可以看成是一个存储空间,类似与 Excel 中的单元格,Cell 中的数据是没有类型的,全部是字节码形式存储。
-
Time Stamp
1、每个 Cell 都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64 位整型
2、时间戳可以由 HBase(在数据写入时自动 )赋值,此时时间戳是精确到毫秒 的当前系统时间。时间戳也可以由客户显式赋值
3、每个 cell 中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面
HBase 原理
-
元数据存储
1、HBase中有一个系统表 hbase:meta存储HBase元数据信息
2、该表记录保存了每个表的Region地址,还有一些其他信息,例如Region的名字,对应表的名字,开始行键,结束行键,服务器的信息
-
读流程
1.Client先访问ZooKeeper,通过ZooKeeper的“/hbase/meta-region-server”获取存储“hbase:meta”表的HRegionServer的地址;
2.根据RowKey在meta表中找到对应的Region信息;
3.找到这个Region对应的RegionServer,并发送读数据请求;
4.先从MemStore找数据,如果没有,再到BlockCache里面读;
5.BlockCache还没有,再到StoreFile上读(为了读取的效率);
6.如果是从StoreFile里面读取的数据,不是直接返回给客户端,而是先写入BlockCache,再返回给客户端。
1、Client访问ZooKeeper,获取Meta表所处HRegionServer位置
2、访问Meta表,然后读取Meta表中的数据。
3、根据namespace表名和RowKey在Meta表中找到该RowKey应该写入到哪个Region。
4、找到这个Region对应的RegionServer,并发送写数据请求
5、HRegionServer将数据先写到HLog(Write Ahead Log),为了数据的持久化和恢复;
6、HRegionServer将数据写到内存(MemStore);
7、反馈Client写成功。
-
数据Flush过程
1、memstore->(memstore达到阀值)启动flashcache->storefile
2、每次写操作单独生成一个storefile,当storefile达到一定的数量系统会合并成更大的storefile
3、当region上的所有storefile大小和数量达到阀值,会分裂成两个region
4、再由hmaster分配分裂除的region到相应的regionserver上,实现负载均衡