Infobright列存数据库原理介绍

简介

Infobright 是一个面向 OLAP 场景的开源列存数据库。比较容易找到代码的版本是 Infobright Community Edition 4.0.7,大概是 2006 年前后的代码。2016 年6 月,Infobright 决定停止开源1。由于它同时提供企业版和社区版,开源版本的功能相比企业版而言,肯定是存在一些明显限制的,例如对查询的并行执行、查询的并发数都有一定的限制。Infobright 不仅有 MySQL 版本,也有 PostgreSQL 版本,是比较典型的走开源软件兼容生态路线的产品。深入了解它的最好途径是阅读它的文档以及源代码。Infobright 在 VLDB 2008 年的“Industrial, application, and experience sessions: query optimization”主题下有一篇 paper 2,比较详细的介绍了它的整体架构,以及查询优化、数据压缩等显著的特点。

系统架构

img

Infobright 的整体架构如上图。 相对于原生的 MySQL 而言,它主要做的改动为:

存储引擎

图中右下角的两个大长方形分别为“Knowledge Grid”和“Compressor/Decompressor”,二者共同组成了新的一个存储引擎 BrightHouse。这也是列存数据库区别于 InnoDB 等 OLTP 存储引擎的地方。知识网格可以简单理解为数据的元信息,例如记录数、最大值、最小值等等。压缩解压缩器代表了 Infobright 在数据压缩上做了很多工作,具备很高的压缩比。知识网格的好处是数据量相对原始数据而言很小,可以放到内存。

优化器和执行器

图中中间标记为“Infobright Optimizer and Executor”的是另一个重要的模块,负责处理 SQL 查询的优化和执行。与传统架构中查询优化与执行是分开的两个阶段不同,这里的优化器和执行器是紧耦合的。这也是 Infobright 比较特殊的地方。

数据装载和卸载

OLAP 通常要处理大量的输入数据,没有快速的数据装载和卸载能力,系统就无法发挥真正的价值。对应的是图中右上角的“Infobright Loader/Unloader”。

领域知识

图中还有一个比较特殊的模块,称为“Domain Injections/Decomposition Rules”。Infobright 提供了一些扩展的 SQL 和存储过程,允许用户定义取值规则,并且将规则应用到某些列上,从而使得存储模块在存储/压缩数据前可以将一个数据块内的数据分成更多的子类,并提供针对性的编码。可以简单理解为用户将领域知识通过自定义的规则告诉系统,从而采取针对性的压缩和存储优化。

查询优化

按照论文中的说法,Infobright 的查询优化基于粗糙集的理论,这一点很有特色。粗糙集是波兰数学家提出的理论,而 Infobright 公司是由波兰人创办的,看来把粗糙集应用到系统中也不是偶然的。不过要理解 Infobright 的查询优化,并不需要太多粗糙集的数学知识。其核心概念是利用数据的元信息来过滤需要真正访问的数据块。例如:对于范围查询,可以根据查询条件将数据块分为相关、不相关、可能相关三大类,从而减少真正的数据访问。这三种数据块的分类是粗糙集理论在该系统中用到的核心概念。更进一步,考虑到 OLAP 的数据是批量加载,而不是像 OLTP 那样实时写入的。对于 COUNT、SUM 等聚集操作,甚至可以通过预先计算好的统计值进行简单的运算得出。类似的,数据的批量加载以及只读假设也给数据的快速加载以及压缩提供了极大的便利。

简单场景的示例

后面通过一个简单的场景来体会一下知识网格的优势。假设我们要执行下面的查询:

SELECT count(*)
FROM   employees
WHERE salary > 100000
	AND age    < 35
	AND job    = ‘DBA’
	AND state  = ‘TX’

这是一个简单的带过滤条件的聚集查询。OLTP 数据库的通用做法是利用 salary 等列上可能存在的索引进行数据的过滤,减少 IO。实际的执行计划可能会用到多个索引。Infobright 没有索引,它依靠的是知识网格中的元信息。下图展现了 employees 表中各列数据的存储。每个菱形代表一个数据块。其中紫色的表示数据块中的所有值都不满足查询条件,蓝色的表示部分值满足查询条件,绿色的表示全部值都满足条件。

img

