众里寻它千百度:周正中(德哥)细数从Oracle到PG这些年的摸索与发现

时间:2024-05-20 21:12:55

2016年10月27日-28日,Postgres中国用户大会 2016(PG大象会)在上海浦东盛大举行,为广大技术人开放了交流互动的端口,汇集国内外志同道合之士,吹响PG大牛集结号,秉持开源的理念,以拓展Postgres数据库在中国乃至整个世界范围内的影响力为发展目标,真正实现了“干货井喷”的会议日程,诚意满分,精彩不断。

大会期间,****记者有幸邀请到阿里云高级技术专家周正中(德哥),围绕一些大家关心的话题进行采访。德哥在业界素有“更博不辍”之名,不吝于分享日常的点滴经验,此次更是为大会特别准备了PG之“六脉神剑”,带来了武林秘籍式的干货分享,细数PostgreSQL发展的这些年,分析其应用场景,肯定现在,展望未来。采访中,他亦透露出对PostgreSQL前路的期待。

众里寻它千百度:周正中(德哥)细数从Oracle到PG这些年的摸索与发现

【以下为正文】

****:首先能否先向大家介绍一下自己和所在的团队以及目前所负责的领域?

德哥:我来自阿里云,花名德哥,主要从事PostgreSQL数据库这一块的相关工作。我从2008年开始接触这一领域,深感于PostgreSQL的独特魅力。从初见至今已经过去很多年了,我们每年都能看到PG的高速发展。另外,PG还是一个非常烧脑的数据库,其实对于PG而言,我今天会上的分享只能算是冰山一角,其中还有很多东西值得我们去学习。比如现在我们看到MySQL很多在做的新Feature,实际上在PostgreSQL里早在很多年前就已经实现了,因此PG其实是一个比较具有学院派风格且历史悠久的产品。

我所在的是阿里云ApsaraDB下的RDS内核团队,ApsaraDB现在有MySQL引擎、PostgreSQL引擎,还有其它一些像是MongoDB等很多数据库引擎。在阿里云里,可以说已经有非常多的MySQL用户,如今PostgreSQL的用户也在飞速的增长中。放眼整个市场,其实我们不难发现,包括平安、阿里集团里的菜鸟、高德、友盟等,还有很多BU现在都在使用PostgreSQL,使用它的很多feature去解决它们原来的数据库所不能解决的那些场景下的问题。因此在我看来,PG的未来肯定会非常好,特别是我们可以通过其Roadmap发现,它是在很有计划地逐步进行一些feature和性能等方面的改进,从中可以看到它的思想非常前卫,比如动态的执行引擎技术,这在一些商业数据库(包括Oracle、DB2等)里,都是最近一两年才开始研究发布Preview feature的,而PostgreSQL也已经开始在做了。所谓动态引擎,就是说比如有很多张表的Join,原始的做法是一开始就生成好这个执行计划,随后执行,但实际上很多表Join的时候,你一开始生成的那个执行计划很有可能是不对的。那么动态执行计划就是指它可以边执行边帮助搜集最准确的执行信息,从而调整后面的执行计划,这确实是一门非常领先的技术。另外就是向量计算、JIT等在OLAP领域非常前沿的技术,在PG 10.0 的Roadmap里都有列出。所以说玩PG一方面确实非常烧脑,另一方面我们也能从中学到很多东西——这是我对PostgreSQL的一个理解。

此外,从社区的角度来看,它其实有一个非常值得我们去学习的点:不把自己当做一个封闭的数据库来展现,而是视作一个数据处理平台,为我们开放了很多接口,比如Custom Scan接口。有这样开发能力的用户或一些数据库公司就可以拿这些接口与一些比较新的硬件结合,例如通过GPU或FPGA卡去开发更强大的功能,适合那种包含非常大量数据处理的应用场景。还有就是开放了很多可以扩展数据库功能的接口,像是数据采样的接口、FDW的接口等,而它在数据类型接口方面很早以前就提供这种接口了,所以在整个PostgreSQL数据库生态里,你可以看到很多可能作为一个普通的数据库用户完全无法理解的问题——为什么数据库可以做这种事情,例如我此前分享中提到的图像处理、基因数据处理、文本相似度处理等一系列东西都源自于PostgreSQL所开放出来的这些接口。因此在我看来,PostgreSQL其实是一个非常开放的数据库平台,而不是一个简简单单的关系数据库,这是我对它另一个层面的理解。

