列式存储数据库概述
- 列式数据库是以列相关存储架构进行数据存储的数据库,主要适合于批量数据处理和及时查询。
- 列式数据库把一列中的数据值串在一起存储起来,然后存储下一列的数据。
- 行式数据库的特点
- 数据按行存储
- 操作某列必需读入整行
- 建索引或聚合表需花费大量时间和资源
- 列式存储数据库特点
- 数据按列存储->每一列单独存放
- 数据即是索引
- 只访问查询涉及的列->大量降低系统IO
- 每一列由一个线程来处理->查询并发处理
- 数据类型一致,数据特征相似->方便压缩
- 传统的行存储数据库存储的数据差异较大,压缩效果不好
- 列存储适合轻量级压缩
列式存储数据库中的索引
- 块级索引
- 数据分块,对块建立索引而不是对条目建立索引
- 块级索引一般都是粗粒度
- 举例
- 每个数据块的块索引记录该块数据的最大值和最小值
- 查询时,根据条件,就可以判断符合条件的数据是否命中该数据块
- 如果进行max,sum等聚合操作,可以直接从块索引读取数据而不用读取块内数据
- 位图索引
- 位图索引一般建立在列的cardinality(基数)比较低的情况下
- 举例:性别属性只有男和女,那么这个列的cardinality就是2
HBase的历史与发展
HBase的起源
- HBase是Google公司云计算平台中Big Table数据库的开源实现
- Google云计算技术具体包括
- Google文件系统海量数据分布存储技术(GFS, Google File System)
- 分布式计算编程模型Map Reduce
- 分布式锁服务Chuuby
- 分布式结构化数据存储系统Big Table等
GFS(Google File System)
- 一个适用于大规模分布式数据处理相关应用的,可拓展的分布式文件系统
- 基于普通的不算昂贵的硬件设备,实现了容错的设计,且为大量客户端提供极高的聚合处理性能
- GFS的设计思路(同样适用于BigTable 和HBase)
- 将文件划分为若干块(Chunk)存储,每个块固定大小(64M)
- 通过冗余来提高可靠性,每个数据块至少在3个数据块服务器上冗余
- 通过单个master来协调数据访问、元数据存储。结构简单,容易保持元数据一致性。
- 特点
- GFS将容错的任务交给文件系统完成,利用软件的方法解决系统可靠性的问题,使存储的成本成被下降
- GFS将服务器故障视为正常现象,并采用多种方法,从多个角度,使用不同的容错措施。
- 确保数据存储的安全、保证实施不间断的数据存储服务
- GFS架构
- Client(客户端):应用程序的访问接口
- Master(主服务器):管理节点,在逻辑上只有一个,保存系统的元数据,负则整个文件系统的管理
- Chunk Server(数据块服务器):负则具体的存储工作,数据以文件的形式存储在Chunk Server上
分布式结构化数据表Big Table
- 设计动机
- 需要存储与计算的数据种类繁多:包括URL、网页内容、用户的个性化设置等。
- 海量的服务请求:繁忙的查询请求,Google每时每刻处理海量的客户服务请求
- 商用数据库无法满足Google的需求:一方面现有的商用数据库设计着眼于通用性,无法满足Google的苛刻服务要求,另一方面对于底层系统的完全掌握会给后期的系统维护、升级带来极大的便利。
- 设计目标
- 广泛的适用性:Big Table是为了满足系列Google产品而非特定产品存储要求
- 高可用性:确保系统在多种存取状态下均可用,包括高并发、高吞吐量等情况。
- 高可拓展性:根据需要随时可以加入或撤销服务器
- 简单性:底层系统简单性既可减少系统出错概率,也为上层应用开发带来便利。
- Big Table的数据模型
-
Bigtable是一个分布式多维映射表
- 表中的数据通过一个行关键字(Row Key)、一个列关键字(Column Key)以及一个时间戳(Time Stamp)进行索引
- Bigtable对存储在其中的数据不做任何解析,一律看作字符串
- Bigtable的存储逻辑可以表示为(row:string, column:string, time:int64)->字符串
-
行
- Bigtable的行关键字可以是任意的字符串,但是大小不能操作64kb
- Bigtable和传统的关系型数据库不同,它不支持一般意义上的事务,但能保证对于行的读写操作具有原子性
- 表中数据都是根据行关键字进行排序的,排序使用的是字典序。
- 示例:com.cnn.www是一个行关键字,不直接存储网页地址而存储其倒排
- 带来两个好处:同一地址域的网页会被存储在表中的连续位置,有利于用户查找和分析;倒排便于数据压缩,可以大幅提高压缩率。
-
列
- BigTable并不是简单的存储所有的关键字,而是将其组织成列族,每个族中的数据都属于同一个类型,并且同族的数据会被压缩在一起保存
- 引入了列族这个概念后,列关键字采用下述的语法规则定义
- 族名:限定词(family: qualifier)
- 族名必需有意义,限定词则可以任意选定
- 图中,内容、锚点都是不同的族;而cnnsi.com和my.lock.ca则是锚点族中不同的限定词
- 族同时也是Bigtable中访问控制(Access Control)基本单元,即访问权限的设置是在族这一级别上进行的。
-
时间戳
- 为了简化不同版本的数据管理,Bigtable目前提供了两种设置
- 一种是保留最近的N个不同版本,图中数据模型采取的就是这种方法,它保存最新的三个版本数据
- 另一种就是保留限定时间内的所有不同版本,比如可以保存最近10天的所有不同版本数据
-
- Big Table架构
- Big Table数据库的架构,由主服务器和分服务器构成,将数据库划分为基本的小表,称为Tablet,是Big Table中最小的处理单位
- 主服务器负则将Tablet分配到Tablet服务器,检测新增和过期的Tablet服务器,平衡Tablet服务器之间的负载,GFS垃圾文件的回收,数据模式的改变(例如创建表)等
- Tablet服务器负则处理数据的读写,并在Tablet规模过大时进行拆分
- Bigtablet使用集群管理系统来调度任务、管理资源、检测服务器状态并处理服务器故障。