为什么去“O”还得用PostgreSQL

引言

作为三大核心基础软件之一,数据库是信息系统的核心组件,数据库基本上就是一个企业的命脉,对于不少公司,特别是互联网公司来说,如果数据库被删了又没有可用备份,基本上可以宣告关门大吉了,可想而知,数据库的重要性。

去"O"之火

“去O”,是近些年来一直很火的一个话题。作为传统大型商业数据库的典型代表Oracle,在国内众多领域使用非常广泛。在金融、电信、交通、医疗、制造业、能源等诸多领域均有大量使用,几乎覆盖了国计民生的方方面面。阿里作为始作俑者,最早实践了”去IOE”(去掉IBM的小型机、Oracle数据库、EMC存储设备) ,并且取得了很好的效果,要知道一台IBM小型机500万,两台小型机所需的存储300万,Oracle一年的基本质保几十万等等……一笔笔巨额账单让无数企业要么头疼不已,要么望洋兴叹。

为什么要去"O"?最早可追溯到2008年的微软“黑屏”事件,到13年的美国“棱镜门”事件,再到前不久的华为、中兴、Tiktok等事件,可以看到,各种安全事件以及美国对我国的科技封锁与遏制,进行各种毫无理由的打压。再加上甲骨文创始人拉里·埃里森本身就带有一定的威胁论,其本身就带有仇华的观点,这也代表着Oracle的态度。

为此,国家提出了“新创”、“安可”,为的就是实现自主可控,关键技术不被卡脖子,作为核心组件的数据库,自然也亟需自主可控,Oracle不仅费用昂贵,且以流氓行为成为知名的业界毒瘤,除了license昂贵,质保费用也动辄几十万,再加上各种各样的高级周边工具和功能等。其实国家在数年前曾提出过数据库领域的”自主可控”,但受限于当时的技术条件限制,在实际落地中并没有很好的贯彻。随着近些年来国内基础软件的发展,其基础条件已逐步成熟。

拿什么替换

说到数据库的替换,主要有两个实现途径:一是我们可以选择国产数据库,诸如老牌国产数据库厂商

有新晋的一些数据库,如最近很火的Tidb、频频打榜的Ocenbase、腾讯的TDSQL、巨杉的SequoiaDB、浪潮的ZNbase等等。

第二,就是用开源数据库进行替换,开源一定是一个大趋势,可以快速构建生态,培养群体,收割大客户,闭源始终是一个黑盒,就像瞎子走夜路暗中摸索一样。开源的数据库代表包括蒸蒸日上各种大肆宣传的TiDB、腾讯的TBase、华为的openGuass等,阿里也深谙之道,也将PolarDB、Oceanbase开源(最早曾经开源过一阵子,后来又闭源了)。现阶段的热词是什么?Mpp、Lake-house湖仓一体化、超融合等,大有不谈分布式数据库就有点Out的感觉了,通过分布式解决集中式数据库存在的水平扩展与容灾高可用两个问题,不管规模、成本以及合理性,统统上分布式数据库。但分布式对于绝大多数人来说,除了要实现的那一套复杂的CAP、Base理论,再加上一系列节点的通过高速内联网络和一系列的一致性协议进行交互通信,机制复杂,看似美好,实则还有很多的路要走。笔者有幸也有过一阵子的分布式数据库经验,其中利弊自己还是十分清楚。那么对于传统事务性数据库的代表,最典型的便是MySQL和PostgreSQL。

MySQL主要用户群体集中在互联网公司,是开源数据库领域市场占有率最高的。2009年,随着SUN公司被Oracle以76亿美元收购(SUN公司在此之前曾以10亿美金收购MySQL AB公司),自此MySQL也被Oracel公司纳入自己麾下。而PostgreSQL,起源于伯克利大学,正宗学院派,代码 (ANSI C) 严谨,注释详细,可读性强,拥有30余年的历史,并且荣获2017、2018、2020年的“全球年度数据库”冠军称号。MySQL和PostgreSQL二者基本瓜分了开源事务型数据库的市场