****:既然说到了PG的差异性和特性,那能否介绍一下和商业数据库相比,它最吸引你的地方是什么?

德哥:其实我个人在商业数据库方面,接触Oracle多一点,差不多有两三年时间,因此我这里简单讲一下Postgres和Oracle之间的差别。我理解的Oracle是一个非常健壮,功能也非常全面的一个数据库,很早以前它就支持并行计算,就有具有比较好的增量备份恢复等一些很好的功能。而PG走的路可能和商业数据库不是非常像,因为PG有很多社区用户群体,但Oracle要付费,再加之它毕竟不是一个很便宜的产品,所以一般使用Oracle的用户可能会是那些对数据可靠性要求很高,同时也愿意付费的这样一些用户,也就是说Oracle可能偏向于对它的用户群体去做Feature,因此Oracle的企业特性做得很好。

但是PostgreSQL和Oracle也有一定的重叠,就是说PostgreSQL也有很多企业用户。因为一些企业用户可能有比较长远的打算,不愿意在购买软件的Isense场景上投入太多资金,包括我们以前的公司后来也放弃了使用Oracle,因为它确实挺贵的,我们从PostgreSQL社区多年的积累来看,它有几部分群体:一部分是企业群体,据我了解这部分占了50%以上的比例,还有一部分就是像互联网这类新兴行业的工作群体。特别是对互联网这类新行业群体而言,传统的数据库可能还没有准备好往这块发力,但开源数据库比较好的一点就在于我可以拿到你的源代码,而PG又开放了那么多接口给我们,所以用户其实可以很方便地根据我的特定的场景去扩展这个功能,包括我们在社区里也有我们所熟知的做数据分析的企业,它们就拿PostgreSQL做了这种数据分析场景的优化,把一些原来使用很好的成熟稳定的插件,整合到PostgreSQL里面来,从而来帮助解决这种特定的应用场景。而如果你使用Oracle的话,可能根本没办法去做这件事,因为其实你在Oracle眼中,只是其客户群体中极小的一部分,它不可能为你来做这种feature。总结起来说,PostgreSQL的需求来自全球社区的用户,有社区中的数据库公司、高校、用户、技术支持的公司共同来推进,社区和用户是一起往前走的。而Oracle是一家纯商业公司,你无法直接影响Oracle的产品决策,也无法参与到其中,只能跟着它走。 这是比较大的一点差别。

那另外一方面就是我们可以看到PostgreSQL也是几个行业中比较大的群体,像是GIS。GIS这个行业从2002年到现在,PG在这个行业里面已经生根了十几年的时间了,从功能到性能,它无论在军用还是民用方面都覆盖到了。而我们现在也可以看到Redis、Mongo和MySQL等最近发布的版本中也涉及到了这些民用级别的初级功能,还需要长期的积累。像是O2O,以及这种基于位置的应用,它们其实都是在这一块看到了一个比较大的市场,但其实PostgreSQL可能很早以前就已经支撑这类功能了。所以从不管是从长远来看,还是从本身的生态来看,我个人觉得商业数据库和开源数据库的用户群体就决定了它们的未来发展路线。

****:谈了这么多Postgres的话题,那么是什么样的契机让您将目光投向Postgres的呢?

