PostgreSQL数据库分片(通过分区)是否降低CPU利用率?

3
最近,由于流量过大,我们的数据库实例CPU负载过重(超过98%利用率)。因此,我们决定将我们的db分片成多个实例。据我所知,在postgres中,db级别的分片主要是通过对表进行分区并将每个分区移动到单独的实例中来完成的,就像下面展示的那样。
我认为这可能会使查询速度更快,但不能减轻主分区的负载太多,因为所有查询都是针对主分区本身进行的。因此,我决定在我们的节点后端实现应用程序级别的分片。
对使用分区键执行的所有CRUD操作,应用程序级别的分片效果非常好。但是,如果查询需要根据其他键执行,则需要逐个遍历每个分区。因此,在这种情况下,最好拥有一个未分区的表,以便可以使用同一张表查询所有数据。
修复问题的好方法是什么?只实现如上图所示的db级别分片是否足以减少主实例的CPU利用率?

那取决于查询。如果主实例只需要重新汇总从每个分片获取的部分总和,那将大大减少CPU的使用。 - jjanes
1个回答

2
如果分区操作正确执行,那么从所有分片查询数据不必变慢,因为所有这些分片可以并行查询。如果您在数据库上使用分区,并将远程分片定义为postgres_fdw外部表的分区,则会自动发生这种情况,因为PostgreSQL v14引入了“并行附加”执行计划节点,可以并行化这些操作。
如果您在应用程序级别上进行分片,那么您需要教导您的应用程序以并行方式查询分片。

谢谢。我的主要关注点是它是否会减少主分片的资源消耗。由于所有查询都首先发送到主实例,它可能不会减轻实例的负载太多。我错了吗? - samman adhikari
不,那是正确的,在数据库级别上进行分区将通过查询的数据库路由所有行。在这方面,应用程序级别的分区具有优势。但你必须自己实现并行性。 - Laurenz Albe
但是任何WHERE语句都将被发送到远程服务器,因此即使主服务器仍然接收所有请求,它也不必自己进行过滤,远程服务器仅返回与条件匹配的行和所选列,因此CPU使用率应该大大降低。引用文档中的一句话:“postgres_fdw尝试优化远程查询以减少从外部服务器传输的数据量。这是通过将查询WHERE子句发送到远程服务器进行执行,并且不检索当前查询不需要的表列来完成的。” - acristu
@acristu 我同意。 - Laurenz Albe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接