RDS PostgreSQL内置连接池PgBouncer

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 2023年7月,阿里云RDS PostgreSQL支持内置数据库连接池PgBouncer,本篇文章从以下角度探讨PgBouncer:1. PgBouncer是什么;2. 应用场景 ;3. 性能对比;4. 如何使用;5. 总结

PgBouncer是什么

PgBouncer是为PostgreSQL数据库提供的一个开源的轻量级连接池。对比应用程序直接连接PostgreSQL数据库,PgBouncer不需要为每一个新连接克隆(linux下通过fork系统调用)出一个服务进程,而是会和后端PostgreSQL数据库建立连接缓存,当应用程序需要建立新连接时,只需PgBouncer分配一个空闲连接,这种复用连接可以显著减少数据库服务器的负载,提高应用程序的响应速度和并发性能。


PgBouncer使用C语言编写,实现非常精巧,采用Libevent进行Socket通信,通信方式效率很高。PgBouncer中每一个数据库对应的连接池是一个PgPool结构体,主要包含以下四个链表:活跃客户端连接链表、等待客户端连接链表、活跃服务端连接链表、空闲服务端连接链表。

  • 当客户端连接到PgBouncer后,连接会增加到active_client_list
  • 如果此时服务端连接已经达到了设置的最大连接池数量,那么新的客户端查询,就会从active_client_list进入到waiting_client_list
  • 当客户端在执行某一个事务,此时正在执行事务的服务端连接就处于active_server_list
  • 当客户端结束事务,会执行release_server函数,正在执行事务的服务端连接会从active_server_list释放,进入到idle_server_list
  • 当客户端有新的查询,会优先复用idle_server_list中的连接
  • 当超过一定时间,idle_server_list中的连接会自动释放掉


以上四个链表分别对应RDS PostgreSQL提供监控的client_connections_active、client_connections_waiting、server_connections_active和server_connections_idle四个指标。

structPgPool {
structStatListactive_client_list;
structStatListwaiting_client_list;
structStatListactive_server_list;
structStatListidle_server_list;
}


应用场景

适用于短连接较多,频繁创建和销毁连接的场景。使用PgBouncer连接池,PgBouncer会将与后端PostgreSQL数据库的连接缓存,从而能有效避免频繁创建、销毁进程带来的资源耗费。

适用于数据库存在空闲连接数较多以及需要限制最大空闲时间的场景。有助于控制数据库服务器的负载和资源使用情况,避免大量空闲连接对系统内存的占用。由于PgBouncer采用c语言编写,每个连接仅消耗2KB内存,因此无需担心PgBouncer本身对系统的资源消耗问题。


性能对比

客户端配置:系统centos 7.8,32c128g,使用sysbench工具

服务端配置:系统centos 7.8,8c32g,对比直接连接PostgreSQL和PgBouncer



Threads/Client

TPS

直连

数据库

Default_Pool_Size

8

16

32

64

8

812

7253

7234

7250

7250

16

1255

11174

11083

11176

11154

32

1387

13858

13792

13753

13762

64

1370

14362

14765

14622

14521

128

1356

14301

14425

15022

15218


结论:对比直接连接PostgreSQL,使用PgBouncer连接池在不同客户端数量和不同默认连接池大小的情况下,每秒事务处理数(TPS)是直连PostgreSQL的10倍左右


如何使用

对于自建PostgreSQL,需要用户下载、编译、安装、配置和启动后才能使用。而使用RDS PostgreSQL,可以在控制台界面一键开启和关闭,具体可以参考阿里云官方文档


开启PgBouncer后,并不会影响到之前直连 RDS PostgreSQL的链路,系统会自动为PgBouncer分配默认端口6432(支持用户后续修改),同时支持提供VPC私网和公网连接到PgBouncer,即用户可以同时直连到PostgreSQL和连接到PgBouncer两种互不影响的方式连接到RDS PostgreSQL实例,具体的链路如图所示。图中显示为多可用区部署的高可用架构主实例,并且挂有一个单节点的只读实例,只读实例也支持开启PgBouncer,需要用户在主实例开启PgBouncer后,单独为只读实例开启。从图中可以看出PgBouncer是和节点部署在一起,放发生HA切换后,被库提升为主库,此时被库上的PgBouncer也开始对外服务,从而满足PgBouncer和主实例相同的高可用要求。


RDS PostgreSQL开启PgBouncer后,系统会自动生成pgbouncer.ini配置文件,默认客户端连接到PgBouncer时数据库名和PostgreSQL数据库名相同,认证方式auth_type采用hba的方式,不限制客户端使用的用户名和要连接到PostgreSQL的数据库名。系统会在pgbouncer.ini设置PgBouncer默认参数,并开放部分参数给用户查看和修改,具体如下表所示。关于PgBouncer配置更多信息,可以参考PgBouncer官方文档


PgBouncer提供三种连接模式,分别是:

  • 会话级别连接(Session),当客户端端开,数据库连接会放回到连接池中;
  • 事务级别连接(Transaction),当一个事务执行完毕后,数据库连接会放回到连接池中;
  • 语句级别连接(Statement),当执行完一个SQL语句时,数据库连接会放回到连接池中。