德哥:说到这个问题,其实也是非常有缘分的事情,我当时在做PostgreSQL之前,是在一家公司从事为企业提供IT支持服务的工作,当时我们的用户用的全是Oracle,所以说我其实也做了好几年Oracle相关工作,后来在机缘巧合之下,我进入了斯凯这家公司,这家公司当时的领导问我是否听过PostgreSQL,我当时已经学了好几年Oracle,但是确实没有听过PG这样一个东西。然后他就告诉我PostgreSQL能干些什么,其中有一点非常吸引我——他告诉我在这个数据库里,你可以进行数据分片,也就是说如果你的一个数据库down掉了,它不会影响整体,只会影响你这个数据库里存的这一部分。当然,这在当时可能是一个比较新颖的特性,但我们今天来看也就是一个数据库的Sharding,一个Shard坏了的话其实不会影响整体,但对于当时2008年的而言,特别是我只接触过Oracle数据库,只觉得这是一个极其新颖的技术,于是我就在这家公司逐渐开始接触PG,其实我们当时也是在摸着石头过河。当年的PG版本还是8.3,那里面确实有蛮多的坑,而我们自然也踩过很多坑。之后一步步发展到现在的9.6版本,整个一路走来就会发现,PG有一种想我所想的感觉,所以用得非常顺畅。而且我也发现很多PG圈的朋友,从没有接触过到接触,再到熟悉PG的整个过程中,他们的感受也和我非常类似:觉得找到PG就好像找到“真爱”一样,有一种相见恨晚的感觉。

****:刚刚您有提到曾经踩过一些坑,那么在转向Postgres的过程中或者说在推进Postgres的过程中有没有经历过什么比较印象深刻的经历,可以分享一下经验吗?

德哥:谈到坑这个问题,其实就得回到8.3那个版本了。在那段时期,我们的业务场景就是一个社交场景,搭建在MTK这个平台上,当时的用户量也蛮大的,活跃用户可能也有上百万,并且有大量的数据更新,而当时PG记录页的剩余空间,是通过固定的memory形式来记录,因此也就是说如果我的这个值是固定的,那么数据库在起来之后是不会变的。比方说我允许你记录10兆个页面,那么它可能就只能跟踪这么多。如果你的数据库有更多的页,它就会跟踪不到,从而导致膨胀——我们当时就遇到了这个问题,发现数据膨胀非常厉害,后来我们发现是由于这样的原因之后就通过增加启动时freespace map的memory来处理这个问题,后来调整之后填上了这个坑。

然后我们发现社区本身其实也在不停的改进,到8.4的时候它放出的新版本就开始支持基于文件的freespace map,也就是说每一个relational都会有一个文件去跟踪它的页剩余空间,从而很好地解决了这样一个问题。这也是我非常喜欢PG的一个点:PG社区会把它的问题都积累下来,包括社区很多用户呈上去的问题,然后在之后的一个版本里,可能就会发出相对应的新feature来把之前的问题填补掉。

****:您之前拿Oracle和PG做了对比,那么现在如果在开源数据库当中,PG又有什么更吸引您的独特之处?

德哥:在开源数据库里的话,可以参考DB Ranking(一个给数据库评分的第三方平台),从中我们不难发现,在开源的关系数据库里面,目前其实只有两家,一个是MySQL,另一个就是PostgreSQL。如果把整个开源数据库全部算进来的话其实还有很多,像Mongo、Redis、ModelDB,还有ElasticSearch这样的搜索引擎都囊括在内。那么其中PostgreSQL是如何定位自己的?

其实整个从横向来看,我感觉MySQL做的可能是那种小而美的数据库,也就是说用户也不期待它有多少功能,只要能存能查,支持简单的查询即可。可能正是由于这种定义,在早期互联网刚刚兴起的时候,很多用户就选择了MySQL,因为它部署起来简单,用起来简单,SQL操作也简单。而积累到现在,很多互联网用户的需求在上MySQL基本都能找到很多很好的解决方法,包括逻辑复制、Sharding等,同时很多比较适合互联网的SQL语法它都做得很好。

