一年一度的Postgres全球开发者盛会6月16-20日在加拿大渥太华举行,我也是第四年参加这个会,会上收获良多,所以决定写篇文章给国内的Postgres的爱好者分享一下大会的情况。
Postgres相关会议主要包含两类,一类是面向内核开发者(全球开发者大会),一类是面向用户(如Postgres Open、欧洲大会、日本大会、中国大会等)。其中面向内核开发者的最重要的会议是全球开发者大会Postgres Global Developer Conference,基本社区最主要的成员都会参加。
广州飞温哥华转机到渥太华,整整17个小时,晚上12点才到酒店安顿下来,在倒时差中参加了四天的大会。大会每年都在渥太华大学的校园举行,BSD的会完了就到Postgres的会,两个会都是同一个人在组织。
大会包含几个主要环节,前两天是unconferences, 主要是自发的组织议题讨论,一般是下一个版本要开发的一些大特性,后面两天是大会的演讲环节,包括培训还有相关的话题,最后一天下午还有一个闪电演讲环节(lightning talk)主要是一些快速演讲的小题目。
大会大约有240人左右参加,与往年大约相当,主要是来自世界的Postgres开发的主要公司(EnterpriseDB、NTT、2ndQuadrant、富士通、Teradata、华为等),还有关键的用户企业(Amazon AWS、Saleforce)。主要的赞助商为EnterpriseDB及富士通。从参会的情况来看,目前社区的参与力量趋向多元化,美国、欧洲(英、德、瑞典、俄罗斯)、亚洲(日本、中国、印度)这三极力量成为社区的主要力量。日本今年发表的主题多达10个以上,是历届最多的一次,富士通也第二年成为主要赞助商,反映日本在社区的影响力逐渐上升。来自中国的华为也正式第一次作为赞助商出现在会上,是国内首家。
华为今年在会上作了两个演讲,主要是涉及提高单机性能的多核扩展(Scalable MVCC Solution for Many Core Machines)及动态编译(Go Faster with Native Compilation)。由于相关技术都是相对前沿的关键技术,整个社区对演讲非常感兴趣,社区所有核心成员及关键开发人员都到场听了两场演讲。社区领袖Josh Berkus在其博客里面用一节篇幅专门详细介绍华为的动态编译的议题。
7月份Postgres的最新版9.5已经发布公测版,主要的特性包括块索引(BRIN Index)、行级别的安全控制(Row level security)、插入合并(UPSERT,类似Oracle的Merge Into)、多核的扩展性等。
多核并行执行: 目前EnterpriseDB的Robert Haas在社区做的最主要的工作是多核并行执行(Parallel execution),即把一个复杂计算分解由多个进程执行,这个特性可以使得Postgres能够充分利用高性能服务器的多核计算能力,尤其对于全表扫描、排序、索引重建的性能有大大的提高。9.3及9.4主要集中在构建并行执行的基础部件,并行执行还是基于多进程来实现,其基础部件包括能够动态启动一个 自定义的进程(dynamic background workers) 同时还要能够 支持动态分配及回收内存(dynamic shared memory) ,还有 信息能够在多进程互相传递(shared memory message queues) ,这些工作在去年及前年已经完成。9.5增加了另外一些基础设施, 包括错误信息在多进程间传递(error propagation) 还有 并行执行的上下文环境管理(parallel contexts) ,但原计划在9.5实现的第一个最重要的 并行扫描特性(Parallel sequential scan) ,虽然代码已经写好,但还有一些没有解决的问题,所以需要推迟到下一个版本明年的9.6才能够完成。并行扫描特性(Parallel sequential scan)主要是在执行器里面把原来的全表扫描seqscan拆分成并行执行的算子,新增加了两个算子Funnel及Partial Seq Scan算子,funnel算子主要负责结果汇聚及协调,多个Partial Seq Scan算子进行并行扫描。
多核扩展: 在9.5里面,Enterprisedb对于多核扩展性还作了优化,读的扩展性由 原来的32核扩展到64核 ,主要是由于对于锁进行了相关优化。 另外9.5引入了一个新的索引(BRIN) ,就是对每个块里面包含的数据的最大及最小值做一个索引,这样能够大大提高大数据量查找的效率,同时能够保持索引的代价比较小。
FPGA加速: 日本NEC的员工KaiGai Kohei在9.5引入了FPGA/GPU加速相关的基础设施。硬件加速可以分担一些比较复杂的计算提高性能,例如把全表扫描或者是表结合这些比较重度的任务交给加速器,加速器执行完以后把结果返回给数据库。NEC的解决方案是引入一个调度模块PG-STORM,这个模块负责把任务发送给外部加速硬件,同时通过DMA把数据传输到加速器。同时把在 Postgres 9.5里数据库的执行器的扫描算子变成可定义(custom scan ),在自定义的扫描算子与PG-STORM进行交互。目前可以支持把表扫描、表结合、聚集函数、排序操作卸载到FPGA板卡上,据称在某些场景下最快的性能可以提升十倍。
插入合并(UPSERT) 是9.5版本的最重要特性之一,这个特性的主要功能是在批量导入的时候,当insert记录入库,如果没有记录就直接插入,如果记录已经存在就更新,就是混合了update及insert的操作。由于Oracle本身已经有这个功能Merge INTO,在系统中大量使用,是Oracle迁移到Postgres里面缺失的最重要的功能之一。这个特性历时三年今年终于进入主版本。
开发流程反思: 另外还有一个大会热议的焦点就是一个致命缺陷引发了对整个社区开发流程的反思。Postgres一直以来是代码质量最高的开源产品之一,但是在9.3的时候一个committer修正了一个bug(multixact相关),虽然修改简单,但是所涉及的代码的逻辑极为复杂,在当时检视没有发现任何问题,结果到了9.4在实际生产系统中引发一系列数据丢失的严重事故,整个社区才意识到问题的严重性,并提供了多个修复的紧急版本,但是修复的代码又引入了新的问题,由于问题过于复杂,需要大修改才能解决问题,目前仍然没有完全解决问题。在本次大会,不仅讨论了相关解决的技术细节,而且引发了缺陷如何管理等一系列组织流程上的反思,并有核心组员提出需要增加相关故障恢复的测试,是社区的一个里程碑式的事件。
Core team member Bruce Momjian wanted to know whether this was a special case, or if it shows a failure in the PostgreSQL development process, saying: "We're super-reliable, but we're so used to it that we haven't tried to focus on reliability."
9.6预计分五个迭代开发,从7月1日到明年的3月底,大约在6月中发布Beta,10月份左右GA。
在9.6以及最新的版本里面,性能仍是最关注的焦点。
多核扩展性 是一个主要方向,目前的主要工作有几个。一个是EnterpriseDB继续延续目前在并行执行Parallel execution的工作,在9.6里面完成并行表扫描的特性(Parallel sequential scan),同时优化目前锁相关的冲突提高多核的读写扩展性,另外的一个是华为在社区提出的MVCC机制的优化方案(利用CSN进行可见性判断)。
新硬件的支持 是另外的一个重要方向。前面已经提到,NEC目前已经把很多基础的操作卸载到FPGA上,后续会有更多的复杂操作会在FPGA上面来去做。另外Teradata的Aster data的人员提出,未来的磁盘会向SSD及大容量廉价的叠瓦式磁盘SMR(Shingled magnetic recording) disk演进,叠瓦式磁盘的空间容量更大,后续后可能会放量发货。这种磁盘的主要特点是空间大,但重写(更新)的代价会更加高,所以Postgres目前需要在架构上避免重写(Hint Bits、Page Freeze等)。
列存储引擎: 另外一个性能方面的增强是内置的列存储引擎(Native Columnar Storage),富士通提到他们研发的列存储引擎应用到富士通Postgres数据库一体机上,对于分析的性能最快的提高了13倍,社区也在讨论在Postgres内核里面如何引入内置的存储引擎。
动态编译: 华为提到的利用LLVM动态编译提高数据库的性能,这个也会成为后续发展的一个重要方向。
表分区: 还有日本Postgres用户企业联盟在大会上提到,他们去年针对5000家企业做了调查,目前企业认为Postgres导入到关键业务领域的时候,主要有两个特性诉求比较大,一个是表分区的特性,另外一个是目前Postgres的错误代码难以快速定位问题。表分区虽然目前社区已经有,但是在分区表数量比较大时候性能比较差,不能满足关键业务的要求。NTT Data的人员表示其9.6要做的一个工作就是重新设计高性能的表分区特性。
另外一个发展焦点是水平扩展性。
Sharding解决方案:pg_shard 是目前比较活跃的分库解决方案,这个会上讨论比较多的是对于目前架构的优化,原来是使用一个主节点存储元数据信息,开发人员提到希望把元数据放到所有节点,这样就不需要主节点,但是元数据的同步需要引入Pasox协议进行同步。EnterpriseDB及NTT在会上意外的抛出了 利用外部表FDW构建Postgres内置的分库(sharding) 的解决方案。NTT以前是Postgres集群Postgres-XC的最主要的支持者及开发力量,NTT希望PG-XC里面的功能能够回合到社区的内核,这样才可能长远发展,而目前看来最现实的方法就是基于外部表FDW来实现分库的解决方案。这个方案包括几个技术点,一个是在外部表实现表继承(这样才能建立协调节点与分库节点的关系)这个特性在9.5已经实现,另外一个是要把下推的功能(push down)的功能在外部表实现,而这个方案的最大难点是在外部表实现分布式事务,EnterpriseDB在社区上提出其外部表其解决的方案和思路。他们提到争取在2-3年内实现这个方案。但与会的很多关键人员多这个方案持保留意见,pg_shard方的人员认为其之前已经采用过FDW的方案,但是最终放弃了,而且这个方案没有考虑可用性。
Postgres-XC/XL集群: 但是,很多人表示,用外部表实现分库的方案只能解决一部分的问题,如果要实现全功能的集群仍然免不了继续在Postgres-XC或者XL上发展。目前有欧洲的2ndQuadrant、俄罗斯的团队、还有中国和日本的团队在进行开发。比较值的关注的是国内现在在这方面的开发比较活跃,日本NTT的铃木市一和我发起的旨在融合Postgres-XC/XL的github上的新项目Postgres-X2里面,铃木市一和我是项目的发起人和Owner,目前这个项目汇聚了很多中国公司,并在国内已经有几个商用的应用点,计划在7月底在杭州举行开发者大会。基于目前开发力量比较分散,俄罗斯人员呼吁所有力量团结起来,共同开发成熟的集群产品。大家建议今年在欧洲的Postgres大会一起共同商议后续的发展。
逻辑复制: 集群的另外一个方向是,欧洲公司2ndQuadrant所主推的多主逻辑复制(bi-direction replication),该项目最初是受McAfee资助开发。传统的Postgres的复制只能够对整个数据库进行复制,不能对单表或者单库进行复制,同时复制是单向的,而这个项目可以对复制进行控制只复制某些特定的表或者信息,同时多个节点可以进行双向复制(需要定义冲突解决机制)。从9.3起已经有多个特性陆陆续续合入内核,计划在9.6完全融入内核,目前还在活跃开发。
自治事务: Postgres缺失的Oracle功能除了Merge INTO以外,另外一个最大的功能就是自治事务,包括2ndQuadrant的Simon Riggs及华为都提到会在社区开发这个功能。
今年是第一次给大家用文字简单分享了大会的收获,希望对大家有帮助。
每年一次去参加这个会,每次与来自世界各地的社区的老朋友相聚外,都能够感受到开源社区不仅仅是技术的纽带,还是联系朋友与友谊的纽带,每年大家聚一起除了分享各自的技术想法,还分享各自一年来的生活。这个就是开源社区的魅力吧。
国内的Postgres社区也期待大家的参与和加入。