PostgreSQL 连接池方案有哪些?如何选择

数据库 其他数据库
连接池是管理数据库连接的一个软件组件。它可以通过多种方式帮助提高资源利用率,帮助实现负载均衡或故障转移,并且可以大大减少事务时间。在本文中,我们将了解什么是连接池以及如何配置它。

建立与数据库的连接,需要执行许多步骤。我们需要连接到服务器并执行初次握手,就加密和连接设置达成一致,然后在所有层中(网络驱动层、操作系统层、数据库层等)保留新的连接资源。每个连接都会消耗内存,内存大小取决于数据库引擎。对于 PostgreSQL,一个连接甚至可以占用 1.3MB 的内存。建立连接也需要一些时间,因为我们需要协商新连接的设置。

如果我们不断为每个 SQL 查询创建新连接,我们可能会给数据库服务器带来多个问题:

• 建立连接需要时间和资源,因此我们的事务速度会变慢

• 我们可能会超出活跃连接数的限制(默认情况下可以设置为 100 个连接)

• 数据库可能会消耗更多内存,这可能会对缓存命中率和可用于查询的可用内存产生负面影响

我们可以对连接进行池化,而不是为每个 SQL 查询创建一个新连接。我们可以配置连接池,以保留连接数量,并给所有客户端重用它们。这样,我们的应用程序直接连接到连接池而不是数据库,然后连接池再连接到数据库。这带来了多个优势:

• 连接池使连接保持打开状态的时间更长,这减少了在数据库端打开和关闭连接的开销,并减少了延迟

• 我们可以在连接之间甚至数据库之间实现负载均衡,从而提高性能

• 连接池可以保持稳定的连接数,因此我们避免了活跃连接太多的问题,从而减少了资源占用

• 连接池可以重定向主服务器和备用服务器之间的连接,以提供故障转移,从而提高稳定性和可扩展性

• 连接池可以将数据库的密码存储在一个中心位置,从而提高安全性

• 连接池可以缓存结果,以提高查询性能

连接池也有一些缺点:

• 它作为我们系统中的另一个组件,可能会发生单点故障

• 由于在应用程序和数据库之间增加了一次网络中转,网络延迟可能会略有增加

• 效率低下的连接池可能会成为瓶颈

• 我们需要调优和维护连接池,这增加了维护负担

不同类型的连接池

实现连接池的方法有很多种。在本节中,我们将了解各种实现细节。

外部或内部连接池

在典型情况下,我们从应用程序连接到数据库。现在,我们可以将连接池放在两个位置之一:应用程序本身,或应用程序和数据库之间的某个位置。

将连接池放入应用程序中(应用端连接池)可能非常容易,因为许多 ORM 或数据库驱动都提供了内置的支持。例如,JDBC 可通过 c3p0 启用连接池,而 ODBC 也提供了内置支持。这带来了许多好处。我们不需要安装和维护任何其他组件,因为连接池处于应用程序内部。我们只需要部署新版本的应用程序,就做好了池化的准备。这也减少了网络延迟,因为我们没有任何额外的网络中转(所有的事情都位于我们的应用程序内)。

遗憾的是,应用端连接池有一些缺点。最大的一点是,它只配置为一个应用程序服务。如果我们有很多应用程序,尤其是在分布式环境中,那么我们需要在许多地方配置连接池。更不用说,我们可能仍然会达到服务端的连接数限制,因为各连接池彼此不知道。拥有许多连接池也会导致更高的资源使用率,并且通常性能较低。

我们还可以使用位于应用程序和数据库之间的外部连接池。这适用于任意数量的应用程序,并可以让我们精确地控制连接限制。集中式连接池还可以更好地控制资源,让我们实现故障转移或负载分配。

外部连接池也有一些缺点。首先,随着时间的推移,它是需要我们去安装、配置、调整和维护的另一个组件。我们还需要重新配置每个应用程序,以使用该连接池(这应该只是更改一些连接字符串,并重新部署应用程序)。外部连接池还增加了一些网络延迟,因为它是应用程序和数据库之间的另一个网络组件。