再来看MongoDB,它是最近几年才兴起的一个文档型数据库,属于Key-value,它所抓住的用户的急迫需求是它可以以文档化的形式来存储数据库。例如很多互联网企业中,它的Schema设计可能就是互联网里面有一个比较流行的词叫做“敏捷开发”,它可能变得很快。但关系数据库则不太适应这种场景,因为这里做一次表结构的变化删减等影响还是很大的。而使用文档来存储这种DDL的话就能很好地解决这个问题,用户今天可以这样存,明天又可以那样存。再者就是对开发人员非常友好且理想,这是Mongo所抓住的一个特性。另外一个特性就是Mongo也支持简单的地理位置信息检索,包括基于经纬度的一些比较简单的检索,所以说它一诞生就吸引了很多做基于地理位置信息相关应用的、做这种文档的用户,也就是那些既要做敏捷开发,又要存非结构化数据这种场景的用户一下子就很多,以上是我对Mongo的一个看法。

另外像是Redis,它其实很简单,就是一个Key-value的内存数据库,但它的效率很高,能够很好地满足低延迟高并发的应用场景,但它的功能很单一,只是Key-value。

现在再回到PostgreSQL,首先从功能角度来看,它其实覆盖了我们前面所提到的包括MongoDB、Redis、MySQL在内的几乎所有场景。其实Redis存的这种key-value在PostgreSQL里很早就有一个叫做HStore的数据类型可以覆盖它这个场景,所以可以说PostgreSQL是一个大而全的产品。而且还有一点就是:可能在当下有用户发现他们有这种需求并且开发出了这种功能,而他又乐意提交到社区的话,那么在经受考验之后,社区可能就会接纳并把它合到PG内核里面去。因此Postgres走到今天所拥有的这么多功能其实都是一路积累过来且经过实践检验的。这就是它和其它的开源数据库相比一个很大的差别:开放的接口,它不是一个简单的关系式数据库,而是一个具有开放接口的数据库处理平台,另外一方面就是说它在功能积累这一点上其实已经超越了现在我们所能够看到的所有开源关系数据库。还有一点是性能方面,它的性能,无论是和MySQL,还是和MongoDB或Redis比,都是无比惊艳的。相较而言你就会发现,它不仅仅是做好功能,在性能方面也非常强大。

****:那说到开源的话呢,其实您对待开源数据库市场的未来您有什么看法吗?

德哥:对于PostgreSQL这个数据库而言,未来的数据库厂商可能会提供这种基于开源版本的商业化插件,然后我们以其开发的接口新增一些扩展的功能,再以这种开放插件的形式提供出来,并且可以在这一块做商业化——这是一个比较好的路子。那么另外就是我了解到PostgreSQL现在在中国的很多公司里,不管是在开发类人才上,还是在管理型人才上,都已经出现了一点供不应求的状态。它们在做数据库选型的时候,其实已经选中了PostgreSQL,但是后来可能由于种种原因,最主要的一个原因就是,这一块的人才在中国还是比较难找的,所以最后它们可能还是决定暂缓这种更换数据库的计划,可能还会等到数据库这一块的人才发展起来之后再进行一个新的转变。因此Postgres培训这一块在中国也可以预见到一定的市场。

此外,在云市场这一块,因为前面提到企业在做数据库选型的时候,其实前提是一定要能够Cover住这个产品才会被选中。即使一个数据库再好,但是如果不能Cover住,在企业中可能就没有办法采用。但在云市场就不一样,因为在云市场里,开放给用户的只是数据库的连接端口,包括链接地址还有用户名和密码,它其实不需要关心这个数据库怎么样去做HA,怎么样去做备份,怎么样去做运维……所以如果我们已经看到很多用户对于PG本身有使用的需求了,但是它没有能力去Cover这个产品的话,在云市场这一块也是很好的一个尝试,因此我们可以看到很多包括阿里云、腾讯云、百度云等在内其实现在都有提供PostgreSQL的RDS服务。

