ZQPool 1.1 发布,连接池软件


ZQPool 是一个可以替代 pgbouncer 的连接池软件 ,在1.1版本中主要做了一下改进:

  1. 之前的版本,前端连接过来的用户名和数据库名称必须与后端数据库中的完全一样,现在可以不一样。例如原先的版本如果使用scott用户连接ZQPool上的数据库maydb,那么连接到后端的真实数据库也是maydb,而新版本使用scott用户连接ZQPool上的数据库maydb,但实际上可能是使用yellow用户连接到后端的fourdb数据库上(具体看zqpool.conf中的配置)。

  2. 增加了后端连接的生命周期的功能,到达生命周期后,此后端连接会重建,以便避免数据库连接长时间不释放而可能的内存泄漏风险。

  3. 增加了管理端口,可以通过向ZQPool发送http请求动态改变一些配置。

  4. 优化了ZQPool配置

  5. 修复了一些Bug。

ZQPool主要解决 PostgreSQL 生态中流行的连接池软件 pgbouncer 软件的一些缺点。通常使用数据库连接池的主要目的有两个:

  1. 减少到数据库上的连接数。应用程序到连接池软件上有 M 个连接,这 M 个连接不是同时都繁忙的,这 M 个连接上同一个时刻发来的并发 SQL 可能只有 N 个(N 通常大大小于 M),这样连接池软件只需要在后端数据库上建 N 个连接。就可以满足了要求。这个场景通常是 java 应用。 我们可以想象一个场景:一个 java 应用可能部署在 200 台主机上,而每个主机上 java 应用自身会开启一个 java 连接池,这个 java 连接池假设开 20 个连接,这时到数据库上就有 200*20=4000 个连接,这些连接实际上多数时间都是空闲的,少数时间才是活跃的。 4000 个连接,PostgreSQL 数据库就需要启动 4000 个进程,太多连接会降低数据库的效率。
  2. 减少短连接应用花在新建数据库连接的时间。PostgreSQL 数据库对每一个连接需要 fork 出一个新的进程来提供服务,而每次 fork 一个进程是需要时间的。而连接池软件可以预先建好到数据库的连接,应用程序连接到连接池软件后,连接池软件可以从池中取一个已经建好的连接马上提供服务,这样就大大减少了新连接的时间。这个场景的典型应用是 php 应用。php 应用到数据库通常是短连接。

而 PostgreSQL 数据库中流行的 pgbouncer 通常解决不了上面的第一个问题(java 应用):即减少到数据库上连接数的目的。 要减少到数据库上的连接数,pgbouncer 连接池的模式只能配置成语句级或事务级,不能配置成会话级,因为 pgbouncer 在会话级下,前面来多少个连接,到数据库也必须建多少连接,根本起不到减少数据库连接的目的。当我们把 pgbouncer 配置成语句级或事务级时,java 应用连接 pgbouncer 会报错: 

org.postgresql.util.PSQLException: ERROR: prepared statement "S_1" already exists 

这个原因是 jdbc 执行 SQL 是分两个步骤的:

  1. 先使用 Prepare 的 SQL,即:“prepare S_1 as select * from test01 where id=$1;” 
  2.  然后再 “execute S1 (1);”

报错的原因为:

  1. 执行 “prepare S_1 as select * from test01 where id=$1;” 时,从连接池中取一个连接 A,执行后,就释放了此连接;
  2. 执行 “execute S_1 (1);”,再从连接池中获得一个连接,这时获得的连接可能已经不是之前的连接,这个新连接中没有 Prepare 语句 “S_1”,所以就报错了;
  3. 如果又来了另一个 SQL,可能从连接池中取到的还是之前的连接 A,然后再执行 “prepare S_1 as select * from test02 where id=$1;”,但这个 prepare SQL 的名字 S_1 已经被前面的 SQL 占用,这时就报错了。
  4. 当然 jdbc 的实际行为比上面描述的要复杂的多,但原理大致就是上面描述的这个过程。

而 ZQPool 通过跟踪一个连接上的 Prepare SQL 的名字,并替换成不重复的名字的方式解决了这个问题。

pgbouncer 还有一个缺点,处理 SQL 的转发只能用到 CPU 的一个核,即 pgbouncer 是单线程程序。对于高并发的情况下,超过单核的性能时,就会立即出现瓶颈。而 ZQPool 是使用 golang 的协程技术,可以利用了多核的性能,在一台 2 颗 Intel (R) Xeon (R) Silver 4210R CPU @ 2.40GHz 的物理机:

这是 pgbouncer 的测试情况:

[postgres@csyun01 ~]$ pgbench -h 10.197.160.18 -p 6432 -Uu01  -S -P 2  -T 30 -c 32
pgbench (14.3)
starting vacuum...end.
progress: 2.0 s, 30407.5 tps, lat 1.050 ms stddev 0.180
progress: 4.0 s, 30108.6 tps, lat 1.062 ms stddev 0.182
progress: 6.0 s, 30231.5 tps, lat 1.058 ms stddev 0.179
progress: 8.0 s, 31157.9 tps, lat 1.026 ms stddev 0.176
progress: 10.0 s, 30491.7 tps, lat 1.049 ms stddev 0.178
progress: 12.0 s, 30463.0 tps, lat 1.050 ms stddev 0.180
progress: 14.0 s, 30366.2 tps, lat 1.053 ms stddev 0.179
progress: 16.0 s, 30177.5 tps, lat 1.060 ms stddev 0.180
progress: 18.0 s, 30067.1 tps, lat 1.064 ms stddev 0.181
progress: 20.0 s, 30420.1 tps, lat 1.051 ms stddev 0.177
...
...
...

 

