马不停蹄地,让我们开始第一个章节。这篇博客是一个引子,从一个故事开始,讲述数据在OceanBase的存储引擎中的存储形式与流转过程,希望能让大家对OceanBase的存储架构产生印象。
在世界的某一处,温柔的风正将空气中的水汽卷向云层。慢慢地,天空中逐渐形成了厚厚的积云,当积云无法再承受更多的时候,它开始发出轰隆隆的雷鸣声。不一会儿,淅淅沥沥的雨落到了山林,形成了一条不大不小的林间小溪。当林子里四面八方的小溪数量愈来愈多的时候,挡在溪流前的灌木丛们被无情的冲毁,一条条小溪欢腾着向半山腰流淌,最终停在了一片洼地里,汇成了山间的浅河。当然,山地的土壤总归承载不了这么丰厚的水资源,时不时就会爆发一场山洪,溪流和浅河通通一股脑儿地向山脚奔涌,汇入那宽广的大海。
看完这个小故事,大家的第一反应应该是:这些都是自然界里最稀松平常的事了吧,和OceanBase有什么关系呢?先别着急,接着往下看。
让我们先来了解一下OceanBase的存储架构。OceanBase数据库的存储引擎基于 LSM-Tree 架构,将数据分为了内存增量数据(MemTable)和存储静态数据(SSTable)两个层次,其中 SSTable 是只读的,一旦生成就不再被修改,存储于磁盘;MemTable 支持读写,存储于内存。其中,SSTable 会继续细分为 Mini SSTable、Minor SSTable、Major SSTable 三类。一行数据通常会经历从内存向磁盘流转的过程,即从Activate MemTable->Frozen MemTable->Mini SSTable->Minor SSTable->Major SSTable。
那么当我们将以上的故事和OceanBase的存储架构联系起来后,我们可以惊喜的发现,两者有着太多的相似性。
大海对应着容纳数据范围最大的Major SSTable;小溪和浅河对应着Mini SSTable和Minor SSTable;空气中的水汽对应着数据,天空中云朵则对应着MemTable。当云中的水汽积累到一定程度的时候,形成了即将落雨的阴云,也就是只读的Frozen MemTable,对应着所谓“冻结”的过程。空气中的其他水汽会汇向新的地方,即生成一个新的可写的Active MemTable用来存储新数据。阴云通过雨水来到陆地,形成了小溪,对应着Frozen MemTable形成Mini SSTable,也就是我们常说的“转储”;来自四面八方的小溪汇聚成浅河,对应着Mini SSTable们形成Minor SSTable。而时不时发生的山洪倾泻,河溪汇海,则对应着所谓“每日合并”的工作。
这样看来,是不是还挺有趣的?在接下来的一些章节里,我会丰富这个故事的细节,希望在这个过程里帮助大家轻松愉快地掌握OceanBase中转储合并的技术原理。