最近做的事情都围绕着PostgreSQL生态,因为我一直觉得这是一个前景无量的方向。
为什么说PostgreSQL是一个前途无量的深入方向?因为数据库是信息系统的核心组件,关系型数据库则是数据库中的绝对主力。PostgreSQL作为世界上最先进的开源关系型数据库,占据了天时地利。做一件事最重要的就是认清形势,时来天地皆同力,运去英雄不自由。

PostgreSQL的

今天下三分,然Oracle/MySQL/SQL Server疲敝,日薄西山。PostgreSQL紧随其后,如日中天。此消彼长,前途无量。开源数据库中的老对手MySQL前狼后虎,生态位逐步被PostgreSQL(4th)和MongoDB(5th)抢占。
如果说几年前PG的势还是Potential,那么现在Potential已经开始兑现为Impact了。
数据库流行度趋势:https://db-engines.com/en/ranking_trend (注意这里是对数坐标系)
关系型数据库之间基本可以视作零和博弈,处于生态位重叠你死我活的竞争中。而在这场斗争中,PostgreSQL占据了三个“势”:
  1. 开源软件普及发展的势(去Oracle)
  2. 用户日益增长的功能需求(缓存,事务处理,数据分析,全文检索,时空检索,文档数据库)
  3. 市场份额均值回归的势(特别是国内PG市场份额因历史原因远低于世界平均水平)
在头部关系型数据库中,Oracle有才而无德,MySQL才浅德薄。所谓德不配位,必有灾殃。作为德才兼备的关系型数据库,PostgreSQL藏器于身,因时而动,不鸣则已,一鸣惊人。大有把Oracle和MySQL拉下马的势头。

德才兼备

PG的“德”在于开源

什么叫“德”,合乎于“道”的表现就是德。而这条“道”就是开源
PG本身就是祖师爷级开源软件,是开源世界中的一颗明珠,是全世界开发者群策群力的成功典范。而且更重要的是它采用无私的BSD协议:除了打着PG的名号招摇撞骗外,用户基本可以用它来干任何事情,比如换皮出售,实乃无数数据库厂商的衣食父母。活人无数,功德无量。

PG的“才”在于一专多长

PG的“才”在于,它是一专多长的全栈数据库。用时髦的话说就是PG天生就是HTAP,超融合数据库,一个打十个。基本单一组件便足以覆盖中小型企业绝大多数的数据库需求:OLTP,OLAP,时序数据库,空间GIS,全文检索,JSON/XML,图数据库,缓存,等等等等。
参考阅读:
PG好处都有啥

PG与竞争对手

与其他数据库相比,Oracle作为知名的业界毒瘤,德就不用说了;而MySQL虽然也开源,但它一来掌握在Oracle手中,二来采用了GPL协议,所以比起BSD协议的Postgres还是显得德薄。同时,Oracle作为老牌商业软件,在功能的沉淀是很深厚的,PG基本可以对Oracle做到八九成兼容;但MySQL的功能在PostgreSQL和Oracle前则显得实在过于简陋。

开源

接下来我们来重点聊一聊“开源”。
开源是有大功德的。互联网的历史就是开源软件的历史,IT行业之所以有今天的繁荣,人们能享受到如此多的免费信息服务,核心原因之一就是开源软件。开源是一种真正成功的,由开发者构成的communism(译成社区主义会更贴切):软件这种IT业的核心生产资料变为全世界开发者公有,人人为我,我为人人。
一个开源程序员干活时,其劳动背后其实可能蕴含有数以万计的顶尖开发者的智慧结晶。互联网程序员贵,因为从效果上来讲,其实程序员不是一个工人,而是一个指挥软件和机器来干活的包工头。程序员自己就是核心生产资料,服务器很容易取得(相比其他行业的科研设备与实验环境),软件来自公有社区,一个或几个高级的软件工程师可以很轻松的利用开源生态快速解决领域问题。
有人可能会有疑问,开源社区把源代码放出来,就不怕软件厂商剽窃拿出去卖吗。那确实多虑了,因为小池塘干不过大海。有很多活生生的例子:某些大厂从开源软件分支出自己的版本,觉得自己可以维护下去,最开始可能确实解决了自己的几个问题。很快,开源软件日新月异,各种强力新功能层出不穷,自己维护的软件很快就成了过时的垃圾。
通过开源,所有社区开发者形成合力,极大降低了重复造轮子的内耗。使得整个行业的技术水平以匪夷所思的速度向前迈进。开源的势头就像滚雪球,时至今日已经势不可挡。基本上除了一些特殊场景和路径依赖,软件开发中闭门造车搞自力更生几乎成了一个大笑话。