这是使用 ZQPool 测试的情况:

[postgres@csyun01 ~]$ pgbench -h 10.197.160.18 -p 5436 -Uu01  -S -P 2  -T 30 -c 32
Password:
pgbench (14.3, server 10.5)
starting vacuum...end.
progress: 2.0 s, 111134.7 tps, lat 0.213 ms stddev 0.058
progress: 4.0 s, 112688.1 tps, lat 0.209 ms stddev 0.058
progress: 6.0 s, 114570.8 tps, lat 0.207 ms stddev 0.054
progress: 8.0 s, 107305.3 tps, lat 0.216 ms stddev 0.066
progress: 10.0 s, 108680.1 tps, lat 0.215 ms stddev 0.063
progress: 12.0 s, 108867.6 tps, lat 0.214 ms stddev 0.064
...
...
...

可以看到 ZQPool 的 tps 可以到 10 万每秒,而 pgbouncer 最多到 3 万每秒就上不去了。


相關推薦

2023-02-23

ZQPool 是一个可以替代 pgbouncer 的连接池软件 ,在 1.2 版本中主要做了一下改进: 1. 之前的版本不支持文本大小超过64K的SQL语句,新版本没有此限制了; 2. 连接池上增加了参数msg_buf_size,可以指定接收或发送消息的缓冲区默认大

2023-04-09

一:基本介绍 BeeCP 是一款小型 JDBC 连接池组件,具有性能高,代码轻,稳定好的特点。 二:优化内容 1:两处锁支持等待超时(连接池创建,连接创建) 2:连接池加入新的清理方法,池内连接被清理后可载入新配置 3:连

2022-09-13

数据库连接池 Druid 1.2.12 现已发布。这个版本连接池默认增加配置connectTimeout和socketTimeout,增强了SQL Parser。 Issues 连接池DruidDataSource支持新的配置connectTimeout和socketTimeout,分别都是10秒。这个默认值会减少因为网络丢包时导致

2023-02-20

数据库连接池 Druid 1.2.16 现已发布,这又是一个 BUG 修复功能增强的小版本,建议按需升级。 Issues 修复连接池PostgreSQL下传递了错误的connectTimeout 的问题 #5096 增强了SQL Parser对Hive/MaxCompute/Postsql/SQL Server的支持 相关连接

2024-08-12

介绍  beecp 是一款轻量级 JDBC 连接池,具有性能高,代码优,稳定性好特点。 本次更新 1:修复连接池初始化,设置 Connection 默认值时,出现 Null point Exception 的问题 2:修复连接池初始化,设置 Connection 的默认值,未打印

2022-06-14

数据库连接池 Druid 1.2.11 现已发布。公告指出,DRUID 连接池内部外部都是同一份代码,有些业务场景等着用修复 SQL Parser 相关问题,因此就快速发布了1.2.9 ~ 1.2.10;但改动都是很小,1.2.11 也是同样的情况。 Issues 增加了对 Polar

2023-12-03

BeeCP,一款高性能 JDBC 连接池,具有代码轻,性能高的特点。 1:与其他连接池性能对比 CPU:I5-4460,OS:Win7_64  内存:8G , 跑分源码出处:https://github.com/brettwooldridge/HikariCP-benchmark 2: 版本下载 (Java7 或更高版

2022-10-09

数据库连接池 Druid 1.2.13 现已发布,这又是一个BUG修复功能增强的版本。 Issues 修复1.2.12版本引入socketTimeout导致的BUG #4936 #4946 增强SQL Parser对MaxCompute的支持 #4933 增强SQL Parser对Oracle的支持 #4938 增强SQL Parser

2023-06-25

本次发布支持多页面前端 使用404重写 多个目录 提供一个前端演示 Paozhu C++ Web框架 原生解析HTTP/1、HTTP/2、JSON协议 集成C++ ORM 1.特性🔥🔥🔥🔥🔥 ✅ 1. 自带json编解码不用第三方库,标准json支持 ✅ 2. 支持多域名网站 ✅ 3.

2023-02-19

一:基本介绍 BeeCP 是一款小型 JDBC 连接池组件,具有性能高,代码轻,稳定好的特点。 二:优化内容 1: 数据源配置增加一个布尔属性:asyncCreateInitConnection,若设置为 true 时,连接池启动时将以异步的方式创建初始化连接;

2024-05-27

数据库连接池 Druid 1.2.23 现已发布,这个版本主要增强优化了SQL语句解析的版本,大家按需升级。 Issues 优化SpringBoot3动态数据源场景的适配 #5798 优化SQLBinaryOpExpr等表达式的括号解析和SQL生成逻辑 #5855 优化中括

2023-06-04

Paozhu C++ web框架 1.4.1 版本发布 Paozhu C++ web框架 自带c++ ORM 支持HTTP/1 HTTP/2,支持复杂结构体和JSON互换 框架提供开箱即用 admin 管理后台 这版主要是修改大并发问题,如果用户线程忙不过来,就添加用户线程,这样保持网站畅

2023-12-21

最近一周更新很多,重构了HTTP/2模块,通过压力测试目前没有什么问题。 经过两位社区网友完善支持Windows下MSVC支持,目前MSVC可以开启asan模块,Windows用户可以直接使用MSVC。 为了符合监管要求,添加了ip转地址模块,可以详细

2023-02-08

SQLAlchemy 2.0.2 已发布,更新内容主要是关于声明式注释 (Declarative Annotations) 功能的改进和错误修复。 此外,该版本还修复了一个特殊 bug:在 asyncio 下使用 asyncpg 数据库驱动时发现的连接池问题。当连接池中的连接没有正确返回