RDS PostgreSQL默认提供的连接池模式是transaction级别,用户可以根据业务需求来修复连接池模式。需要注意的是:Transaction和statement模式不支持prepare statement,更多关于不同连接池的功能和限制可以参考PgBouncer文档

参数名

参数类型

默认值

描述

pgbouncer.pool_mode

string

transaction

连接池模式,指定客户端在什么情况下可以重用连接。

  • session:如果客户端断开连接,连接将会被释放回连接池。
  • transaction:如果事务完成,连接将会被释放回连接池。
  • statement:查询完成后,连接将会被释放回连接池。

pgbouncer.default_pool_size

int

20

连接池默认允许连接数。

pgbouncer.max_client_conn

int

100

连接池允许的最大客户端连接数。

pgbouncer.min_pool_size

int

0

连接池允许的最小客户端连接数。

pgbouncer.query_wait_timeout

int

120

允许查询等待执行的最长时间。单位:秒。

如果在此期间未将查询分配给服务器,则客户端将断开连接。

如果配置为0,则表示禁用。此时客户端将无限期排队。

pgbouncer.ignore_startup_parameters

string

extra_float_digits

启动参数,您可以在此参数中指定PgBouncer启动跟踪参数,使用英文逗号(,)分隔。

pgbouncer.stats_users

string

""

允许连接到PgBouncer虚拟库上运行只读查询的数据库用户,使用英文逗号(,)分隔。


RDS PostgreSQL对于PgBouncer提供6个监控指标,主要包客户端连接、服务端连接和连接池数量等信息,用户可以在控制台上实时查看PgBouncer的监控指标信息。另外,用户也可以通过修改pgbouncer.stats_users参数,指定查询PgBouncer连接池提供的默认库pgbouncer的用户,通过该用户连接到pgbouncer后,执行相关查询。


RDS PostgreSQL支持PgBouncer使用TLS连接,用户不需要单独为PgBouncer开启TLS,当PostgreSQL实例开启TLS后,PgBouncer也会同步开启。需要注意,PgBouncer本身不支持ACL为verify-ca或verify-full的连接验证,也不支持客户端证书吊销文件,具体详情可以参考RDS PostgreSQL的SSl链路加密


总结

PgBouncer作为一款开源的轻量级数据库连接管理工具,能显著降低较多短连接时PostgreSQL数据库建立和销毁进程的资源消耗,可以对PostgreSQL数据库可能存在大量空闲连接导致内存占用过高的场景起到有效的限制作用。当您使用RDS PostgresSQL数据库时,仅需一键开启和关闭PgBouncer,省去相对复杂的安装和配置PgBouncer的过程,并且RDS PostgresSQL支持控制台PgBouncer参数查看和修改、同步主实例TLS相关配置、监控指标可视化等。欢迎用户体验和使用RDS PostgresSQL的内置PgBouncer连接池功能!

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
1
0
0
0
分享
相关文章
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
【PG锦囊】阿里云 RDS PostgreSQL 版插件—AI 插件(rds_ai)
本文介绍了AI 插件(rds_ai)的核心优势、适用场景等,帮助您更好地了解 rds_ai 插件。想了解更多 RDS 插件信息和讨论交流,欢迎加入 RDS PG 插件用户专项服务群(103525002795)
市场领先者MySQL的挑战者:PostgreSQL的崛起
PostgreSQL(简称PG)是世界上最先进的开源对象关系型数据库,起源于1986年的加州大学伯克利分校POSTGRES项目。它以其丰富的功能、强大的扩展性和数据完整性著称,支持复杂数据类型、MVCC、全文检索和地理空间数据处理等特性。尽管市场份额略低于MySQL,但PG在全球范围内广泛应用,受到Google、AWS、Microsoft等知名公司支持。常用的客户端工具包括PgAdmin、Navicat和DBeaver。
247 4
MySQL vs. PostgreSQL:选择适合你的开源数据库
在众多开源数据库中,MySQL和PostgreSQL无疑是最受欢迎的两个。它们都有着强大的功能、广泛的社区支持和丰富的生态系统。然而,它们在设计理念、性能特点、功能特性等方面存在着显著的差异。本文将从这三个方面对MySQL和PostgreSQL进行比较,以帮助您选择更适合您需求的开源数据库。
468 4
postgresql和mysql中的limit使用方法
postgresql和mysql中的limit使用方法
266 1
阿里云RDS PostgreSQL版支持 PG17,还不来体验?
PostgreSQL被誉为最先进的开源数据库,具有强大的扩展性和灵活架构。9月26日,社区官方正式发布了PostgreSQL 17.0版本,在性能、逻辑复制、开发者体验等方面进行了优化。阿里云RDS PostgreSQL 版已支持 PostgreSQL 17.0,并在社区17.0基础上,进行了安全、成本、可运维性等多方面提升,增加多种内核特性及插件特性。
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
1777 3
四种数据库对比MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景
四种数据库对比 MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景
在Linux中,如何配置数据库服务器(如MySQL或PostgreSQL)?
在Linux中,如何配置数据库服务器(如MySQL或PostgreSQL)?

相关产品

  • 云数据库 RDS
  • 云数据库 RDS PostgreSQL 版
  • 云数据库 RDS MySQL 版
  • 推荐镜像

    更多
    AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等

    登录插画

    登录以查看您的控制台资源

    管理云资源
    状态一览
    快捷访问