开源与免费

一个常见的误区当然是开源 = 免费。开源软件通常是免费的,不过软件工程师不是免费的。任何生态系统都需要资源维持运转,开源的生态模式大致可以描述为由以下三个步骤组成的正反馈循环:
  • 开源软件开发者给开源软件做贡献
  • 开源软件本身免费,吸引更多用户
  • 用户使用开源软件,产生需求,创造更多开源软件相关岗位
开源生态的繁荣有赖于这个闭环。不过这里面有一个问题,如果像云厂商售卖开源软件,就会导致开源软件的相关岗位向云厂商集中。而云厂商是否允许自己的程序员给开源项目做贡献,其实是很难说的。这就是所谓的“吸血”开源,当然还有更恶劣的玩法比如,恶意向开源软件提交漏洞。好在负责任的大厂通常也会回馈开源,毕竟名声也是很重要的呀。
总而言之,做软件也好,搞数据库也好,要搞就要搞开源数据库。闭源的东西生命力太弱,没意思。而开源数据库中能出来打一把的也就是MySQL和PgSQL了。

功能

MySQL的口号是“世界上最流行的开源关系型数据库”,而PostgreSQL的Slogan则是“世界上最先进的开源关系型数据库”,一看这两位就是老冤家了。我认为这两个口号很好的反映出了两种产品的性质:PostgreSQL是功能丰富,一致性优先,高大上的严谨的学院派数据库;MySQL是功能粗陋,可用性优先,糙猛快的“工程派”数据库。
流行度本身是一种优势,越流行用户基数就越大,生态就越繁荣。用户基数大,再丑也能整容整出来。但一个东西流不流行往往并不取决于其质量,最流行的东西有时候还往往比较垃圾,Javascript语言就是最生动的例子。
MySQL的主要用户群体集中在互联网公司,互联网公司的特点是什么?业务场景糙、猛、快。说的是互联网公司不像传统行业(例如银行)那样在意数据的一致性(正确性),数据重要性不高,比起停止服务,数据丢乱错也可以容忍。猛快说的则是需求变化急促,业务场景通常是简单的CRUD,要求响应时间快,数据量也比较大。糙猛快的互联网公司和糙猛快的MySQL一拍即合。
MySQL的哲学我称之为:“好死不如赖活着”,以及“我死后哪管洪水滔天”。其“可用性”体现在各种“容错”上,例如临时草台班子菜鸡程序员写出了各种垃圾SQL,有时候即使写错了,也可以跑起来。一个最离谱的例子就是MySQL竟然允许部分成功的事务提交,违背了关系型数据库的基本约束原子性与数据一致性
图:MySQL竟然允许部分成功的事务提交,默认隔离等级(RR),MySQL 8.0
没有原子性就没有一致性,这种数据库如果用来记账恐怕是一笔糊涂账,所以说什么“金融级MySQL”恐怕就是一个笑话。滑稽的是还有不少用户把这个称之为“特性”,说这体现了MySQL的包容性。
如果是互联网业务,注册个新用户丢个头像、丢个评论可能不是什么大事。所以不少互联网公司通常并不在乎这一点,数据那么多,丢几条错几条又算个什么呢?这就是典型的工程派,业务很可能明天就死掉了,哪管它粗制滥造。万一成功了,反正前人拉的屎总有后人来擦。
PostgreSQL严格的约束与语法可能对新人来说“不近人情”,例如,一批数据中如果有几条脏数据,MySQL可能会照单全收,而PG则会严格拒绝。尽管苟且妥协看上去很省事,但在其他地方埋下了雷:因为逻辑炸弹深夜加班排查擦屁股的工程师和不得不清洗脏数据而骂娘的数据分析师肯定对此有很多话想说。从长期来看,做正确的事最重要。

前景