但是在MySQL被Oracle收购以后,越来越多的人对于MySQL的前景表示了担忧,对于开源的MySQL,或多或少对于Oracle自家的数据库产品产生冲击,这个开源免费的MySQL 对于Oracle更多的是包袱而不是资产。比如淘宝就从Oracle转成了MySQL,一些大型互联网公司也在推行去IOE,甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险,如Percona 和 MariaDB,但是相当于脱离了主干分支,自给自足。

PostgreSQL就不一样了,如果说99%的开源数据库都是被商业公司控制的,那么PostgreSQL就是那 1%,PostgreSQL的协议是类BSD 许可,可以随意分发、闭源或开源,可以被用于商业目的或其他场合,也就是说你不打着PostgreSQL的名号出去招摇撞骗,拉个双眼皮敷个面膜拿出去卖,没人管你的。

Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies.

PostgreSQL是一个纯社区的数据库,基本上每3个月推出一个补丁版本,这意味着已知的Bug很快会被修复,有需求也会及时得到响应。虽然看似发版很快,但是关注commiters的讨论邮件可以发现,一个功能往往需要讨论许久,经过反反复复的验证之后,才会上,是十分严谨的。另外commiters遍布全国,由全世界超过1000名贡献者所维护。它提供了单个完整功能的版本,官方统一开发,统一维护,社区版有所有功能,还有来自于独立厂商的商业支持,比如EDB (enterprisedb)、postgrespro等,不像MySQL有标准版、企业版、经典版、社区版、开发版、web版等,MySQL由于历史原因,分裂为三个分支版本,MariaDB分支、Percona分支 、Oracle官方分支,发展到目前为止各个分支基本互相不兼容Oracle官方分支还有版本之分,分为标准版、企业版、经典版、社区版。

PostgreSQL经过多年的发展,得到了学术界和工业界的充分认可,基于PostgreSQL衍生而来的数据库简直太多了,实乃无数数据库厂商的衣食父母。


  • 1999年获Linux World杂志的该年度"最佳数据库产品"称号。

  • 2000年荣获Linux Journal杂志编辑选择的"最佳数据库"奖。

  • 2002年获Linux New Media杂志编辑评选的“最佳数据库”奖

  • 2003年,也就是最近再一次荣获Linux Journal杂志编辑选择的" 最佳数据库"奖。

  • 2004年获ArsTechnica最佳服务器应用奖。

  • 2008 获得Developer.com编辑选择的数据库工具方向的年度产品。

  • 2017、2018年连续两年赢得了“全球年度数据库”冠军称号。

  • 2019年获O’Reilly终身成就奖,这是继Linux之后第二个获得该奖的开源产品。

  • 2020年再次赢得了“全球年度数据库”冠军称号。

为什么去"O"得用PostgreSQL?

Oracle和PostgreSQL在架构上是十分相近的,包括进程架构、共享缓冲池等。从功能上说,PostgreSQL可以与Oracle数据库媲美。Oracle数据库是目前功能最强大的商业数据库,PostgreSQL则是功能最强大的开源数据库。从Oracle转型到PostgreSQL比MySQL转型到PostgreSQL容易太多了,笔者就多次见到从MySQL转型过来的,在PostgreSQL下面建了多个database然后又吐槽居然不能跨库访问的,还得用什么dblink,因为PostgreSQL里面的schema的概念对应MySQL的database。

另外PostgreSQL是严格的学院派数据库,支持严格的ACID,稳如老狗,一个打十个。

MySQL更加适合业务逻辑相对简单、数据可靠性要求较低的互联网场景(比如google、facebook、alibaba),基本上MySQL能做的PostgreSQL都能做。

