当前位置: 首页 > 科技观察

问题来了,PostgreSQL有什么好处?

时间:2023-03-19 15:15:31 科技观察

PostgreSQL的口号是“世界上最先进的开源关系型数据库”,但我觉得这个口号不够明确,什么是“先进”?而且一看就是MySQL“全球最受欢迎的开源关系型数据库”的宣传语,有碰瓷之嫌。我想说最能体现PG特性的描述应该是:全栈数据库,一专长,一招吃遍天下。全栈数据库的成熟应用可能会用到很多数据组件(功能):缓存、OLTP、OLAP/批处理/数据仓库、流处理/消息队列、搜索索引、NoSQL/文档数据库、地理数据库、空间数据库、时间系列数据库,图形数据库。传统的架构选型,可能是多个组件组合使用,比如:Redis+MySQL+Greenplum/Hadoop+Kafuka/Flink+ElasticSearch,一套组合基本可以满足大部分需求。但更麻烦的是异构系统的集成:很多代码都是重复和繁琐的实体代码,做着将数据从A组件移动到B组件的工作。在这里,MySQL只能起到OLTP关系型数据库的作用,但如果是PostgreSQL,则可以一身兼任,一个搞定,例如:OLTP:事务处理是PostgreSQL自带的OLAP:citus分布式插件,兼容具有ANSISQL、窗口函数、CTE、CUBE等高级分析功能,用任何语言编写UDF流处理:PipelineDB扩展、Notify-Listen、物化视图、规则系统、灵活的存储过程和函数写入时间序列数据:timescaledb时间序列数据库插件、分区表、BRIN索引空间数据:PostGIS扩展(杀手级功能)、内置几何类型支持、GiST索引。搜索索引:全文搜索索引,简单场景就够用了;丰富的索引类型,支持函数索引、条件索引NoSQL:JSON、JSONB、XML、HStore原生支持,对NoSQL数据库的外部数据包装数据仓库:可以平滑迁移到同族Pg生态GreenPlum、DeepGreen、HAWK等,使用FDWforETL图数据:递归查询缓存:物化视图可扩展到六台设备,世界无处不在。天空是FDW,大地是Greenplum,东方是Citus,南方是Timescale,西方是PostGIS,北方是Pipeline。——《周禮·辟吉》在探探的旧架构中,整个系统都是围绕PostgreSQL设计的。数百万的DAU,数百万的全局DB-TPS,数百TB的数据,数据组件只用PostgrSQL。后来引入了独立的数据仓库、消息队列和缓存。而这只是一个经过验证的规模,进一步压榨PG是完全可行的。因此,在一个非常可观的规模内,PostgreSQL可以发挥多面手的作用,一个组件可以当多个组件使用。虽然它在某些方面可能不如专用组件,但至少它们都做得不错。选择单一的数据组件可以大大减少项目的额外复杂性,这意味着大量的成本节约。它使十个人能做的事变成一个人能做的事。对于大多数应用来说,在其整个生命周期中,不会有超出Pg能力范围的数据量。针对不需要的规模进行设计是一种浪费,实际上是一种过早的优化。此外,只有在没有单一软件可以满足您的所有需求时,才会存在拆分与集成的权衡。集成多种异构技术是相当棘手的,如果有一种技术可以满足您的所有需求,那么使用该技术是最好的选择,而不是试图用多个组件重新实现它。当业务规模增长到一定程度时,可能需要采用基于微服务/总线的架构,将数据库的功能拆分成多个组件。但是,PostgreSQL的存在大大延迟了这个取舍的门槛,分拆后还能继续发挥重要作用。运维友好当然,Pg除了功能强大之外,还有一个重要的优势就是运维友好。有很多非常实用的特性:DDL可以放到一个事务中,删除一个表,TRUNCATE,创建一个函数,一个索引,这些都可以放到一个事务中原子地生效或者回滚。这样就可以进行很多风骚的操作,比如在一个事务中重命名两个表。可以并发创建和删除索引,添加非空字段,重组索引和表(不锁定表)。这意味着可以在不停机的情况下随时在线进行主要的架构更改,并且可以按需优化索引。多种复制方式:SegmentReplication、StreamReplication、TriggerReplication、LogicalReplication、Plug-InReplication等,让数据迁移变得非常简单,服务不间断:复制、读取、重写三步走,在线迁移稳如狗。多种提交方式:异步提交、同步提交、quorum同步提交。这意味着Pg允许在C和A之间进行权衡和选择,例如,事务库使用同步提交,而普通库使用异步提交。系统视图非常完整,做一个监控系统还是挺简单的。FDW的存在让ETL变得异常简单,一行SQL就可以搞定。FDW使一个实例可以轻松访问其他实例的数据或元数据。在跨分区操作、数据库监控指标采集、数据迁移等场景中非常有用。同时,它还可以连接到许多异构数据系统。功能还有很多,就不一一列举了。生态健康PostgreSQL的生态也很健康,社区相当活跃。与MySQL相比,PostgreSQL的一个巨大优势是它的协议友好性。PG采用了类似于BSD/MIT的PostgreSQL协议。几乎都明白了,只要不打着Pg的旗号出去招摇撞骗,想干什么就干什么,换个皮卖掉就好了。你知道国内有多少数据库,或者说有多少“自研数据库”,其实都是Pg.reskins或者二次开发的产物。当然,也有很多衍生产品会反馈给主干,比如timescaledb、pipelinedb、citus,这些基于PG的“数据库”,最后成为原生的PG插件。很多时候想要实现一个功能,一搜就能找到对应的插件或者实现。开源了,还是要谈谈一些感受。Pg的代码质量相当高,注释写的很清楚。C代码读起来像Go,代码可以像文档一样阅读。可以从中学到很多东西。相比之下,其他的数据库,比如MongoDB,看了一眼就放弃了阅读的兴趣。至于MySQL,社区版使用的是GPL协议,其实挺蛋疼的。如果不是GPL的感染,那么多基于MySQL的数据库怎么会开源呢?而且,MySQL还在龟壳手里。把自己的蛋蛋交给别人握在手里不是明智的选择,更何况是行业毒瘤?Facebook修改React协议的风暴是前车之鉴。当然,如果说有什么不足或者遗憾的话,还是有那么几点:因为使用了MVCC,需要定期对数据库进行VACUUMed,需要定期维护表和索引,避免通货膨胀导致的性能下降。没有好的开源集群监控方案(或者太丑了!),需要自己动手。慢查询日志和普通日志混在一起,需要自己解析处理。官方Pg并没有非常好用的columnstore,对于数据分析来说是一个小小的遗憾。当然,都是无伤大雅的小问题,但真正的问题可能与技术无关……毕竟MySQL确实是最流行的开源关系型数据库。都是MySQL。。。所以Pg招人比较难是事实,很多时候只能自己培养。但从DBEngines的流行趋势来看,前途一片光明。