所有文章是按github的markdown格式书写的,如此页面显示不正常,请跳转到github版

互联网经济下遇见更好的开源数据库

背景

伴随着互联网经济的兴起,越来越多的以互联网商业模式为核心的初创企业涌现,越来越多的传统企业拥抱互联网。伴随而来的是互联网企业普遍采用的开源软件相对于传统的商业软件也变得越来越流行。这其中也包括用于存储企业的关键数据的数据库系统。然而,由于数据库系统非常重要性,并且将来的替换成本很高,所以必须认真选择适合的数据库。

商业软件或开源软件

从这几年软件行业的发展来看,开源软件已经成为一种潮流,尤其在基础软件上,包括数据库软件。一方面在传统的OLTP领域,MySQL和PostgreSQL这两个开源RDBMS的市场份额在逐年上升,作为商业数据库大佬的Oracle则成逐年下降趋势。根据Gartner的调查报告,Oracle的全球市场占有率已经从2013年的47.4%下降到2015年的43.9%。另一方面,在新兴的大数据领域更是开源软件的天下。 除去大环境的趋势,从成本削减自主可控等方面考虑,我们也提倡优先选择开源软件。

MySQL和PostgreSQL之争

OLTP场景下可供选择的开源数据库可以说只有MySQL和PostgreSQL两种。目前MySQL的用户比较多,但是如果仅凭这一点就选择MySQL是不明智的。我们可以从下面几个方面对这两个数据库进行比较,找到更适合自己的数据库。

  1. 社区
    MySQL虽然是开源软件,但采用的是封闭式的开发模式,甚至在版本发布之前代码都是不公开的。PostgreSQL则不同,PostgreSQL用户社区主导开发维护,并且会非常及时的响应用户的反馈。所以你会看到向MySQL官网报告一个Bug常常一个多月都得不到回复,而向PostgreSQL官网报告一个Bug,通常2天之内就会收到答复。

    另外,需要注意的是MySQL被完全掌握在Oracle公司手里,如果MySQL影响到了Oracle的市场份额和收益,想必Oracle公司不会坐视不理。但是,却有人提倡用MySQL去IOE,实际上是换汤不换药,给未来埋下了一个隐患。

  2. 功能
    MySQL支持SQL99的子集,而PostgreSQL则支持大部分SQL2011特性。PostgreSQL支持FDW,CTE,分析函数,行级安全,SELinux等丰富的高级特性,这些都是MySQL所不具备的。即使在序列,视图,函数,触发器,数据类型等常规功能上,PostgreSQL的支持也更完整,而MySQL则有不支持序列,不支持数组,函数和存储过程的支持很弱,视图定义不支持子查询等诸多限制。

    关于SQL特性支持情况的对比,可以参考http://www.sql-workbench.net/dbms_comparison.html

                      PostgreSQL | Oracle | DB2 | SQL Server | MySQL
     支持的SQL特性       94           77      69       68        36
     不支持的SQL特性     16           33      41       42        74 
    

    由上表可见,PostgreSQL在SQL标准的支持上甚至超越Oracle,因此企业在将包括Oracle在内的商业数据库向开源数据库转型时,转到PostgreSQL上是最平滑的。

  3. 性能
    在简单的业务场景中,PostgreSQL和MySQL的性能相差不大。但当数据量比较大,或者涉及较为复杂的查询时,PostgreSQL相比MySQL会显示出明显的优势。特定场景下PostgreSQL会比MySQL快十倍甚至百倍。这得益于PostgreSQL拥有完整的JOIN算法,丰富的统计信息和强大的索引系统。

  4. 易用性
    和PostgreSQL相比MySQL更像是一个不断试错不断纠错的结果,缺少完整统一的设计。一个典型的例子是MySQL复杂的参数配置,MySQL 5.6中有648个参数,不仅数目众多,命名规则也没有章法,很多资深的MySQL DBA也不清楚里面的很多参数是干嘛用的。要命的是这些参数还在不断变化,很多小版本升级都会有参数修改,废弃,追加或修改默认值。到了MySQL 5.7,参数已经膨胀到了707个。另外的例子是MySQL的多引擎,MySQL的很多功能在不同引擎上会有所差异,所以我们使用MySQL的时候经常要留意,这个用法是否适合正在使用的存储引擎。再有MySQL提供的很多功能是有缺陷的,稍不留意就会踩坑,比如你可以删除视图所依赖的表而得不到任何报错。PostgreSQL中则没有这些问题,所有的功能严谨地组成了PostgreSQL这个整体。

  5. 可靠性
    MySQL有存储层和SQL层两套LOG,不仅增加了系统IO负担,而且还需要维护这两套LOG的数据一致,这又额外增加了系统的复杂性。另外,在很多的业务场景下,主从复制集群是非常普遍的部署形式。但MySQL由于采用的逻辑复制,长期以来一直都存在数据不一致和数据延迟的问题。这不仅给业务带来极大的风险,也给运维增加了很多额外负担。PostgreSQL采用物理复制,主从数据的复制过程简单可靠迅速,完全不存在这些问题。

  6. 稳定性
    PostgreSQL的稳定性极强,MySQL在崩溃、断电之类的灾难场景下抗打击能力有了长足进步,然而很多MySQL用户都遇到过Server级的数据丢失。 另外,MySQL 5.6推出了一项叫”在线DDL”的特性,意为很多DDL操作可以在线完成而不影响正在运行的业务。但仔细阅读MySQL的手册你就会发现,不能在线DDL的操作仍然非常多,比如。而PostgreSQL对在线DDL的支持更加完善,甚至对DDL操作也支持事务,DDL中途出错可以回滚到之前的一致状态,这样逆天的特性即使连Oracle也不具备。

  7. 扩展性
    PostgreSQL在设计之初就充分考虑到了扩展性,因此也被称之为对象关系数据库。PostgreSQL中几乎一切都是可扩展的,比如:函数,过程语言,数据类型,索引类型以及外部数据源。像著名的GIS软件PostGiS其实就是在PostgreSQL基础上扩展出的一个插件,增加了GIS相关的数据类型,函数和索引。利用PostgreSQL高度的可扩展性,可以定制出各种领域特有的应用。

  8. 人才
    一些公司以找不到很懂PostgreSQL的技术人员为由拒绝PostgreSQL,这确实是PostgreSQL目前的一个短板。但是,其实MySQL也存在类似的问题,有经验的MySQL DBA也非常稀缺,有价无市。所谓有验的MySQL DBA是不包括那些只会安装备份恢复等一些简单操作的新手的。由于MySQL的复杂和多坑,没有几年的踩坑经验是算不上合格的MySQL DBA的。现有PostgreSQL的DBA虽然更加稀缺,但由于PostgreSQL更加严谨,SQL兼容性更好,和Oracle等商业数据库也更加接近,所以,无论对初学者还是其它数据库的DBA转型,相对而言学习PostgreSQL都更加容易。我们也看到很多的Oracle DBA转向了PostgreSQL,很多的数据库服务的公司开始提供PostgreSQL的商业支持。

