Postgres中的连接管理指南

2021-04-17 01:15:18

连接池和管理是大多数人在数据库中忽略了太久的东西之一。在开始时,您可以轻松地通过它。带有1或2个应用程序服务器5-10连接,即使是最小的Postgres服务器也可以处理。即使我们在嘎吱嘎吱的桥梁上为35美元的爱好计划,我们也可以每秒推出5,000次交易,这是一个非常有点< 20个连接。

随着您的发展,更好的连接管理是一种快速而轻松的胜利。大多数人认为,当您'重新缩放超出单个节点时,您只需要在大规模刻度上的连接池,但在此之前最佳时间。让' s挖掘连接池的三种变体以及如何识别您是否可以从连接池和位置中受益。

大多数Web框架这些天一次支持服务器多个Web请求;它们通过多个线程或工人来完成这件事。服务于请求的Web服务器的每个后端可能需要数据库连接。因此,如果您有一个单个Web服务器运行,但有2 x核心(例如4)运行的工作人员,您' ll一次尝试连接到数据库8个后端。

与数据库的每个新连接将花一些时间建立,通常是因为TLS协商。通过连接新的每个请求,您可能会花费50ms连接到数据库,以执行1ms查询(其中很多浪费时间)。因此,结果是将数据库连接库调整为"持续"连接或维持它们的池。每个图书馆都在这里有点不同,但无论如何,已经从应用程序框架中打开和连接的一些标准连接池可以帮助每个请求的整体性能。

使用上面的应用程序侧池到位,您可能很好地使用一个或两个Web服务器。但是,当您缩放到20个Web服务器时,您现在可以对数据库打开200个连接。 99%的这些连接坐在那里闲着没有做任何事情。每次执行查询时,这些浪费的连接都会在协调中具有一些额外的开销。但更糟糕的是,他们坐下来消耗浪费的内存,这是您数据库最有价值的资源之一。

一个连接池位于数据库附近的服务器上,或在数据库前面的同一服务器上可以帮助这些空闲事务。像PGBouncer一样的连接池看起来与Postgres完全一样。但坐在Postgres和您的数据库之间,并进行大量提升,以便为他们提供连接。因此,您的应用程序发出一个请求来获得连接,PGBouncer在这里肯定地说,但PGBouncer不会将连接与实际Postgres数据库传递,直到开始执行查询。

判断您是否会受益于PGBouncer的最佳方式是通过检查数据库中的空闲连接。如果你'在高10岁的时候,如果你比活动连接更怠速,那可能是一个大的好处:

选择count(*),从pg_stat_activity group by 2的状态;数目|.国家------- + --------------------------- 7 |活跃69 |空闲26 |交易11 |闲置11 |交易中闲置(中止)(4行)

通常,当人们听到连接池时,他们认为:跨多个数据库扩展读取。在这里,您有一些路由将向特定的读取副本发送读取,而写入继续转到主要。有一些Postgres工具有助于实现这一(PGPooler),但它们往往需要有一点专家使用。

越来越多地建立越来越多的框架。 Django例如,没有这个交钥匙,但你可以以非常简单的方式指定各种型号的路由。 Rails有一些库通过特定模型帮助路由。

尝试按模型组读取读取(这将在热存储器中保持更多的数据)。

在缩放应用程序中,数据库是一个往往有10-15个基本步骤的一个区域,您可以获得更大的比例。通过PGBouncer在应用程序侧和服务器端中的连接池都是您应该始终占用生产应用的步骤。

我们'重新兴奋地支持用PGBouncer上的Crunchy Bridge上的内置连接汇集,作为作为服务的完全托管的数据库。我们希望为您维护数据库的所有头痛。在脆弱的Postgres中,无论您是在裸机VM上运行还是利用我们的Kubernetes运算符,也可以在您那里为您提供PGBouncer。简而言之,我们使用pgbouncer,你也应该。