因为第 1、2、4 行中都存在紫色的菱形,说明它们代表的行都不符合查询条件,进一步处理的时候可以将它们忽略掉。只有第三行的数据块需要进一步处理。而查询的结果集是要计算符合条件的行数(COUNT),我们只需要选择那些部分匹配的数据块进行处理。本查询中只有 state 列的数据块满足条件如下图所示。这样最终需要解压并逐行进行 state > 10000 条件判断的数据量就少了很多。

img

小结

上面的例子虽然很简单,但可以看到 Infobright 查询优化的几个重要特点:

查询优化和执行时融合在一起的,一边优化边执行。这样的好处是可以充分利用知识网格来筛选数据,缺点是处理的查询种类有限,通用性不够。遇到不能通过知识网格有效筛选的查询,性能就会明显下降。
知识网格起到了典型数据库中索引的作用,可以筛选掉部分数据块。显然,它的选择性没有索引的针对性那么强。
论文2中还有一些更具体更复杂的例子,有兴趣的读者建议直接阅读原文,可以获得更加深入的理解。

存储结构

Infobright 的存储结构主要包括:

Data Pack
简称 DP,也就是数据块,用于存放实际的数据。需要注意的是,它采用的是列存格式,为每一个列产生一个或多个数据文件。这种数据格式与 OLTP 存储引擎的定长页面格式截然不同,倒是与 NoSQL 中的 SSTable 有几分神似。数据块中保存的是实际的数据以及空值的位图;数据在写出前会用多种压缩算法进行压缩;数据是没有经过排序的,按照实际加载的顺序保存。数据块在逻辑上是等长的,即每个数据块保存 65536 条记录,但是物理上不是等长的。

Knowledge Node

简称 KN,用于存放数据块对应的元数据,它又可以细分为以下几种。

Data Pack Node

简称 DPN,DP 的元信息存放在对应的 DPN 中。元信息包括:DP 中列值的最大值、最小值、SUM 值;非 NULL 的记录数,NULL 的记录数;压缩方式;占用的字节数等。

Histograms

数值类型列还会保存基本的统计信息,以直方图的形式存在。具体做法是将 DP 的最小值到最大值分为 1024 段,每段占用一个 bit,表示是否含有该段的数据。查询时可以快速判断该列数据是否满足条。可以看出,这个直方图的组织与 OLTP 数据库中的存在很大的区别,而且是每个 DP 的局部信息。

Character Map

简称 CMAP,这是一个字符类型列的映射表,映射表中每个格子占用一个 bit,表示字符在字符串的该位置是否存在。查询时可以快速判断该列数据是否满足条件。

img

Pack to Pack

简称 P2P,这是一种很特殊的元数据,它存储两个表在列上的 JOIN 关系。形式有些类似 CMAP,也是一个二维矩阵。每个格子占用一个 bit,表示表 1 中某列的第 i 个 DP 与表 2 中某列的第 j 个 DP 至少有一个值相等,满足等值 JOIN 条件。可以看出,这种信息是与具体的 JOIN 条件相关的,数量可能很大,比较适合动态按需生成,不持久化。

小结

下图将所有的概念都整合到了一起,是一个不错的整体视图。

img

值得一提的是,与 OLTP 引擎以及其他很多 OLAP 引擎不同的是,Infobright 中没有索引,它通过 DPN 等元信息以及特殊的查询优化来替代索引的功能。这样可以省去索引占用的存储空间,还可以较好的支持 ad-hoc 的查询,避免管理员调优等代价。其列存引擎也不需要用户定义数据块的大小,数据的存储顺序就是加载的顺序,避免了某些系统需要耗费大量资源到数据的排序上。

数据压缩

在当时的情况下,Infobright 的数据压缩算法也是很新颖的。号称平均可以达到 10:1 的压缩比,最高可以达到 40:1。实测的时候需要注意,压缩比的计算是与原始的文本数据比还是与 InnoDB 比。Infobright 会采用链式压缩,也就是对同样的数据块采用多种算法依次压缩,尽可能达到最大的压缩比。也针对数字和字符串采用多种具体的压缩算法。例如:让所有数字减去最小值,获得更小的数字;所有数字除以最大公约数,获得更小的数字;计算数字之间的差值,获得更小的数字等等。最终采用 PPM 以及 Carryless RangeCoder 等具体的编码。