外部连接池还可能发生单点故障。如果连接池由于某种原因而关闭,则应用程序将无法再连接到数据库。如果连接池速度慢或效率低下,则会影响使用它的所有应用程序。因此,连接池必须具有高质量,以免降低整体性能。

池化的类型

每个连接池都需要决定如何将连接分配给客户端。通常有三种方法。

第一种是会话池。在这种方法中,连接在会话期间分配给客户端(因此直到客户端断开连接或达到超时)。这是最简单的方法,但是,这实际上限制了客户端的数量,因为通常每个客户端会使用一个连接。

下一种方案是事务池。在这种方法中,连接池为每个事务分配连接,并且只在事务持续时间范围内分配连接。如果客户端想要运行另一个事务,则需要获得另一个连接(并且可能需要等待其他连接可用)。这样允许连接池处理更多客户端,这是推荐的方法。

最后一种方法是,为每个 SQL 语句单独分配连接。从理论上讲,这带来了最高的灵活性和连接利用率。但是,这会导致一个事务跨越多个连接。由于许多事务的设置都与连接相关联,因此这可能会在技术上存在限制。

连接池方案

根据您使用的数据库类型,可能有一些内置的解决方案,或者您可能需要手动配置它们。让我们看一些例子。

您可以使用许多外部的解决方案:

• Amazon RDS 代理

• Pgpool

• PgBouncer

• odyssey

• Heimdall 数据库代理

• ProxySQL

• pgcat

案例学习:配置 PgBouncer

在此示例中,我们来体验下 PgBouncer

我们首先按照文档中的描述安装它。

然后我们需要对其进行配置。最重要的设置有:

• pool_mode - 如何处理连接;我们可以使用 transaction 模式

• max_client_conn - 配置可以连接到连接池的客户端数量

• default_pool_size - 配置每个用户和数据库配对,所允许的服务端连接数

• min_pool_size - 要保留的备用连接数

在配置好连接池后,我们可以使用 pgbench 验证它的性能:

pgbench -c 10 -p -j 2 -t 1000 database_name

PgBouncer 可以轻松地将每秒的事务数提高 60%,如下面的基准测试所示:

• 测试 1

• 测试 2

• 测试 3

总结

连接池可以提高性能并减少资源消耗。有许多内置的解决方案,可以轻松地与我们的数据库一起搭配,无论我们是在哪里托管它们,以及我们使用什么数据库引擎。我们需要记住,连接池是另一个故障单点,需要小心处理。配置良好的连接池,可以将每秒的事务数增加近一倍,从而大大提高性能。

责任编辑:武晓燕 来源: 红石PG
相关推荐

2019-12-30 15:30:13

连接池请求PHP

2024-05-07 07:38:29

2011-06-01 13:54:10

MySQL

2018-02-07 16:23:58

连接池内存池AI

2021-05-27 09:50:03

连接池FTP服务器

2009-09-22 14:52:55

Hibernate p

2009-09-22 16:04:50

Hibernate连接

2010-01-05 10:11:23

ADO.NET连接池

2022-11-11 09:41:04

连接池微服务数据库

2009-06-17 16:22:45

Hibernate连接

2010-06-12 13:33:12

MySQL连接池

2021-08-12 06:52:01

.NET数据库连接池

2009-07-15 11:00:48

proxool连接池

2009-06-17 09:59:46

Hibernate 连

2015-04-27 09:50:45

Java Hibern连接池详解

2010-06-25 10:36:27

Java连接池

2020-02-03 15:15:27

Druid连接池性能超出竞品

2009-06-24 07:53:47

Hibernate数据

2009-12-25 15:38:12

ADO连接池

2022-07-19 13:51:47

数据库Hikari连接池
点赞
收藏

51CTO技术栈公众号