PostgreSQL的优点有哪些

  1. 支持SQL2016大部分特性,至少实现了SQL2011标准中要求的179项主要功能中的160项,这几乎超过了任何其他数据库引擎。

  2. 支持多种语言,C、C++、Perl、Python、Java、Tcl以及PHP等

  3. 功能丰富,利用内核代码中的Hook,可以在不修改数据库内核代码的情况下,自主添加任意功能,如杀手锏GIS、pg_hint_plan等等

  4. 社区活跃,生态友好,国内外基于PostgreSQL有很多优秀的产品,这些商业主体会集成和发扬,并反哺社区,让PostgreSQL更好用,如pglogical,小于v10的版本得用这个插件实现逻辑复制,后来v10引入的原生逻辑复制基本上将这个插件引入了内核,只不过pglogical有更强大的复制冲突处理能力。

  5. FDW机制可以让你可以在同一个PostgreSQL中像操作本地表一样访问其他数据源,如Hadoop、MySQL、Oracle、MongoDB、ES等,且不会占用PostgreSQL的过多资源。

  6. 与PostgreSQl配合的开源软件很多,有很多分布式集群软件,如pgpool、pgcluster、slony、plploxy、citus等等,很容易做读写分离、负载均衡、数据水平拆分等方案

  7. 全栈数据库,流式处理Pipelinedb、时序数据库TimescaleDB、空间数据PostGIS、分布式citus、pgxl、yugabyte、图数据ADG、NoSQL Json、JsonB、Hstore等

  8. 协议友好,采用类BSD协议,是无数国产数据库厂商的衣食父母,基于PostgreSQL开发的国产数据库太多了如人大金仓、瀚高、优炫等等,为什么?协议友好啊,前阵子央采(中央国家机关2021年数据库软件协议供货采购项目征集公告发布)数据库,可以看一下,遍地都是PostgreSQL的影子


  9. 完全开源,注释清晰,代码质量高,对于不懂coding的,只要有一点C语言基础,都可以很容易看懂相关源码,比如如下的关于异步IO effective_io_concurrency 的源代码,Issue prefetch requests for the number of buffers indicated by prefetch_count,直接看个注释就大概知道了意思。

    /*
    * Helper function for heap_compute_xid_horizon_for_tuples. Issue prefetch
    * requests for the number of buffers indicated by prefetch_count. The
    * prefetch_state keeps track of all the buffers that we can prefetch and
    * which ones have already been prefetched; each call to this function picks
    * up where the previous call left off.
    */
    static void
    xid_horizon_prefetch_buffer(Relation rel,
                        XidHorizonPrefetchState *prefetch_state,
                        int prefetch_count)
    {
        BlockNumber cur_hblkno = prefetch_state->cur_hblkno;
        intcount = 0;
        inti;
        intnitems = prefetch_state->nitems;
        ItemPointerData *tids = prefetch_state->tids;
        ...
  10. PostgreSQL不仅仅是SQL数据库,还能高效处理图结构, 轻松实现 "朋友的朋友的朋友",任意字段组合查询 - ERP、电商、网站、手机APP等业务场景 (gin, bloom索引)、网格化、矢量化地图 - 地理类应用、LBS社交、导航等业务场景 (杀手锏PostGIS)、相似内容搜索、去重 - 互联网、数据公司、搜索引擎等业务场景、用户群体搜索、根据标签圈人 - 电商、广告投放 等业务场景、高并发更新少量记录 - 电商、票务系统 等业务场景 (咨询锁),详见德哥的 《数据库选型十八摸 之 PostgreSQL - 致 架构师、开发者》

  11. 每年一个大版本发布,大版本发布的第二年就可以上生产环境,每个版本基本都会引入重量级特性,如9.6引入了并行,10引入了逻辑复制和声明式分区,11引入了JIT即时编译和procedure等等。MySQL的大版本发布一般是2年~3年

  12. 强大的并行能力,MySQL 8.0.14才引入了并行,并且还是个Demo,只能实现并行的扫描,并不能并行的计划,PostgreSQL9.6就引入了并行,前阵子已经发布到了v14,支持多种并行扫描,如并行query、seqscan、nestloop join、aggregate、merje join、hash join等等,充分榨干你的服务器资源。

  13. PostgreSQL的主备复制属于物理复制,相对于MySQL基于binlog的逻辑复制,数据的一致性更加可靠,复制性能更高,对主机性能的影响也更小。

优点太多了,在此不一一列举。

PostgreSQL的缺点有哪些

当然,数据库都是有缺点的,简单罗列了几点,不过这些问题对于经验尚浅的人来说可能比较头疼,资深一点的话就也不是太大问题。有些其实可以叫做 “特性” 而非缺点,只不过被无限放大变成了某些人嘴中的 "缺点"

  1. 32位的事务ID,对于写入负载高的库,会经常面临事务ID回卷的问题,openGuass很棒改成了64位,妈妈再也不用担心事务号了

  2. 缺少Hints功能,需要引入pg_hint_plans插件,并且开发团队多年来一直拒绝支持Planner hints,可能也出于安全考虑吧(强行解释一波?)

  3. 没有原生的进程池,对于大量短连接的场景,需要借助外部工具如pgbouncer、pgagroal等

  4. MVCC的实现方式,必须要引入保守诟病的vacuum,经验不足还会经常导致表膨胀

  5. 没有原生成熟的TDE和压缩方案(Toast需要超过1/4 block才行,可以通过toast_tuple_target参数修改),不过最新的v14引入了lz4压缩,相信后面会有越来越多的压缩算法


  6. 复制槽不支持Failover,意味着假如发生了Failover,消费信息会丢失,对于严格的金融场景,这个可能比较头疼,这也是目前限制逻辑复制发展的一大重要因素

  7. 权限设计有点过于复杂化了,包括角色、用户(这二者基本没有区别,除了一个登录权限),另外还搞了一个schema,和SQL Server比较像,database -> schema - >object,假如你有database的权限而没有schema的权限,一样是不行的,对于转型过来的可能很不适应。对于MySQL,模式与数据库同义。甚至可以用create schema来创建数据库,效果和create database一样。对于Oracle,schema与数据库用户密切相关:

    A schema is a collection of logical structures of data, or schema objects. A schema is owned by a database user and has the same name as that user. Each user owns a single schema.

  8. 没有列存,TP能力才是老本行,虽然有很多AP的特性如CTE、CUBE、物化视图等。

  9. 和MySQL中使用的auto increment不同,PostgreSQL和Oracle类似,都是用sequence,sequence的好处在于可以让多张表共享同一个自增序列,但创建起来的确也挺麻烦。所以还新增了一个seriel类型。

  10. PostgreSQL查询的时候是大小写敏感的。而且在建库时不能像MySQL那样,通过collation参数来指定数据库是否大小写敏感。

如何高效学习PostgreSQL

那么如何高效学习PostgreSQL呢?对于刚入门的小白,建议先从书本学起,看书,有些好书值得回味2遍以上,这里分享一下个人的看书历程

随着学习久了,就不应该局限于书籍了,尽信书则不如无书。可以多搜搜网上的资源,国内的包括中文社区、瀚高主导的开源分会等,都是学习PostgreSQL的好地方。个人比较喜欢浏览的主要有:

  • https://github.com/digoal/blog/,PostgreSQL布道师,传教士

  • https://severalnines.com/database-blog

  • https://www.enterprisedb.com/blog/tuning-sharedbuffers-and-walbuffers EDB enpriseDBW

  • https://www.cybertec-postgresql.com/en/blog/

  • https://www.percona.com/blog/category/postgresql/

  • https://momjian.us/main/presentations/performance.html 核心commiter Bruce Mojian的博客

  • https://habr.com/en/company/postgrespro/blog/442776/ Egor Rogov

  • https://www.interdb.jp/pg/,PostgreSQL内幕指南英文版

  • https://postgresqlco.nf/doc/en/param/vacuum_cleanup_index_scale_factor/,查阅参数、追踪源码

  • PostgreSQL Tutorial、Postgres Video Course、Postgres for Data Engineers、Postgres Administration Essentials:免费学习

另外之前也提过了,PostgreSQL源码是十分优雅和清晰的,对于学习C语言是一个极好的模板,多看源码自己尝试去调试,可以极大提升对PostgreSQL的认知。这里分享一个在线查看源码的地方,懒人必备:https://doxygen.postgresql.org/。

最后就是不断投入到社区建设里面,推动PostgreSQL在中国的发展,对于自己也是一个极大的提升。

PostgreSQL的发展势头是很猛烈的,国内包括平安、去哪儿、斯凯网络等PG大户,国外如日本电报电话公司、Skype、Instagram、Gitlab,主流的云服务提供商如亚马逊、阿里云、腾讯云、华为云也都提供了PostgreSQL的云数据库服务。另外有国家政策扶持啊!

总之2021学什么?不用我多说了吧。

请使用浏览器的分享功能分享到微信等