总结

Infobright 官网宣传号称 40:1 的压缩率,每小时加载 10TB 数据,单实例支持 150TB 的存储,维护时间 0 小时3。新产品也对 Hadoop 生态有了一定的整合。总之,Infobright 是一个有意思的数据仓库产品,具有明显的特色。它以相对较小的存储空间膨胀达到了较好的处理 ad-hoc 查询的能力,比较适合查询分析语句不是特别复杂的场景。

参考资料

  • The Final Frontiers of ICE https://infobright.com/blog/the-final-frontiers-of-ice/

  • Brighthouse: An Analytic Data Warehouse for Ad-hoc Queries http://www.vldb.org/pvldb/1/1454174.pdf

  • Infobright Website https://infobright.com/infobright-enterprise-edition/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/244912.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

斑马zebra目标检测数据集VOC+YOLO格式2300张

斑马是由四百万年前的原马进化出来的&#xff0c;最早出现的斑马可能是细纹斑马。有关史前马科动物的化石现存于美国爱达荷州克文的克文化石床国家博物馆。斑马的史前马为“克文马”&#xff08;美洲斑马或者克文斑马&#xff09;&#xff0c;学名为“Equussimplicidens”&…

WordPress VIP收费下载插件Erphpdown v17.0.1 开心版

会员推广下载专业版 WordPress插件&#xff08;erphpdown&#xff09;是模板兔开发的一款针对虚拟资源收费下载/付费下载/付费视频/收费查看/付费阅读/付费查看/VIP下载查看的插件&#xff0c;经过完美测试运行于wordpress 3.x-5.x版本。后续模板兔会增加更多实用的功能。 模板…

docker部署go gin框架 Linux环境

目录 文章目的是什么 环境介绍 Linux 环境下 docker 部署 go gin 详细步骤 部署 gin 文章目的是什么 假设我们学习了 go 语言&#xff0c;在 Linux 上安装了 go 相关的程序&#xff0c;也能直接运行&#xff0c;使用以下命令&#xff1a; go run main.go 假如代码是这样的…

跟着我学Python基础篇:08.集合和字典

往期文章 跟着我学Python基础篇&#xff1a;01.初露端倪 跟着我学Python基础篇&#xff1a;02.数字与字符串编程 跟着我学Python基础篇&#xff1a;03.选择结构 跟着我学Python基础篇&#xff1a;04.循环 跟着我学Python基础篇&#xff1a;05.函数 跟着我学Python基础篇&#…

java设计模式学习之【代理模式】

文章目录 引言代理模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用图片加载示例代码地址 引言 在现实生活中&#xff0c;我们经常使用代理来处理我们不想直接参与或无法直接参与的事务&#xff0c;例如&#xff0c;使用律师来代表法庭上的案件。在软件开发…

计算机网络——网络层——OSPF协议的介绍

什么是 OSPF &#xff1f; OSPF 是一个基于链路状态的自治系统内部路由协议&#xff0c;在 TCP/IP 的网络层中进行路由选择&#xff0c;常用于构建大型企业网络或者服务上的骨干网络。在互联网核心路由器之间也可以使用。 OSPF 概述 OSPF 使用的是 Dijkstra&#xff08;最短…

Vue 实现一个弹出框,允许用户输入信息,并在确认时将输入的信息进行输出到控制台

父组件用来点击按钮弹出弹出框 <!--ParentComponent.vue--> <template><div><button click"showPopupV">点我会有个弹出框&#xff01;&#xff01;&#xff01;</button><PopupComponent v-if"showPopup" :data"p…

【退订】阿里云产品

之前因为学习需要使用了阿里云上的产品服务&#xff0c;项目结束后给忘记了&#xff0c;直到最近阿里云发短信我才知道&#xff1a; 我使用的是datawork的服务&#xff0c;现在先登录阿里云官网&#xff1a; 阿里云-计算&#xff0c;为了无法计算的价值 (aliyun.com) 之后点…

【毕业设计】基于STM32的智能衣柜设计

