暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

技术分享 | PostgreSQL为什么可以自称“最先进的开源数据库”

博森瑞 2021-06-24
1588


全栈数据库


一套成熟的应用系统会用到很多的数据库功能组件:包括cache,OLTP,OLAP,Data WarehouseStream,Processing(流处理),MSMQ(消息队列),NoSQL/文档数据库,地理数据库,空间数据库,时序数据库,图数据库等等。传统的业务架构选型,基本会组合使用多种功能组件来进行搭建,典型搭配场景如:Redis + MySQL + Greenplum/Hadoop + Kafuka/Flink + ElasticSearch,一套架构基本能应付绝大多数场景需求了。不过还有比较复杂的就是异构系统集成:大量的代码都是重复繁琐的搬砖代码,干着把数据从A组件搬运到B组件的事情。





在这里,MySQL数据库软件可以扮演OLTP关系型数据库的角色,但对于PostgreSQL而言,就可以从多个维度进行功能解析,比如:

OLTP:业务层面的事务处理需求是PostgreSQL作为传统关系型数据库的基本功能

OLAP:citus分布式插件,ANSI SQL兼容,窗口函数,CTE,CUBE等高级分析功能

Stream Processing:PipelineDB扩展,Notify-Listen,物化视图,规则系统,灵活的存储过程与函数编写

搜索索引:全文搜索索引足以应对简单场景;丰富的索引类型,支持函数索引,条件索引

NoSQL:JSON,JSONB,XML,HStore原生支持,至NoSQL数据库的外部数据包装器

Data Warehouse:能平滑的将数据迁移到同属于PG生态的GreenPlum,DeepGreen,HAWK等,使用FDW进行ETL

图数据:可以进行递归查询

缓存:可以借助物化视图





因此,在一定规模内,PostgreSQL可以一定程度上扮演多面架构中转的角色,一个PG组件作为多种组件使用。虽然在某些特定领域中它比不上一些专用组件,至少是能提供架构的使用方式。而单一的数据组件选型可以极大地减少项目架构的复杂度,这也意味着能节省很多成本。


对大部分应用而言,在其生命周期内不会有超出PG能力范围外的数据和流量量级。为了不需要的规模而设计架构是没有任何意义的,实际上这就是过早优化的一种现象。此外,当没有单个数据组件能满足我们的所有需求时,才会考虑分拆与集成的的利弊。集成多种异构平台是非常麻烦的工作,如果真有那么一种技术可以满足所有的需求,那么使用该技术就是最佳选择,而不要尝试使用多个组件来重新实现目的。

当业务得规模增长到一定量级时,可能就需要使用基于微服务/总线的架构,将数据库的功能分拆为多个组件。但PostgreSQL的存在极大地推后了这个权衡到来的阈值,而且分拆之后依然能继续发挥重要作用。



运维友好


除了功能强大之外,PG还有一个重要的优势就是运维友好。有着许多的实用特性:

DDL能放入事务中,删表,TRUNCATE,创建函数,索引,都可以放在事务里原子生效,或者回滚。

这就能进行很多骚操作,比如在一个事务里通过RENAME,完成两张表的王車易位。

能够并发地创建、删除索引,添加非空字段,重整索引与表(不锁表)。

这意味着可以随时在线上不停机进行重大的模式变更,按需对索引进行优化。

复制方式多样:段复制,流复制,触发器复制,逻辑复制,插件复制等等。

这使得不停服务迁移数据变得相当容易:复制,改读,改写三步走,线上迁移稳如狗。

提交方式多样:异步提交,同步提交,法定人数同步提交。

这意味着Pg允许在C和A之间做出权衡与选择,例如交易库使用同步提交,普通库使用异步提交。

系统视图非常完备,做监控系统相当简单。

FDW的存在让ETL变得无比简单,一行SQL就能解决。

FDW可以方便地让一个实例访问其他实例的数据或元数据。在跨分区操作,数据库监控指标收集,数据迁移等场景中妙用无穷。同时还可以对接很多异构数据系统。

还有很多功能,就不一一列举了。


生态健康


PostgreSQL的生态也很健康,社区相当活跃。

相比MySQL,PostgreSQL的一个巨大的优势就是协议友好。PG采用类似BSD/MIT的PostgreSQL协议,差不多理解为只要别打着Pg的旗号出去招摇撞骗,随便你怎么搞,换皮出去卖都行。君不见多少国产数据库,或者不少“自研数据库”实际都是Pg的换皮或二次开发产品。

当然,也有很多衍生产品会回馈主干,比如timescaledb,pipelinedb, citus这些基于PG的“数据库”,最后都变成了原生PG的插件。很多时候你想实现个什么功能,一搜就能找到对应的插件或实现。开源嘛,还是要讲一些情怀的。

Pg的代码质量相当之高,注释写的非常清晰。C的代码读起来有种Go的感觉,代码都可以当文档看了。能从中学到很多东西。相比之下,其他数据库,比如MongoDB,看一眼我就放弃了读下去的兴趣。

而MySQL呢,社区版采用的是GPL协议,这其实挺蛋疼的。要不是GPL传染,怎么会有这么多基于MySQL改的数据库开源出来呢?而且MySQL还在乌龟壳的手里,让自己的蛋蛋攥在别人手中可不是什么明智的选择,更何况是业界毒瘤呢?Facebook修改React协议的风波就算是一个前车之鉴了。


问题


当然,要说有什么缺点或者遗憾,那还是有几个的:

因为使用了MVCC,数据库需要定期VACUUM,需要定期维护表和索引避免膨胀导致性能下降。

没有很好的开源集群监控方案(或者太丑!),需要自己做。

慢查询日志和普通日志是混在一起的,需要自己解析处理。

官方Pg没有很好用的列存储,对数据分析而言算一个小遗憾。

当然都是些无关痛痒的小毛小病,不过真正的问题可能和技术无关……

说到底,MySQL确实是最流行的开源关系型数据库,没办法,写Java的,写PHP的,很多人最开始用的都是MySQL…,所以Pg招人相对困难是一个事实,很多时候只能自己培养。不过看DB Engines上的流行度趋势,未来还是很光明的。




如果在学习中有疑问或者想要了解更多前线经验,可以在私信留言,老师会及时回复相关的疑问,也可以联系老师加入技术交流分享群,努力提升自己。


推荐阅读

技术分享 | Linux内核内存压缩技术

技术分享 | MySQL行业军规系列--基础规范




        

有帮助请点“在看”


文章转载自博森瑞,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论