传统行业之所以称为传统行业,就是因为它们已经走过了野蛮生长的阶段,有着成熟的业务模型与深厚的底蕴积淀。它们需要的是正确的结果,稳定的表现,丰富的功能,对数据进行分析加工提炼的能力。所以在传统行业中,往往是Oracle、SQL Server、PostgreSQL的天下。
互联网行业占据了有利的话语权高点,声音大传的远,所以各种培训班里总少不了MySQL的课程。但问题在于不少互联网公司自己已经一只脚迈入“传统行业”了,越来越多的互联网公司也开始脱离了糙猛快的低级循环,将目光投向了 PostgreSQL 。
MySQL最大的问题在于:它的生态位越来越狭窄。论严谨的事务处理与数据分析,PostgreSQL甩开它几条街。但论糙猛快,快速出原型,文档数据库MongoDB比MySQL更能担此大任。因此我们可以看到在DB-Engine中,排名第四的PostgreSQL与排名第五的MongoDB一前一后,呈现对MySQL的夹击之势。可以说,MySQL处在一种吃老本的位置上,凭藉巨大的存量维持着。但时间是站在PostgreSQL这一边的。
MySQL的另一个问题是职业发展问题,程序员学技能都是为了增强自己的竞争力。学好MySQL,可以成为一个合格的CRUD程序员。单纯干CRUD只是“数据矿工”,数据分析才是数据产业链上的暴利肥差。以MySQL孱弱的分析能力,很难支持码农转型发展。相比之下PostgreSQL则游刃有余,一招鲜吃遍天。人无我有,人有我优。MySQL能干的CRUD,Postgres现在干的比MySQL还要好。MySQL干不了的数据分析,地理行业空间数据查询分析,时序插件物化视图物联网分析,搜索引擎全文检索倒排索引,FDW对接各种外部数据源,Postgres一个数据库全都可以做。使用PostgreSQL的程序员,要多一条转型数据分析的道路。
最后最重要的问题,MySQL叫好不叫座。叫好是因为互联网公司声音大,用的多,喊得响亮。不叫座是因为互联网公司在软件上非常抠门,有开源的用是绝对不会用商业的。我们可以看到各种数据库厂商暗搓搓出品的“自研数据库”大体都是基于PgSQL改造的,卖PgSQL衍生版是一个很成熟的市场,传统企业不差钱且愿意付费买单。举个例子,HW基于PostgreSQL搞openGaussDB,就是一个很明智的选择。但卖MySQL卖给互联网公司?那就真是想多了。

与NewSQL相比

最近市场上当然也有一些很亮眼的NewSQL产品,例如TiDB,cockroachdb,yugabytesdb等等。何如?我认为它们是对开源软件行业的贡献,但可能同样面临叫好不叫座的困局。
这些NewSQL大体上主打“分布式”的概念,主要通过“分布式”,解决水平扩展性容灾两个问题,同时因为分布式的内在局限性,将会牺牲许多功能。我接触过不少企业用户,绝大多数场景下的的数据量和负载水平完全落在单机Postgres的处理范围内(弄过十几TB的单库,几十万TPS的单集群)。牺牲功能换取扩展性很可能是一个伪需求,从数据量上来讲,绝大多数企业终其生命周期的数据量也超不过这个瓶颈;至于性能就更不重要了,过早优化是万恶之源,很多企业的DB性能余量足够让他们把所有业务逻辑用存储过程编写然后高高兴兴的跑在数据库里。
所以这些NewSQL要解决的问题往往是 互联网 企业才会面临的问题,然而互联网企业又极少为这些软件买单。这就面临和MySQL类似的问题。没有利益之油的浇灌,天才之火也难以持久

弃暗投明?

很多老程序员已经和MySQL形成了深度利益绑定,天天嚷嚷着MySQL多好多好。触动利益比触动灵魂还难,人上了年纪就很难学新东西了,看到自己擅长的技术日落西山那肯定是愤懑不平💢。毕竟俺年纪一把,PostgreSQL再好,让我抛弃我心爱的小海豚,做不到啊。但年轻人还是有机会选择一条光明的道路。

时间是最公平的裁判,客观趋势不以个人意志为转移。就我个人观察,在新兴的极有活力的Golang开发者群体中PostgreSQL的流行程度要显著高于MySQL(例如Instagram,TanTan,Apple都是Go+Pg)。这里的主要原因就是新生代开发者的崛起,Go之于Java,就像PgSQL之于MySQL。简单明了。
这其实就是演化的核心机制 —— 新陈代谢。Go和PgSQL慢慢拍扁Java和MySQL,但Go和PgSQL当然也有Potential在以后被诸如Rust和某些newSQL数据库拍扁。但说到底,搞技术还是要搞那些前景光明的,不要去搞那些日薄西山的,(但也不适合太早去当烈士吃螃蟹)。要去看新生代开发者在用什么,有活力的创业公司、新项目、新团队在用什么,弄这些是没有错的。
继续阅读
阅读原文