高性能存储架构---HBase
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高性能存储架构---HBase相关的知识,希望对你有一定的参考价值。
关系型数据库的瓶颈
- 海量数据的高效率读写
网站每天产生的数据量是巨大的,对于关系型数据库来说, 需要进行主从复制、分库分表、垂直/水平拆分等处理来支持海量数据的存储与查询,势必会造成一些问题:放弃join、聚合函数,不定时扩容、数据迁移,B+树过大、过深,老数据访问较少,B+树上层缓存的部分信息无用。
- 高并发读写需求
网站的用户并发性非常高,往往达到每秒上万次读写请求,对于传统关系型数据库来说,需要维护B+树结构,硬盘I/O是一个很大的瓶颈。
- 高扩展性和可用性
在基于web的结构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移。
- 模式固定,存储结构化数据
关系数据库的另一个特点就是其具有固定的表结构,因此,其扩展性极差,对于系统的升级,功能的增加,往往意味着数据结构巨大变动,这一点关系型数据库也难以应付,需要新的结构化数据存储
HBase产生背景
上面提到,随着数据规模越来越大,大量业务场景开始考虑数据存储的水平扩展,海量数据量存储成为提升应用性能的瓶颈,另外数据结构更加复杂,固定的表结构不在适应海量的数据结构。
相对于mysql的瓶颈,Hbase有如下的特点
- 模式自由:不像传统的关系型数据库需要定义数据库、数据表等结构才可以存取数据,数据表中的每一条记录都可能有不同的属性和格式;
- 逆范式:去除约束,降低事务要求,更利于数据的分布式存储,与MySQL范式相反;
- 多分区存储:存储在多个节点上,很好地进行水平扩展,提高数据的读、写性能;
- 多副本异步复制:为了保证数据的安全性,会保存数据的多个副本;
- 弹性可扩展:可以在系统运行过程中动态的增删节点,数据自动平衡移动,不需要人工的干预操作;
- 软事务:事务是关系型数据库的一个特点,NoSQL数据库不能完全满足事务的ACID特性,但是能保证事务的最终一致性;
HBASE是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统。其主要作用是通过分布式的集群系统进行海量数据的存储与处理。其主要的优点有:
- 线性扩展,随着数据量增多可以通过节点扩展进行支撑
- 数据存在hdfs上面,备份机制健全
- 通过zookeeper协调查找数据,读取速度快。
- 良好的数据备份与恢复机制,数据安全性由保障。
HBase的数据模型
HBase是一个稀疏、多维度、排序的映射表,这张表的索引是行键、列族、列限定符和时间戳每个值是一个未经解释的字符串。
表(Table):一个HBase表由行和列组成,列划分为若干个 列族。
行(Row):在表里面,每一行代表着一个数据对象,每一行都是以一个行键(Row Key)来进行唯一标识,行键可以是任意字符串,在HBase内部,行键保存为字符数组,数据存储时,按照行键的字典序排列。
列族(Column Family):列族支持动态扩展,可以很轻松地添加一个列族或列,无需预先定义列的数量以及类型,所有列均以字符串形式存储,用户需要自行进行数据类型地转换。一个HBase表被分组成为许多“列族”的集合,它是基本的访问控制单元。
列标识(Column Qualifier):列族中的数据通过列标识符来进行定位,列标识也没有特定的数据类型,以二进制字节来存储。
时间戳(Timestap):默认每一个单元中的数据插入时都会用时间戳来进行版本标识。读取单元数据时,如果时间戳没有被指定,则默认返回最新你的数据,写入新的单元格数据时,如果没有设置时间戳,默认用当前时间。
单元格(Cell):每一个行键,列族和列标识符共同确定一个单元,存储在单元里的数据称为单元数据。
HBase的架构设计
HMaster
HMaster 是 HBase 集群的主节点,负责整个集群的管理工作,主要工作职责如下:
- 分配Region:负责启动的时候分配Region到具体的 RegionServer;
- 负载均衡:一方面负责将用户的数据均衡地分布在各个 Region Server 上,防止Region Server数据倾斜过载。另一方面负责将用户的请求均衡地分布在各个 Region Server 上,防止Region Server 请求过热;
- 维护数据:发现失效的 Region,并将失效的 Region 分配到正常的 RegionServer 上,并且在Region Sever 失效的时候,协调对应的HLog进行任务的拆分。
如果master节点不可用,大部分情况下是不会耽误数据的读写,因为读写的入口是zookeeper,直到region的大小达到了split的阈值或者其他相关的元数据或者集群状态管理操作触发的时候
ZooKeeper
HBase 通过 ZooKeeper 来完成选举 HMaster、监控 Region Server、维护元数据集群配置等工作,主要工作职责如下:
- 选举HMaster:通ooKeeper来保证集中有1HMaster在运行,如果 HMaster 异常,则会通过选举机制产生新的 HMaster 来提供服务;
- 监控Region Server: 通过 ZooKeeper 来监控 Region Server 的状态,当Region Server 有异常的时候,通过回调的形式通知 HMaster 有关Region Server 上下线的信息;
- 维护元数据和集群配置:通过zooKeeper存储信息并对外提供访问接口。
HDFS
HDFS 为 HBase 提供底层数据存储服务,同时为 HBase提供高可用的支持, HBase 将 HLog 存储在 HDFS 上,当服务器发生异常宕机时,可以重放 HLog 来恢复数据。
Region Server
Region Server 直接对接用户的读写请求,是真正的干活的节点,主要工作职责如下。
- 管理 HMaster 为其分配的 Region;
- 负责与底层的 HDFS 交互,存储数据到 HDFS;
- 负责 Region 变大以后的拆分以及 StoreFile 的合并工作
Region:每一个 Region 都有起始 RowKey 和结束 RowKey,代表了存储的Row的范围,保存着表中某段连续的数据。一开始每个表都只有一个 Region,随着数据量不断增加,当 Region 大小达到一个阀值时,Region 就会被 Regio Server 水平切分成两个新的 Region。当 Region 很多时,HMaster 会将 Region 保存到其他 Region Server 上。
Store:一个 Region 由多个 Store 组成,每个 Store 都对应一个 Column Family, Store 包含 MemStore 和 StoreFile。
- MemStore:作为HBase的内存数据存储,数据的写操作会先写到 MemStore 中,当MemStore 中的数据增长到一个阈值(默认64M)后,Region Server 会启动 flasheatch 进程将 MemStore 中的数据写人 StoreFile 持久化存储,每次写入后都形成一个单独的 StoreFile。当客户端检索数据时,先在 MemStore中查找,如果MemStore 中不存在,则会在 StoreFile 中继续查找。
- StoreFile:MemStore 内存中的数据写到文件后就是StoreFile,StoreFile底层是以 HFile 的格式保存。HBase以Store的大小来判断是否需要切分Region。
当一个Region 中所有 StoreFile 的大小和数量都增长到超过一个阈值时,HMaster 会把当前Region分割为两个,并分配到其他 Region Server 上,实现负载均衡。
- HFile:HFile 和 StoreFile 是同一个文件,只不过站在 HDFS 的角度称这个文件为HFile,站在HBase的角度就称这个文件为StoreFile。
- HLog:负责记录着数据的操作日志,当HBase出现故障时可以进行日志重放、故障恢复。例如,磁盘掉电导致 MemStore中的数据没有持久化存储到 StoreFile,这时就可以通过HLog日志重放来恢复数据
读流程
- Client先访问zookeeper,从meta表读取region的位置,然后读取meta表中的数据。meta中又存储了用户表的region信息;
- 根据namespace、表名和rowkey在meta表中找到对应的region信息;
- 找到这个region对应的regionserver;
- 查找对应的region;
- 先从MemStore找数据,如果没有,再到BlockCache里面读;
- BlockCache还没有,再到StoreFile上读(为了读取的效率);
- 如果是从StoreFile里面读取的数据,不是直接返回给客户端,而是先写入BlockCache,再返回给客户端
写流程
LSM
以上是关于高性能存储架构---HBase的主要内容,如果未能解决你的问题,请参考以下文章