1.6.2 另辟蹊径的Metrage时期
由于MySQL带来的局限性,Yandex自研了一套全新的系统并命名为Metrage。Metrage在设计上与MySQL完全不同,它选择了另外一条截然不同的道路。首先,在数据模型层面,它使用Key-Value模型(键值对)代替了关系模型;其次,在索引层面,它使用LSM树代替了B+树;最后,在数据处理层面,由实时查询的方式改为了预处理的方式。
LSM树也是一种非常流行的索引结构,发源于Google的Big Table,现在最具代表性的使用LSM树索引结构的系统是HBase。LSM本质上可以看作将原本的一棵大树拆成了许多棵小树,每一批次写入的数据都会经历如下过程。首先,会在内存中构建出一棵小树,构建完毕即算写入成功(这里会通过预写日志的形式,防止因内存故障而导致的数据丢失)。写入动作只发生在内存中,不涉及磁盘操作,所以极大地提升了数据写入性能。其次,小树在构建的过程中会进行排序,这样就保证了数据的有序性。最后,当内存中小树的数量达到某个阈值时,就会借助后台线程将小树刷入磁盘并生成一个小的数据段。在每个数据段中,数据局部有序。也正因为数据有序,所以能够进一步使用稀疏索引来优化查询性能。借助LSM树索引,可使得Metrage引擎在软硬件层面同时得到优化(磁盘顺序读取、预读缓存、稀疏索引等),最终有效提高系统的综合性能。
如果仅拥有索引结构的优化,还不足以从根本上解决性能问题。Metrage设计的第二个重大转变是通过预处理的方式,将需要分析的数据预先聚合。这种做法类似数据立方体的思想,首先对分析的具体场景实施立方体建模,框定所需的维度和度量以形成数据立方体;接着预先计算立方体内的所有维度组合;最后将聚合的结果数据按照Key-Value的形式存储。这样一来,对于固定分析场景,就可以直接利用数据立方体的聚合结果立即返回相关数据。这套系统的实现思路和现今的一些MOLAP系统如出一辙。
通过上述一系列的转变,Metrage为Yandex.Metrica的性能带来了革命性提升。截至2015年,在Metrage内存储了超过3万亿行的数据,其集群规模超过了60台服务器,查询性能也由先前的26秒降低到了惊人的1秒以内。然而,使用立方体这类预先聚合的思路会带来一个新的问题,那就是维度组合爆炸,因为需要预先对所有的维度组合进行计算。那么维度组合的方式具体有多少种呢?它的计算公式是2N(N =维度数量)。可以做一次简单的计算,例如5个维度的组合方式会有25=32种,而9个维度的组合方式则会多达29=512种,这是一种指数级的增长方式。维度组合的爆炸会直接导致数据膨胀,有时候这种膨胀可能会多达10~20倍。