HiStore是阿里中间件团队研发的数据库产品,是一款基于独特的知识网格技术的列式数据库,定位于海量数据高压缩比列式存储,是低存 储成本,低维护成本,海量数据OLAP存储引擎;有效的解决了海量数据存储的成本问题,以及在百亿数据场景下支持实时高效的多维度自 由组合的检索。
关键字: 列式,分布式,高压缩比;
HiStore 专门针对OLAP应用程序进行设计和优化,在常规X86服务器上,HiStore可以在百亿数据场景下进行高性能,多维度自由组合 的adhoc查询. 相对比常规事务引擎,其查询速度提升了数倍甚至数十倍。此外HiStore完全兼容MySQL通讯协议和SQL语法,可以支持客户端 无代码修改进行迁移,并且无缝配合现有的MySQL客户端工具以及中间件数据层产品.
HiStore经过多个版本的迭代和深度定制化开发.现在HiStore各项指标(查询性能,数据装载效率)均超过原始版本,此外HiStore还增加了批量 数据Load,并发查询以及数据块复制等自研技术. 在我们团队所测试过的同类产品中(InfiniDB,Infobright等),HiStore的单机性能处于领先地位。
HiStore 采用基于知识网格分析和SMP优化的列式存储引擎. 该引擎为海量数据背景下的分析型(OLAP)应用而设计, 通过列式数据存储,知 识网格过滤,高效数据压缩和并行查询等特性, 为应用提供低成本和高性能的数据查询支持.
在描述HiStore的列存技术之前,可以先看看常见的行(row)式存储引擎的实现方式. 以MySQL为例,常见的事务引擎(InnoDB,TokuDB等)均采用基于ROW的存储模型:
记录(Record/Row)作为数据库中最小的逻辑存储单元, 每条记录包含了Table中各列的值.
通过PK(或Hidden ID)来标识唯一Row.
大部分存储引擎都采用基于B+树(或其变种)的聚簇存储(即row中的相关数据会与ID存储在一起). 此时各条记录在磁盘上的存储位置是相 邻的. 数据查询时直接从磁盘读取,不需要在内存中组装数据.
一般而言,每条记录总数据量不宜过大, 引擎会以记录为单位在内存中进行读写.
总结一下行(row)式存储引擎的适用场景:
但是针对海量数据背景的OLAP应用,随着数据量不断增长,行(row)式存储会出现诸如查询性能,存储效率和数据库维护等一系列问题:
数据仓库的构建以及海量数据下的OLAP查询:
select sum(score) from table;
假设该表中包含1M记录, 每条记录平均长度为1KB. 而 score 这个column为8字节. 在Row- based的存储中, 为了获取大概8M的数据,需要消耗大概 1GB的IO资源.
包含任意字段组合的 adhoc
查询,需要遍历大量数据(例如多维分析型查询):
ad-hoc
查询不可避免的会造成全表扫描: why? 不可能在Row-based engine中对所有列都添加索引! 如上述所,在海量数据背景下,行(row)式存储引擎无法从引擎自身解决查询性能和维护成本等问题.与行(row)式存储不同,HiStore引擎将数据按照关系列(Column)进行存储,每列占用单独的物理存储空间,查询时在内存中高效组装各列的值,最 终形成关系记录集:
数据按照列(Column)进行存储,每个列所对应的单元值(Cell)是最小的逻辑存储单元.
当数据记录按行式存储,应用程序必须读取每一条完整记录;当数据记录按列式存储,数据库只返回与部门相关的值。在分析应用程序中(不可 预测的ad-hoc查询),列式存储的方法可以显著减少IO消耗和降低查询响应时间,特别是大数据量查询和用户创建复杂即席查询的情况下:
任意列组合的adhoc 查询(BI系统等):
最后提一下列(Column)存的不适用场景:
为了达到合理利用IO资源,且高效,快速查找所需数据的目标. HiStore引擎将数据组织为两个层次:
知识网格(Knowledge Grid, KG).
数据块是存储的最低层,列中每份大小固定的单元组成一个数据块。数据块比列更小,具有更好的压缩比率;又比磁盘默认存储单元单元更大,具有更好的查询性能。
HiStore引擎利用知识网格架构来对查询优化器,计划执行和压缩算法等提供支持. 知识网格是HiStore 引擎进行快速数据查询的关键.在查询计划分析与构建过程中,通过知识网格可以消除或大量减少需要解压的数据块,降低IO消耗,提高查询响应时间和网络利用率。 对于大部分统计/聚合性查询, HiStore引擎往往只需要使用知识网格就能返回查询结果(而不需要读取数据), 这种情况下在1s时间内就可 以返回查询结果。
HiStore 知识网格由数据元信息节点(MD)和知识节点(KN)组成:
知识节点(KN)除了基础元数据外,还包括数据特征以及更深度的数据统信息. 知识节点在数据查询/装载过程中会动态计算.
每个段中分别使用1个bit标识是否有记录存在与该范围内.
关系位图记录多表join中关联的DN信息: 显著提高join查询性能,减少无效DN扫描.
通过知识网格, HiStore 引擎无需通过传统数据索引、数据分区、预测、手动调优或特定架构等方式就能高速处理复杂的分析查询。
对于来自客户端的查询请求,首先由查询优化器进行基于知识网格的优化,产生执行计划后再交给执行引擎去处理.
例子: 对于一个查询请求, 通过KG可以确定3个关联性DN和1个不确定性DN:
SELECT count(*) FROM employees where salary < 2500
HiStore 基于列数据类型和特定领域优化的高效压缩技术能提高查询速度,降低数据库磁盘容量。HiStore 引擎通过优化后的高效压缩处 理,可以在没有特意数据库调优和管理情况下确保性能需求;随着数据量的增长,可以最小化所需的存储和服务器容量,从而节约成本,达到具有 高性能、低成本的解决方案。
基于列进行数据压缩
字符串压缩: PPM 算法.
预处理数据导入

