表分区是一组用来处理大型数据的技术,以及管理数据的方便选项。总而言之,将大表划分为更易于管理的多个小表,称之为分区。
北京时间6月27日,PostgreSQL国际社区开发者、EDB日本公司工程师Amit Langote受中国PostgreSQL分会邀请前来参加“Postgres.Live云端技术沙龙第二期”主题活动,与中国PostgreSQL爱好者,关注者以及从业者畅聊Postgres中的表分区。
NO.1技术分享
在演讲环节,Amit Langote向大家分享了什么是分区;Postgres中的分区介绍,包括之前的分区、声明式分区、语法、索引、约束、触发器、复制和优化;分区的最佳实践和陷阱三方面的内容,内容言简意赅、颇有趣味。
其中Amit Langote提到,PostgreSQL v10后的分区表上允许使用语句级(Statement-level)触发器;PostgreSQL v11后允许分区表上的行级AFTER触发器;在即将发布的PostgreSQL v13将允许对分区表执行行级BEFORE触发器。
另外,直到PostgreSQL v12为止,复制只能处理未分区的表。也就是说,分区表无法添加到PUBLICATION中,而SUBSCRIPTION更无法将其接收到分区表中。而在即将发布的PostgreSQL v13中则可以复制分区表。
NO.2答疑互动
之后的答疑互动环节,根据聊天栏内大家现场提出的问题,Bruce Momjian乐此不疲、一一做出解答。
以下是小编对于问题和答案的整理:
问:数据表多大适合表分区,分区键应该如何选择?
答:通常是达到1TB,但有的人达到4TB才变成分区表,也有的人100GB就变成分区表,这完全取决于你的应用场景。分区键如何选择,在我刚才的演讲中有详细说到,供你参考。
问:PostgreSQL支持最大的分区数量是多少?
答:PostgreSQL并没有限制你创建多少个分区,但是我建议不要创建一千个以上,因为对你其他方面的性能会有所影响。
问:什么业务场景适合表分区?麻烦以你的工作内容举个例子。
答:我实际工作中没有遇到表分区的应用场景,我的工作就是写代码、写PostgreSQL的功能。但我了解到很多企业用时间相关的数据来做表分区,这个蛮常见的。
问:当你有一个很大的表,想把它变成分区表,该怎么做呢?
答:我刚才的演讲也讲到了,有很多种做法,具体由你的应用场景来决定,我现在也没有一个很好的指标性答案来回答这个问题。
问:有没有工具可以测试下分区表的性能,比如在实际产品部署之前,可以用其简单做个性能测试?
答:官方PostgreSQL目前没有工具可以测试分区表来看它的性能表现,但是有另外一个工具叫HypoPG,它可以创建一些虚假的数据来做测试,但是目前它不支持最新版本的PG。
HypoPG地址:https://hypopg.readthedocs.io...
问:在高可用方面用Nginx或Haproxy环境下分区是怎样实现的?
答:我在这方面没有很多建议,我主要做内核方面的工作,我知道可以用FDW来实现分片,跟分区表一起实现高可用的应用场景。
问:当我的分区键被更改的时候,我的数据就不属于那个分区了,那PG会怎么处理这个事情?
答:在之前的PG版本里,会直接报错。在最近的12、13版本里,会自动帮你做一个分区键的迁移。
问:PG的hash分区,会有数据分布平衡的考量么?用户需要自己来实现吗?
答:PG所使用的默认Hash算法,理论是可以统一分配数据的。如果你对默认的HASH算法不满意,有一个选项可以使用定制的“hash-operater”类。PostgreSQL分区支持用户制定用什么样的方法(Operator)来进行数据分布,不管是Range、List还是Hash。
问:有没有工具可以自动创建分区表?除了shell脚本,还有其他方法吗?
答:有的,你可以参考一个叫“pg_partman”的工具。它可以创建分区和管理分区,让你的操作变得简单。
问:PostgreSQL未来对分布式的支持,会以现在分区表的基础上来进行实现和设计么?比如分区表+fdw。
答:现在你就可以用FDW插件和分区的功能创建实现类似的设置,但是你不要指望所有的部分都工作,比如你没有分布式原子事务、分布的snapshot等。你可以实现一个只读的分区跨集群数仓,可能会好一点。
问:primary key的限制怎么加到分区表里面?
答:你可以把“primary key”放到分区表里,需要注意的是“primary key”的值和分区键必须要一致。
问:PG的分区实现方式和Oracle的分区实现有什么不同?各自的优缺点是什么?
答:我对Oracle的了解不多, Oracle在分区领域已经做的很久了,对用户的体验也会好一些。如果你之前用Oracle的分区很久,对于PG的分区你可能一开始会不太习惯。但是基本功能两者都是差不多的。
问:分区表是否支持在线scale out,如果是,能简单说一下如何实现的么,保证在线业务不受到影响。
答:你可以用FDW模块和表分区来做扩展功能,建议做只读的FDW扩展。
问:分区键必须创建唯一主键索引吗?分区间的索引可以不同吗?
答:你可以把每个分区的分区键也把它创建为“primary key”,但是我觉得没有太大的意义,通常我们的做法是把“primary key”创建在副分区上,这样每一个子分区都可以达到它的效果。创建“primary key”,你要确定它与你的分区键是一致的。
问:PG11新算法中分区修剪的依据是什么?
答:其实没有太复杂的逻辑,简单来说,就是不去扫描不需要扫描的分区。
以上是小编收集的现场问题和回答。
最后,由衷的感谢Amit Langote应邀参加来自中国PostgreSQL分会主办的“Postgres.Live云端技术沙龙第二期”主题活动,其次感谢志愿者Cary Huang和David Zhang准确的中英文实时翻译,最后感谢来自各界PostgreSQL爱好者和关注者的参加以及PostgreSQL从业者的支持。
活动回放视频地址:https://www.bilibili.com/vide...
活动PPT获取方式:
关注中国PostgreSQL分会官方微信公众号并回复“分区”
更多精彩内容,请关注以下平台、网站:
中国Postgre SQL分会官方公众号(技术文章、技术活动):
开源软件联盟PostgreSQL分会
中国Postgre SQL分会技术问答社区:
www.pgfans.cn
中国Postgre SQL分会官方网站:
www.postgresqlchina.com