上次初步介绍了基于mysql的数据仓库实现:infobright,这里深入介绍其结构及工作原理。下图是infobright白皮书中展示的系统架构,灰色部分是mysql原有的模块,白色与蓝色部分则是infobright自身的。下面说说它的几个主要概念及其相互协作原理。

infobright架构图
系统结构分析:
- 跟mysql一样的两层结构,上面的逻辑层处理查询逻辑,下面的是存储引擎。
- 逻辑层右端的loader与unloader是infobright的数据导入导出模块,也即处理SQL语句里LOAD DATA INFILE … 与SELECT … INTO FILE任务,由于infobright面向的是海量数据环境,所以这个数据导入导出模块是一个独立的服务,并非直接使用mysql的模块。
- 逻辑层的infobright优化器包在mysql查询优化器的外面,如下面将会提到的,因为它的存储层有一些特殊结构,所以查询优化方式也跟mysql有很大差异。
- 存储层最底层是一个个的Data Pack(数据块)。每一个Pack装着某一列的64K个元素,所有数据按照这样的形式打包存储,每一个数据块进行类型相关的压缩(即根据不同数据类型采用不同的压缩算法),压缩比很高。它上层的压缩器与解压缩器就做了这个事情。
- 压缩层再向上就是infobright最重要的概念:Knowledge Grid(知识网格),这也是infobright放弃索引却能应用于大量数据查询的基础。它包含两类结点:每个Data Pack Node(知识节点)对应于一个Data Pack,存储该Data Pack的一些统计信息,如min, max, avg, null的个数,甚至不同值的量等等;Knowledge Node则存储了一些更高级的统计信息,以及与其它表的连接信息,这里面的信息有些是数据载入时已经算好的,有些是随着查询进行而计算的,所以说是具备一定的“智能”的。
查询原理(为什么infobright能处理大量数据的查询):
- 例如一个infobright表T,按列存储了两列A与B。A包含A1,A2,A3,A4;B包含B1,B2,B3,B4几个Data Pack。
- 输入一条查询语句:SELECT MAX(B) FROM T WHERE A>3。
- 根据查询infobright会先把A的知识网格数据取出来,因为A1-4都有相应的知识节点存储其范围,所以仅根据知识网络就能知道哪些数据块符合A>3这个查询要求。这里假设A1,A2,A3全部符合或半符合(半符合是指根据知识网格无法准确判断)要求。
- 然后取出B1,B2,B3的知识网格,仅凭知识网格中的max信息即可判断哪个数据块是全部符合或半符合要求的,这里假设是B2。
- 把B2取出来,解压缩,获取B2中的最大值。
- 返回结果。
下次再介绍一下这些天我使用infobright的一些实践经验。
转载请保留本文原始链接:http://www.wentrue.net/blog/?p=291
版主您好!
看了你的技术文章,受益匪浅,真是好啊。
看来你对infobright有很深的研究了,我也是一个infobright的研究者,很多东西还不清楚,很想请教一下版主,不知道可否与您取得联系呢?
期盼你的回复:
我的email:birdtwo.good@gmail.com
QQ:183440851
希望能与楼主交流 msn:ziyoujiedao@hotmail.com