大数据分析

谈到大数据不得不提Hadoop,Hadoop几乎成了大数据的代名词。但Hadoop的MapReduce计算模型使用门槛很高,需要使用者充分理解MapReduce工作原理并要有Java编程能力。而且,MapReduce的性能也很差,每一步计算的结果都需要落盘,每一步计算完全结束了才能执行下一步。针对这两个问题分别有了Hive,Impala这样的SQL on hadoop的解决方案和代替MapReduce的并行流式计算引擎Spark。

然而,在Hadoop之外有另外一种大数据分析的解决方案MPP。MPP在传统关系数据库的基础上扩展而来,SQL的支持能力,数据一致性,处理效率和使用便利性等各方面更加出色。而且,幸运是MPP家族的领导者Pivotal的GreenPlum在去年开源了,你现在可以免费得到这款原本价格不菲的商业软件。当你主要处理结构化数据,使用SQL或R语言进行数据分析,数据量在PB级或以下,GreenPlum是理想的选择。

如果你仍然需要Hadoop集群,并且希望在上面执行SQL,除了前面提到的Hive和Impala,还有另一款Pivotal从原来的商业软件中开源出来产品HAWQ。这里特别提到HAWQ,除了拥有优越的性能以外,还有一个重要的原因。HAWQ的SQL引擎是从GreenPlum中剥离出来的,而GreenPlum又是在PostgreSQL基础上改造的。这三者有着非常相似的语法,可以最大程度上减少使用者的学习成本。

总结

在数据管理上,从PostgreSQL到GreenPlum再到HAWQ + Hadoop,可以说PostgreSQL大家庭已经形成了一个完善的生态圈。这个生态圈里还有被广泛使用的开源GIS系统PostGIS,用于大数据机器学习的MADlib,流式SQL数据库PipelineDB,使用GPU加速的PGStrom等各种好玩又高大上的东西。有不少企业在大量部署了MySQL后,发现有一些问题是MySQL无法解决的,比如GIS,复杂查询和主备一致,于是又引入了PostgreSQL,造成了不得不维护两套功能相似的开源数据库的困境。一开始就选对PostgreSQL其实是更明智的选择。

May 20, 2016