首页
产品
CLup:PostgreSQL高可用集群平台 CMiner: PostgreSQL中的CDC CData高性能数据库云一体机 CBackup数据库备份恢复云平台 CPDA高性能双子星数据库机 CSYun超融合虚拟机产品
解决方案
数据库专业技术服务全栈式PostgreSQL解决方案Oracle分布式存储化数据库云
文章
客户及伙伴
中启开源
关于我们
公司简介 联系我们
中启开源

ZQPool(https://gitee.com/csudata/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 软件的一些缺点。通常使用数据库连接池的主要目的有两个:

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

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

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

报错的原因为:

当然 jdbc 的实际行为比上面描述的要复杂的多,但原理大致就是上面描述的这个过程。
而 ZQPool 通过跟踪一个连接上的 Prepare SQL 的名字,并替换成不重复的名字的方式解决了这个问题。

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

这是 pgbouncer 的测试情况:

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

下面是使用 ZQPool 测试的情况:

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

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