很多年前,我刚工作时,那个时候市面上流行的数据库屈指可数,而且都是关系型数据库,如今市面上流行的数据库越来越多,类型也越来越复杂,有关系型,有分布式,有NoSQL,还有NewSQL。数据库家族的日益壮大,直接得益于互联网的发展。互联网产品产生的海量数据,对存储数据的数据库有了新的要求,这些新兴的需求直接催生了现在百家争鸣的数据库产品。

在互联网发展之初,很多互联网产品直接运行在传统的关系型数据库之前,比如甲骨文公司的Oracle数据库,IBM的DB2,以及微软或者Sybase的SQL Server。关系型数据库有很多优点,比如他们一般都严格支持ACID,能够长时间稳定运行,有商业级别的备份策机制。正因为这些特点,有商业支持的关系型数据库一定会应用在对数据正确性,完整性以及可靠性要求比较高的场景,比如银行,证券以及社保系统。关系型数据库虽然有很多优点,但是在面对互联网产品时,却难以处理海量的数据,于是一些的非关系型数据库(不完全是非关系型数据库)就应运而生。

首先出现的是MySQL数据库。MySQL最初发布时,使用的时MyISAM的存储引擎,此存储引擎并不支持事物功能,这个看似不完整的数据库,由于其不支持事物带来的高性能,以及易于使用,开源,免费等功能,迅速成为中小型网站首选的数据库。曾经一度,由LAMP(Linux+Apache+MySQL+PHP)搭建的网站带来的流量占了整个互联网70%的流量。很多大型的互联网公司也在不少的项目中使用了MySQL。

然而,随着互联网的进一步发展,单机版的MySQL逐渐不能满足互联网产品产生的海量数据要求的存储性能。很多公司,特别是大型的互联网公司,都开始根据自身的需求,定制MySQL,开发出更高性能的衍生数据库。同时,一些集群以及分布式技术,也集成到这些衍生数据库。比如,分表分库技术,以及MySQL集群。但是,MySQL最初开发的目标,并不是一款分布式数据库,因此对它的定制,并不容易。除此之外,MySQL数据库支持的SQL语法,反而成为了阻碍使用的一个特性。因为,很多互联网产生的数据,并不适合用结构化的表来储存,于是新一轮的数据库运动开始了。

这一轮数据库运动被叫做NoSQL。NoSQL的目的就是为了开发出高性能,不拘于关系型结构的分布式数据库。正因为,不拘于关系型这一特点,一时间出现了很多看起来完全不同的NoSQL数据库,比如memcached,Redis,MongoDB以及老资格的Berkeley DB等等。这些数据库被归类成健值(KV)数据库,文档数据库,列式数据库以及图形数据库等等。这个不同的NoSQL数据库,与传统的关系型数据库,共同满足了互联网产品各个方面的需求。

凡事都是有得必有失,NoSQL数据库虽然满足了互联网产品对性能,数据结构等方面的需求,但是由于NoSQL数据库的产品种类众多,而且没有统一的标准,这就造成了对NoSQL产品的选择困难。开发人员需求非常了解自身的需求,以及NoSQL产品的特点,然后从中选择最合适的NoSQL用于自己的项目中。

了解一款NoSQL数据库最好的办法,可能就是阅读该数据库的官方文档,但是现在很多NoSQL数据库都是开源产品,其官方文档并不完整,甚至有些没有正式的官方文档。要了解此类产品,就需要直接阅读代码。数据库是最复杂的软件之一,直接阅读数据库代码对很多开发人员来说并不是一件很容易的事情。本系列文章,希望通过和大家一起开发一个能用的数据库存储引擎来熟悉数据库的各个模块,以及开发流程,让大家能够更加容易的读懂主流数据库的代码,最终能够让大家更加了解各个不同的数据库。

本系列文章的第一篇,名为《并非从零开始》,是因为本系列的文章,并不会讲解一般编程方法以及编程语言,而只关注如何实现一个能用,但并非好用的数据库存储引擎(一个好用的数据库存储引擎是非常难,由于笔者的能力,无法在短时间实现出来)。

由于时间的原因,本系列文章中所涉及的资料,都不能给出处(为了加快写作速度),另外,本系列文章使用Java语言,因为笔者用的是Linux,为了让开发的数据库存储引擎也能运行在Windows,所以选择Java。