NoSQL数据库
关系型数据库与NoSQL数据库的主要区别
CAP理论和BASE原则
HBase概述
HBase与关系数据库的对比
HBase应用场景
HBase数据模型
HBase表结构
行存储和列存储的比较
HBase架构
HBase架构介绍
HFile文件格式
Region定位(1)
Region定位(2)
用户读写数据过程
Flush机制
Compaction机制(1)
Compaction机制(2)
Region拆分
其他流程
HBase性能优化-行键
HBase性能优化-预分区
HBase性能优化-表热点现象
HBase常用操作
DDL操作(1)
DDL操作(2)
权限管理
NoSQL数据库
- NoSQL(not only sql),即“不仅仅是sql”。
- NoSQL数据库分类:
- 键值存储数据库
- 列存储数据库
- 文档数据库
- 图数据库
关系型数据库与NoSQL数据库的主要区别
CAP理论和BASE原则
- CAP理论
- 一致性
- 可用性
- 分区容错性
- BASE原则
- 基本可用
- 软状态
- 最终一致性
HBase概述
- HBase是一个高可靠性,高性能,面向列,可伸缩的分布式存储系统。
- 适合于存储大表数据(表的规模可以达到数十亿行以及数百行列),并且对大表数据的读,写
- 访问可以达到实时级别。
- 利用Hadoop HDFS作为其文件存储系统,提供实时读写的分布式数据库系统。
- 利用Zookeeper作为协同服务。
HBase与关系数据库的对比
- HBase与传统的关系数据库的区别主要体现在一下几个方面:、
- 数据索引:关系数据库通常可以针对不同列构建复杂的多个索引,以提高数据访问性能。HBase只有一个索引,即行键。通过巧妙的设计,HBase中的所有访问方法,或者通过行键访问,后者通过行键扫描,从而使得整个系统不会慢下来。
- 数据维护:在关系数据库中,更新操作会用最新的当前值去替换记录中原来的旧值,旧值被覆盖后就不会存在。而在HBase中执行更新操作时,并不会删除数据旧的版本,而是生成一个新的版本,旧有的版本仍然保留。
- 可伸缩性:关系数据库很难实现横向扩展,纵向国战的空间也比较有限。相反,HBase和BigTable这些分布式数据库就是为了实现灵活的水平扩展而开发的,能够轻易地通过在集群中增加或者减少硬件数量来实现性能的伸缩。
HBase应用场景
HBase数据模型
- 特点
- 一个表可以有上亿行,上百行列
- 面向列(族)的存储和权限控制,列(族)兜里检索
- 表结构稀疏,行和列的交叉点被称为cell,表的行键也是一段字节数组
- 所有的表都必须有主键,表是按key排序的
HBase表结构
- 表:HBase采用表来组织数据,表由行和列组成,列划分为若干个列族。
- 行:每个HBase表都由若干个行组成,每个行由行键来标识。
- 列族:一个HBase表被分组成许多“列族”的集合,他是基本的访问控制单元。
- 列限定符:列族里的数据通过列限定符(或列)来定位。
- 单元格:在HBase表中,通过行,列族和列限定符确定一个“单元格”(cell),单元格中村粗的数据没有数据类型,总被视为字节数组byte[]
- 时间戳:每个单元格都保存着同一份数据的多个版本,这些版本采用时间戳进行索引。
行存储和列存储的比较
- 行存储,数据按行存储在底层文件系统中。通常,每一个会被分配固定的空间。
- 优点:有利于增加/修改整行记录等操作;有利于整行数据的读取操作。
- 单列查询时,会读取一些不必要的数据。
- 列存储,数据以列为单位,存储在底层文件系统中。‘
- 优点:有利于面向单列数据的读取/统计等操作。
- 缺点:整行读取时,可能需要多次I/O操作。
HBase架构
HBase架构介绍
- 客户端
- 包含访问HBase的接口,并维护Cache来加快对HBase的访问
- HMaster
- 主要负责表和region的管理工作
- HRegionServer
- 主要负责相应用户的I/O请求,向HDFS中读/写数据
- 管理了一系列HRegin对象,每个HRegin由多个store组成
- ZooKeeper
HFile文件格式
- HFile文件格式分为如下6部分:
- Data Block:保存table中的数据
- Meta Block:保存用户自定义的key-value对
- file Info:HFile的元信息
- Data Block Index:Data Block的索引
- Trailer:这一段是定长的,保存了每一段的偏移量。
Region定位(1)
Region定位(2)
- 为了加快访问速度,.meta.表会被保存在内存中。
- 假设.META.表的每行(一个映射条目)在内存中大约占用1kb,并且每个Region限制为128MB.
- 两成结构可以保存的Region数目是128MB/1kb=2的17次方个Region。
用户读写数据过程
- 用户写入数据时,被分配到相应Region服务器去执行。
- 用户数据首先被写入到MemStore和Hlog中。
- 只有当操作写入Hlog之后,commit()调用才会将其返回给客户端。
- 党与胡读取数据时,Region服务器会首先访问MemStore缓存,如果找不到,再去磁盘上面的storefile中寻找。
Flush机制
- 触发MemSTORE的FLUSH操作场景
- MemStore到达HBase.hregion.memstore.flush.size(默认128MB),所有Memstore触发FLush。
- 当MemStore的内存用量比例到达HBase.regionserver.global.me mstore.upp -erlimit的指定大小时,触发Flush。Flush的顺序基于Memstore内存用量大小的倒序,直到MemStore内存用量小于HBase.regionserver.global.memstore.lowerlimiit.
- 当wal的日志数量超过HBase.regionserver.max.logs,MemStore就会FLush到磁盘,降低WAL中的日志数量。最“老”的MemStore会第一个被Flush,直到日志数量小于HBase.regionserver.max.logs。
- HBase定期Flush MemStore:默认周期为1小时,确保MemStore不会长时间没有持久化。
- 手动执行Flush。
Compaction机制(1)
- Minor Compaction是指选取一些小的,相邻的storefile,讲题目合并成一个更大的storefile。
- Major Compaction是指所有的StoreFile。
Compaction机制(2)
- 除法Compaction的因素
- MemStore Flush
- 后台线程周期性检查
- 手动触发
Region拆分
- 当Region的大小超过了预设的阈值时,HBase会拆分Region。
- Region拆分策略
- constantsizeregionsplitpolicy
- increasingtoupperboundregionsplitpolicy
- steppingsplitpolicy
- delimitedkeyprefixregionsplitpolicy
- disabledregionsplitpolicy
其他流程
- Region合并
- Region拆分更多处于提高性能的目的,但Region合并更多出于维护系统的目的。
- HLog工作原理
- 一种预写日志。
- 用户更新的数据必须先写入日志后,才能写入MemStore缓存。
- 知道MemStore缓存内容对应的日志已经写入磁盘,该缓存内容才能被Flush到磁盘。
HBase性能优化-行键
- 行键是按照字典序存储。因此,设计行键时,要充分利用这个排序特点,将经常一起读取的数据存储到一块,将最近可能会被访问的数据放在一块。
- 举个例子:如果最近写入HBase表中的数据是最可能被访问的,可以考虑将时间戳作为行键的一部分,由于是字典序排序,所以可以使用long.MAX_VALUE – timestamp作为行键,这样能保证新写入的数据在读取时可以被快速命中。
HBase性能优化-预分区
- 手动指定预分区
- 通过在创建表语句中指定行键的前缀界限来指定预分区
- create ‘person’,’info1′,’info2′,SPLITS=>[‘1000′,’2000′,’3000′,’4000’]
- 使用SPLITALGO的UniformSplit方式
- HexStringSplit适用于采用十六进制的字符串作为前缀的行键
- DecimalStringSplit适用于采用十进制数字字符串作为前缀的行键
- UniformSplit则适用于前缀完全随机的行键。
HBase性能优化-表热点现象
- 解决“热点”现象有如下几种方法:
- 预分区:让表中的数据可以均衡的分散在集群中
- 加盐:RowKey的前面增加随机数
- 反转:反转固定长度或者数字格式的行键,可以使得行键中经常改变的部分(最没有意义的部分)放在前面。
HBase常用操作
- 查看集群的状态
- hbase>status
- hbase>status ‘simple’
- hbase>status ‘summary’
- hbase>status ‘detailed’
- 帮助命令
- hbase>help
DDL操作(1)
- 列出所有表
- hbase>list
- 获取表的详细信息
- hbase>describe ‘tablename’
- 创建一张表
- create<table>,{NAME=><family> [VERSIONS=><version>…]}
- 修改一张表
- hbase>alter ‘t1’,NAME=> ‘f1’,VERSIONS=>5
DDL操作(2)
- 插入更新数据
- put <table>,<rowkey>,<family:column>,<value>,<timestamp>
- 查询数据
- get<table>,<rowkey>,[<family:column>,…]
- 扫描表
- scan <table>,{COLUMNS=>[<family:column>,…],LIMIT=>num}
- 删除某个值
- delete<table>,<rowkey>,<family:column>,<timestamp>
- 清空表
- truncate<table>(慎用)
权限管理
- 语法:
- grant <user> <permissions> <table> <column family> <column qualifier>
- 权限用R,W,X,C,A这5个字母表示,其对应关系为READ(‘R’),WRITE(‘w’),EXEC(‘x’),CREATE(‘C’),ADMIN(‘A’)
- 查看权限
- user_permission<table>
- 收回权限
- revoke <user> <table> <column family> <column qualifier>
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/277615.html