针对异构数据源背景海量数据背景, HiStore还提供了外部预处理导入支持,方便客户端应用在不增加HiStore 负载的情况下告诉导入外部 数据.
近视值查询依据存储在知识网格中每个数据节点的概率样本值, 进一步过滤不会对最终查询结果造成重点影响的数据节点(DN). 对于某些 对数据精确性要求不高的场景,近视值查询可以利用统计信息去除大量不影响最终结果的数据节点,显著提升查询性能.常见的近似查询场景: 海量数据下查询 top 10 记录.
HiStore引擎可以提供强大的数据查询和低成本的数据存储. 但是其自身的安装和管理需要一定的学习曲线. 为了更有效的推广HiStore存 储引擎,我们团队也正在开发配套的HiStore引擎管控平台. 通过HiStore管控平台,用户可以直接部署HiStore引擎到指定目标机器上. 目前这一 块正在和UDP团队合作,其最终目标为打造成为一款集HiStore Engine自动部署,实例管控,运行时监控,数据备份/恢复以及自动化运维的一体化产品.
HiStore 本身与常见关系数据库的高可用架构一样(例如MySQL),为了保证强一致性,都会将数据更新在Master上执行,然后通过复制技术 将副本导入到Slave节点.
但是与MySQL标准的binlog 复制不同. HiStore引擎中存储的不是原始数据,而是压缩后的数据块(DN).此时如果使用binlog的方式来进行复制, 会导致网络上产生大量数据流量.
为了解决这一点, HiStore目前正计划实现基于压缩后DP块的高效数据复制支持.相对于binlog复制,该技术可以大大降低网络传输所需的数据 量.
此外, HiStore也会可选地支持透明的读写分离,方便客户端在不修改的代码的情况下,扩展查询性能.
最后提一下, HiStore后续的集群技术将会朝Share-nothing的方向发展(自动处理数据分片与事务一致性),这部分的架构设计目前也正在团 队中进行技术讨论与原型验证.
此外我们团队也正在讨论和验证HiStore引擎/集群与中间件团队其他产品结合的可能.
术语解释:
: OLAP is an acronym for Online Analytical Processing. OLAP performs multidimensional analysis of business data and provides the capability for complex calculations, trend analysis, and sophisticated data modeling.
: Online transaction processing, or OLTP, is a class of information systems that facilitate and manage transaction-oriented applications, typically for data entry and retrieval transaction processing.
: Data Node: 数据节点. 数据块是存储的最低层,列中每份大小固定的单元组成一个数据块。
MD

: Meta data: 数据元信息节点(MD)与数据节点(DN)之间保持1:1关系,元信息节点中包含了其对应数据块中数据的相关信息.
: Knowledge Node: 知识节点(KN)除了基础元数据外,还包括数据特征以及更深度的数据统信息. 知识节点在数据查询/装载过程中会动态计算.
: Knowledge Grid: 知识网格是HiStore 引擎进行快速数据查询的关键. 在查询计划分析与构建过程中,通过知识网格可以消除或大量减少需要 解压的数据块,降低IO消耗,提高查询响应时间和网络利用率。