HBase
HBase是一个开源的非关系型分布式数据库,参考了谷歌的BigTable建模,实现编程语言是java。
HBase运行于HDFS文件系统上,同时有少量的数据存在自身的内存中,可以容错的存储海量稀疏数据,不能保证key就一定是有数据的。
HBase的特性包含了:高可靠,高并发读写,面向列,可伸缩,易构建。
HBase的优点:存储海量数据,快速随机访问,可以进行大量的读写操作(先写入内存再落地磁盘,所以支持改写)
数据模型
6149692d-27fd-4fb7-8e77-2d7809c292ef-2500378.jpgRowKey
- Byte array,表中每条记录的主键,方便快速查找
Column Family
- 列族,拥有一个名称(String),包含一个或者多个相关列,子列称为(Column qualifier)
Column Qualifier
- 属于某一个Column Family,familyName:columnName,每条记录可动态添加
- 如果一个列的数据需要更改,不是在原有的数据源上更改,而是新增一条数据,原有的数据源以一个版本的形式进行记录
Version Number
- 类型为Long,默认值是系统时间戳,可自定义
Value
- Byte array
物理模型
- 物理模型是支撑数据模型的实现,数据模型处理细节
- HBase相当于MR里的partition,相同的key肯定会出现在一个region上
- region是hbase集群分布数据的最小单位,类似HDFS中的block
- 一个region只能属于一个regionServer,一个regionServer可以拥有多个region
名词解析
Region(逻辑概念)
- 数目
- 太多:增加Zookeeper负担,造成读写性能下降
- 太少:降低读写并发的性能,导致压力不够分散
- 切分
- region按大小分割,初始只有一个region,数据增大到阀值时HRegion会等分为两个新的HRegion。默认10个G,超出会进行切分
- 对于region过大的要做切分,切成更小粒度的region,分散到其他regionServer上去来缓解压力,负载均衡,region越大,访问到该机器的概率越大
- 不允许系统自动切分,空闲时刻再做手动气氛,切分过程中,region是不能访问的,只能等
- 一个HRegion是不会拆分到多个server上的
HRegion(物理概念)
- HRegion指一个区域或者分区
RegionServer(逻辑概念)
- 一个节点(机器)里有多个region,节点称为RegionServer
- RegionServer里面存储很多Region(不一定来自同一个table)
HRegionServer(物理概念)
- HRegionServer当做一个机器上的进程,主要负责响应用户的IO请求,与HDFS交互
- HRegionServer存储着很多HRegion
- HRegion是HBase分布式存储和负载均衡的最小单元,但不是存储的最小单元
- HRegion里面有很多HStore,HStore是HBase核心的存储单元
HStore
- MemStore:是一块内存,主要负责写入数据,当达到128M,将内存flush成为一个StoreFile
- StoreFile(HFile-->HDFS,默认128M):对应着table的Column Family
HLog
日志机制,避免数据的丢失,一个regionServer上的所有region共享一个HLog
d2964b54-9aa2-483a-b56d-c77dc467f743-2500378.jpg
- WAL(write-ahead-log)预写日志
- 客户端往RegionServer提交数据,先写WAL日志和memstore,都写成功告知数据提交成功,反之告知客户端失败
- 一个RegionServer上的所有的region都共享一个HLog,一次数据的提交是先写WAL,成功后写入memstore,当memstore达到一定阈值,就会写成一个个storeFile
系统架构
Client
访问HBase的接口,并维护Cache加速RegionServer的访问
HMaster(主)
- 负载均衡
管理和分配HRegion(记录region分配到哪个regionServer,以及regionServer挂掉之后的region迁移) - 管理HRegion
DDL:增删改--->table,cf,namespace - 管理table元数据
类似于namenode,管理一些元数据(table-->table结构) - ACL权限控制
HRegionServer(从)
- 管理和存放本地的HRegion
- 读写HDFS,提供IO操作
- 维护table数据
- 本地化
HRegion的数据尽量和数据所属的DataNode在一块,但是这个本地化不能够总是满足和实现(HRegion是不断移动的,因为数据不断插入,HRegion是不断分裂的,本地化不能保证)
Zookeeper
- 提供了心跳机制,在master和zk之间、和regionServer之间
- 保证集群中只有一个master
- 存储所有region的入口(root)地址
- 实时监控regionServer的上下线信息,并通知master
Zookeeper协调集群所有节点的共享信息,在HMaser和HRegionServer连接到Zookeeper后创建Ephemeral节点(临时节点,监控心跳),并使用HeartBeat机制维持这个节点的存活状态,如果某个Ephemeral节点失效,则HMaser会收到通知,并做相应的处理
容错
master
Zookeeper重新选择一个新的master
- 无master过程中,数据读取仍照常进行
- 无master过程中,region切分/负载均衡等无法进行
regionServer
定时向Zookeeper汇报心跳,如果一段时间内未出现心跳,master将该regionServer上的region重新分配到其他regionServer上,失效服务器上“预写”日志由主服务器进行分割并派送给新的regionServer
Zookeeper
Zookeeper是一个可靠的服务,一般配置3或5个Zookeeper实例
写入流程
- 当客户端发起一个put请求时,首先它从hbase:meta表汇总查出该put数据最终需要去的HRegionServer,然后客户端将put请求发送给相应的HRegionServer,在HRegionServer中它首先会将put操作写入WAL日志(flush到磁盘中)
-
写完WAL日志文件后,HRegionServer根据put中的tableName和rowKey找到对应的HRegion,并根据Column Family找到对应的HStore,并将put写入到该HStore的memStore中,此时写成功,并返回通知客户端
images -
memStore是一个In Memory Sorted Buffer,在每个HStore中都有一个MemStore,即它是一个HRegion的一个Column Family对应一个实例。它的排列顺序以RowKey、Column Family、Column的顺序以及Timestamp的倒序
images
读取流程
- 从Zookeeper(/hbase/meta-region-server)中获取hbase:meta的位置(HRegionServer的位置),缓存该位置
hbase:meta这个表不做分裂,只存储用户表的元数据
- 从HRegionServer中查询用户Table对应请求的RowKey所在的HRegionServer,缓存该位置信息
- 从查询到的HRegionServer中读取Row
-
整行数据读取是从多个HFile中获取的,memStore中的是最新的数据,还没存储下来的数据,所以数据需要定期合并
images - HBase中扫描顺序依次是BlockCache,memStore,HFile
- BlockCache:LRU的算法,频繁操作,频繁读取的数据会提起缓存,长时间不用的数据会淘汰掉
- memStore:读缓存
-
HFile:读文件
images