传统行业去O上云,为什么选择PostgreSQL替换ORACLE

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

拿什么替换

替换ORACLE,就是用开源数据库进行替换,开源一定是一个大趋势,可以快速构建生态,培养群体,收割大客户,闭源始终是一个黑盒,就像瞎子走夜路暗中摸索一样。开源的数据库代表包括蒸蒸日上各种大肆宣传的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的名号出去招摇撞骗,拉个双眼皮敷个面膜拿出去卖,没人管你的。

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

为什么去"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的优点有哪些

支持SQL2016大部分特性,至少实现了SQL2011标准中要求的179项主要功能中的160项,这几乎超过了任何其他数据库引擎。支持多种语言,C、C++、Perl、Python、Java、Tcl以及PHP等功能丰富,利用内核代码中的Hook,可以在不修改数据库内核代码的情况下,自主添加任意功能,如杀手锏GIS、pg_hint_plan等等社区活跃,生态友好,国内外基于PostgreSQL有很多优秀的产品,这些商业主体会集成和发扬,并反哺社区,让PostgreSQL更好用,如pglogical,小于v10的版本得用这个插件实现逻辑复制,后来v10引入的原生逻辑复制基本上将这个插件引入了内核,只不过pglogical有更强大的复制冲突处理能力。FDW机制可以让你可以在同一个PostgreSQL中像操作本地表一样访问其他数据源,如Hadoop、MySQL、Oracle、MongoDB、ES等,且不会占用PostgreSQL的过多资源。与PostgreSQl配合的开源软件很多,有很多分布式集群软件,如pgpool、pgcluster、slony、plploxy、citus等等,很容易做读写分离、负载均衡、数据水平拆分等方案全栈数据库,流式处理Pipelinedb、时序数据库TimescaleDB、空间数据PostGIS、分布式citus、pgxl、yugabyte、图数据ADG、NoSQL Json、JsonB、Hstore等协议友好,采用类BSD协议,是无数国产数据库厂商的衣食父母,基于PostgreSQL开发的国产数据库太多了如人大金仓、瀚高、优炫等等,为什么?协议友好啊,前阵子央采(中央国家机关2021年数据库软件协议供货采购项目征集公告发布)数据库,可以看一下,遍地都是PostgreSQL的影子完全开源,注释清晰,代码质量高,对于不懂coding的,只要有一点C语言基础,都可以很容易看懂相关源码,比如如下的关于异步IO effective_io_concurrency 的源代码,Issue prefetch requests for the number of buffers indicated by prefetch_count,直接看个注释就大概知道了意思。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的缺点有哪些

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

32位的事务ID,对于写入负载高的库,会经常面临事务ID回卷的问题,openGuass很棒改成了64位,妈妈再也不用担心事务号了缺少Hints功能,需要引入pg_hint_plans插件,并且开发团队多年来一直拒绝支持Planner hints,可能也出于安全考虑吧(强行解释一波)没有原生的进程池,对于大量短连接的场景,需要借助外部工具如pgbouncer、pgagroal等MVCC的实现方式,必须要引入饱受诟病的vacuum,经验不足还会经常导致表膨胀没有原生成熟的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与数据库用户密切相关

如何高效学习PostgreSQL

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

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

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

相关文章

文章浏览阅读773次,点赞6次,收藏9次。【代码】c# json字符...
文章浏览阅读8.7k次,点赞2次,收藏17次。此现象一般定位到远...
文章浏览阅读2.8k次。mysql脚本转化为oracle脚本_mysql建表语...
文章浏览阅读2.2k次。cx_Oracle报错:cx_Oracle DatabaseErr...
文章浏览阅读1.1k次,点赞38次,收藏35次。本文深入探讨了Or...
文章浏览阅读1.5k次。默认自动收集统计信息的时间为晚上10点...