****:PG适用于哪些企业的应用场景,在您的团队当中PG处于哪个架构层面,承担什么样的责任?

德哥:其实这个问题我在之前发过的一篇文档中有讨论过。如果我们纯从技术角度来讲这个问题的话,你就会发现PG其实有点像一个通吃型的数据库,除了大数据那一块我可能现在使用单节点的PostgreSQL是没有办法满足的,但是基于PostgreSQL有很多的MPP产品,像是Greenplum。这类产品可以Cover住那种百TB级,甚至PB级以上数据量的OLAP的业务需求。那么从OLTP的角度来看的话,目前PG在这块市场基本上能够覆盖到所有用户的所有需求,包括图数据库,还有如流式处理数据库。其实我们原来可能想都不敢想,在关系数据库里面怎么能够处理这种数据。但其实PG因为有开放的接口,所以从中我们其实已经能够看到流失处理的体现,而且已经有这种产品了,例如PipelineDB。而图数据库的话,我相信如果有这种比较成熟的开源图数据库的话,可能就会有用户说“我是不是能够把这种开源的图数据库的代码切过来放到PG里面来,那我就是在PG里面也能开跑这种图是数据库的特色了”。其它一些常见的场景,PG和其他的关系数据库一样都是可以满足的。

现在PG在阿里云内部相当于是在RDS这个团队里,我刚刚提到的RDS里有MySQL、SQL Server、PDS,当然还有PG和一些其它数据库。这也就是说你其实可以将阿里云里视作一个关系数据库的引擎。所以从架构上来将,其实我们现在是挂在RDS里,然后还有一些其它的产品,包括像Greenplum这种分析式的产品,那么这一块的话我们其实是挂在这种分析型的分支里面的,总体是这样一个状态。

****:您能否结合多年来的实践经验,和数据库相关的技术从业者分享一些您的建议,同时作为“博客高产王”,在学习方面,您有什么独到的学习渠道吗?

德哥:从我的角度来给一些建议的话,就是我前面也有谈到PG真的是一个非常烧脑的东西,我其实每次来参加不管是PG用户会自己的这种会议,还是其它的这种技术圈子邀请的会议,我每次都要重新准备分享内容——因为PG发展实在太快了,可能我今天写的东西再过几天就失去时效性了;还有就是PG涉猎极广,它涵盖了从机器学习到基因处理、图处理、路由算法等大量的技术。所以我们其实不论是学习PG,还是学习其它数据库,一是要坚持,二是要有一个非常开放的心态。你不能学什么东西就局限在这里,而是需要有很深厚的知识积累,不管是数学知识的积累,还是其它计算机原理的的积累,这种基础都一定要打好,然后再加上你的坚持,我相信无论是学习PG,还是学习其它内容,应该都不会是一件难事。

再者,就是说我个人的感受,其实如果你喜欢这个东西你肯定会乐于花经历去学习,我本身确实比较喜欢PG,所以才会花那么多的精力去学习。而且我也喜欢折腾,喜欢刨根问底,喜欢用我的方法去验证我所想的东西是否正确可行而不是等待别人告诉我结果,大概就是这样一种学习态度。

最后还有一点就是我也比较期待我们的“小鲜肉”们能够多做分享,不要怕错误,其实也没有什么圣人,即使圣人也会犯错误,我分享的一些东西,估计里面也有很多错误,但分享这个过程所能带来的效益往往是超乎想象的。

****:最后,作为PG社区的领军人物,您对PG社区未来的发展前景有什么想要说的?

德哥:不管是在全球的发展,还是在中国的发展,我都非常看好PG的前景。从我参加第一次PostgreSQL中国社区用户会开始到现在,我所看到的和我所期待的是非常吻合的,所以我有理由坚信将来PostgreSQL的相关发展一定会非常美好。谢谢大家的关注,一起来学习和分享吧。


众里寻它千百度:周正中(德哥)细数从Oracle到PG这些年的摸索与发现