1、功能说明 功能如下: 1、用stm32控制ds18b20采集温度 2、然后按键可以设置上下限温度&#xff0c; 3、采集的温度低于下限温度时候 打开加热片开始加热&#xff0c; 4、加热到上限温度关闭加热片停止加热&#xff0c; 5、采集的温度可以在oled显示&#xff0c; 6、然后弄个按…

MySQL增量备份与恢复

实验环境 某学校近期在进行期中考试&#xff0c;要求数据库管理员负责一班&#xff0c;二班学生的考试成绩录入&#xff0c;为保证数据的可靠性&#xff0c;数据库管理员在录入学生成绩后均要做数据库备份&#xff0c;并且为了测试备份数据是否可 用&#xff0c;模拟数据丢失故…

MySQL数据库,视图、存储过程与存储函数

数据库对象&#xff1a; 常见的数据库对象&#xff1a; 视图&#xff1a; 视图是一种虚拟表&#xff0c;本身是不具有数据的占用很少的内存空间。 视图建立在已有表的基础上&#xff0c;视图赖以建立的这些表称为基表。 视图的创建和删除只影响视图本身&#xff0c;不影响对…

多云网络互通问题怎么解决——SD-WAN

随着业务的扩张&#xff0c;企业对云资源的用量也越来越大&#xff0c;逐渐形成了混合云架构。要解决多云网络互通的问题&#xff0c;其中一种常见的组网方案是云专线。然而&#xff0c;这种方式也带来了一系列问题&#xff0c;包括&#xff1a; 1、受服务商约束&#xff0c;需…

Docker真的好难用啊,为什么说它移植性好啊?

看起来你对Docker有点困惑和挑战呀。Docker刚开始确实有点难以入门&#xff0c;但是一旦掌握了它的核心概念和操作&#xff0c;你会发现它其实非常强大和便利。 接下来我会根据你提出的问题和场景&#xff0c;详细地解答。 关于你的实际问题&#xff1a; 刚接触时的困难是正。…

【机器学习 | 假设检验系列】假设检验系列—卡方检验(详细案例,数学公式原理推导),最常被忽视得假设检验确定不来看看?

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

【开源软件】最好的开源软件-2023-第17名 Gravite

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

骨灰级程序员那些年曾经告诉我们的高效学习的态度

一、背景 以前阅读陈皓老师的左耳听风专栏中关于如何高效学习的总结让我收货颇丰&#xff0c;今天总结了一下&#xff0c;分享给大家 老师说&#xff1a; 学习是一件“逆人性”的事&#xff0c;就像锻炼身体一样&#xff0c;需要人持续付出&#xff0c;会让人感到痛苦&#…

【Jenkins】节点 node、凭据 credentials、任务 job

一、节点 node Jenkins在安装并初始化完成后&#xff0c;会有一个主节点&#xff08;Master Node&#xff09;&#xff0c;默认情况下主节点可以同时运行的任务数是2&#xff0c;可以在节点配置中修改&#xff08;系统管理/节点和云管理&#xff09;。 Jenkins中的节点&#…

第十二章 React 路由配置,路由参数获取

一、专栏介绍 &#x1f436;&#x1f436; 欢迎加入本专栏&#xff01;本专栏将引领您快速上手React&#xff0c;让我们一起放弃放弃的念头&#xff0c;开始学习之旅吧&#xff01;我们将从搭建React项目开始&#xff0c;逐步深入讲解最核心的hooks&#xff0c;以及React路由、…

shell实战-批量修改主机密码

1.编写执行脚本 vim host-pass.sh #!/bin/bash#配置旧的密码文件 cat >old_pass.txt <<EOF 10.36.192.182 root 123 22 10.36.192.184 root 123 22 EOF[ -f /etc/init.d/functions ] && . /etc/init.d/functions OLD_INFOold_pass.txt NEW_INFOnew_pass.txt…

QT----第二天QMainWindow,各种控件

目录 第二天1 QMainWindow1.1 菜单栏1.2工具栏1.3 状态栏1.4 铆接&#xff08;浮动窗口&#xff09;和中心部件&#xff08;只能由一个&#xff09;2 资源文件添加 3、对话框Qdialog3.2 模态和非模态对话框3.2 消息对话框3.3 其他对话框 4 登陆界面5 按钮组控件5.1QToolButton5…