首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一个IP地址访问两个PG实例,上演“一女嫁二夫”的戏码

一个IP地址访问两个PG实例,上演“一女嫁二夫”的戏码

作者头像
AustinDatabases
发布于 2025-07-04 02:46:36
发布于 2025-07-04 02:46:36
8600
代码可运行
举报
文章被收录于专栏:AustinDatabasesAustinDatabases
运行总次数:0
代码可运行

最近一些事情提醒了我,关于讲技术的事情,讲技术如果只是讲技术讲无法满足现在新的学习知识的形式,在知识泛滥的今天,有用的东西叫知识,没有用的叫什么我就不大清楚了。或许也这也是很多技术类的文章阅读量不高的原因,我们从自身找原因,还是东西没有打到需求上,所以没有需求就没有人看。

今天先说一个需求,然后再说技术。需求来自于一个同学,他们单位的PostgreSQL承载了多个逻辑库,后续数据积累业务发展一个库无法再满足业务的需求,就需要进行分库,但原来的乙方已经不在了,而乙方开发的程序中配置互访,WEB界面只能填写一个IP地址,或者DNS地址。所以如果分库到不同的实例,需要两个或多个实例使用一个IP。

不少由乙方开发的应用程序可能早期在业务量或者量不大的情况下一个物理库的确可以支持,可到了单库无法支持的时候,我们就需要考虑如何进行拆库了。这个案例基于开发的因素只能有一个IP,在多个物理实例的情况下,怎么处理。

需求分析
需求分析

需求分析

这里操作的方法其实我们还真有,就是我们非常熟悉的pgbouncer,通过pgbouncer来进行处理,实现业务访问pgbouncer代理,而我们的代理进行多个实例的集成。

安装pgbouncer
安装pgbouncer

安装pgbouncer

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@pg16 pgbouncer-1.24.1]# sudo yum install libevent-devel
Last metadata expiration check: 0:11:56 ago on Mon 30 Jun 2025 03:41:31 AM EDT.
Dependencies resolved.
===========================================================================================================================================================================
 Package                                      Architecture                         Version                                   Repository                               Size
===========================================================================================================================================================================
Installing:
 libevent-devel                               x86_64                               2.1.8-5.el8                               appstream                               103 k

Transaction Summary
===========================================================================================================================================================================
Install  1 Package

Total download size: 103 k
Installed size: 418 k
Is this ok [y/N]: y
Downloading Packages:
libevent-devel-2.1.8-5.el8.x86_64.rpm                                                                                                      348 kB/s | 103 kB     00:00    
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                       87 kB/s | 103 kB     00:01     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                                                                   1/1 
  Installing       : libevent-devel-2.1.8-5.el8.x86_64                                                                                                                 1/1 
  Running scriptlet: libevent-devel-2.1.8-5.el8.x86_64                                                                                                                 1/1 
  Verifying        : libevent-devel-2.1.8-5.el8.x86_64                                                                                                                 1/1 

Installed:
  libevent-devel-2.1.8-5.el8.x86_64                                                                                                                                        

Complete!
[root@pg16 pgbouncer-1.24.1]# ./configure --prefix=/usr/local
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking target host type... unix
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether the compiler supports GNU C... yes
checking whether gcc accepts -g... yes
checking for gcc option to enable C11 features... none needed


[root@pg16 pgbouncer-1.24.1]# make install
     INSTALL  pgbouncer /usr/local/bin
     INSTALL  README.md /usr/local/share/doc/pgbouncer
     INSTALL  NEWS.md /usr/local/share/doc/pgbouncer
     INSTALL  etc/pgbouncer-minimal.ini /usr/local/share/doc/pgbouncer
     INSTALL  etc/pgbouncer.ini /usr/local/share/doc/pgbouncer
     INSTALL  etc/pgbouncer.service /usr/local/share/doc/pgbouncer
     INSTALL  etc/pgbouncer.socket /usr/local/share/doc/pgbouncer
     INSTALL  etc/userlist.txt /usr/local/share/doc/pgbouncer
     INSTALL  doc/pgbouncer.1 /usr/local/share/man/man1
     INSTALL  doc/pgbouncer.5 /usr/local/share/man/man5
[root@pg16 pgbouncer-1.24.1]# su - postgres
Last login: Thu Jun 19 03:21:30 EDT 2025 on pts/0
[postgres@pg16 ~]$ 

我们将核心的两个配置文件 userlist.txt 和 pgboucner.ini两个部分,拷贝/etc/ 目录下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[pgbouncer]
listen_addr = 0.0.0.0
listen_port = 6432
logfile = /pgdata/pgbouncer.log
pidfile = /pgdata/pgbouncer.pid
pool_mode = transaction

[databases]
database1 = host=192.168.198.100 port=5432 user=db1 client_encoding=UNICODE connect_query='select 1'

database2 = host=192.168.198.101 port=5432 user=db2 client_encoding=UNICODE connect_query='select 1'



配置信息的详情就不在详述了,PGbouncer不会还玩PG的人比较少,这里嘱咐几句

1 pool_mode:建议一律选择transaction

2 pgbouncer:出来可以应对PG并发,其他功能大家应该知晓

1 整合链接到一个地址,就如今天的案例

2 抵御DDOS 攻击,暴露PGBOUNCER的地址不要暴露数据库的地址给程序,有利于出现问题后的解决和应对

3 pgbouncer 单点故障问题的解决,这就与部署的模式和数量有关了

4 解决了PG链接重启和删除的问题

下面我们配置pgboucner.ini 和userlists.txt后,进行登录发现不成功,最近私信有的同学问这个问题的多。

原因
原因

原因

因为问的人多,原因主要就是在于新版本PG的问题,新版本的密码是sha-256,你要注意pgbouncer本身是否支持,一般支持MD5,所以你必须调整你的数据库的密码加密形式。同时之前通过sha-256添加后的密码是无法再被pgbouncer所识别的,所以必须重建账号。

MD5
MD5
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@pg16 pgdata]$ 
[postgres@pg16 pgdata]$ 
[postgres@pg16 pgdata]$ psql -Udb1 -p6432 -h 192.168.198.100 -ddb1
Password for user db1: 
psql (17.4)
Type "help" for help.

db1=# exit 
[postgres@pg16 pgdata]$ psql -Udb2 -p6432 -h 192.168.198.100 -ddb2
Password for user db2: 

这里第二个连不上是正确的,因为在实验环境里面没有192.168.198.101这个地址,在pgbouncer.ini配置文件里面的地址是无法连接所以卡主了。

总结:在工具的使用中,我们大多根据工具的厂商或厂家的预先设计来去使用产品,其实作为用户我们应该根据自己的工作经验,发现更多的产品使用中可以发掘的功能解决我们遇到的问题。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-07-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PGbouncer-轻量级PG连接池管理工具
导言:曾经听说过一句话,用 PostgreSQL 而不用连接池,绝对是坑爹的做法…… 哪怕是像 pgbouncer 这样的“轻量级”连接池,有和没有的区别都不是一般的大。
腾讯云数据库 TencentDB
2021/09/07
2.9K0
postgresql从入门到精通 - 第35讲:中间件PgBouncer部署|PostgreSQL教程
PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。
用户5892232
2023/11/24
1.5K0
postgresql从入门到精通 - 第35讲:中间件PgBouncer部署|PostgreSQL教程
破茧成蝶:PgBouncer在GreenPlum中的部署与优化,携手Prometheus+Grafana构建全方位性能仪表板
PgBouncer工具可以用于PostgreSQL和Greenplum数据库连接的连接池。
AiDBA宝典
2024/04/25
6270
破茧成蝶:PgBouncer在GreenPlum中的部署与优化,携手Prometheus+Grafana构建全方位性能仪表板
PostgreSQL数据库安装部署
[root@web1 ~]# cd /package/ [root@web1 package]# ls apache-tomcat-8.5.39.tar.gz  jdk-8u131-linux-x64.tar.gz  postgresql-10.5.tar.gz  redis-3.2.0.tar.gz [root@web1 package]#
星哥玩云
2022/08/18
3.6K0
利用高可用虚拟IP构建PostgreSQL集群实践
PostgreSQL是一个非常流行的使用面非常广的关系数据库,有很多种构建Postgres HA集群的方式,例如PAF,pgool等,以下将以CentOS7系统和PostgreSQL9.6版本为例,结合高可用虚拟IP(以下简称vip),patroni,haproxy,etcd等组件介绍一种pg HA方案。
我是well
2019/12/06
3.9K0
利用高可用虚拟IP构建PostgreSQL集群实践
PgBouncer in action
原本我是 MySQL 的忠实粉丝,后来命运使然,接手了一个 PostgreSQL 项目,一边用一边学,遇到了不少问题,本文说说其中的连接池问题。
LA0WAN9
2021/12/14
8540
使用yum来安装PostgreSQL数据库(从PG9.4到PG16各个版本通用)
PG安装方法很多,和MySQL类似,给用户提供很大的选择空间。如:RPM包安装(在线、离线)、源码编译安装、系统自带、二进制、NDB安装等。
AiDBA宝典
2023/09/19
4.6K0
使用yum来安装PostgreSQL数据库(从PG9.4到PG16各个版本通用)
在国产统信UOS Server 20 (1060a) (kongzi)上安装PG15和PG16
https://www.xmmup.com/dbbao67shiyongyumlaianzhuangpostgresql13-3shujuku.html
AiDBA宝典
2023/12/04
1.6K1
在国产统信UOS Server 20 (1060a)  (kongzi)上安装PG15和PG16
PostgreSQL 与 Pgbouncer We are brotherhood
数据库的连接池,众所周知没有不需要的,所以对于数据库的连接池给出答案,一定是需要的。
AustinDatabases
2019/09/25
1.4K0
PostgreSQL 与 Pgbouncer  We are brotherhood
Linux环境下PG 14的安装部署
https://yum.postgresql.org/14/redhat/rhel-7-x86_64/repoview/postgresqldbserver14.group.html
AiDBA宝典
2022/05/25
3.6K0
Linux环境下PG 14的安装部署
PostgreSQL 16数据库的各种安装方式汇总(yum、编译、docker等)
详细使用请参考:https://www.xmmup.com/dbbao69zaidockerzhongkuaisushiyonggegebanbendepostgresqlshujuku.html
AiDBA宝典
2023/09/19
7.5K0
PostgreSQL 16数据库的各种安装方式汇总(yum、编译、docker等)
使用源码编译来安装PostgreSQL数据库(从PG9.4到PG16各个版本通用)
PG安装方法很多,和MySQL类似,给用户提供很大的选择空间。如:RPM包安装(在线、离线)、源码编译安装、系统自带、二进制、NDB安装等。
AiDBA宝典
2023/09/08
2.8K0
使用源码编译来安装PostgreSQL数据库(从PG9.4到PG16各个版本通用)
在Oracle中通过dblink访问PG数据库
在PG中访问PG可以通过dblink,在PG中访问Oracle可以通过oracle_fdw,访问MySQL可以通过mysql_fdw,具体过程可以参考:https://www.xmmup.com/pgzhongdefile_fdwpostgres_fdwhedblink.html
AiDBA宝典
2022/11/07
4.4K0
pg9.5升级 到 pg11 的步骤
-bash-4.2$ egrep "^\w+" postgresql.conf  参数如下:
保持热爱奔赴山海
2019/09/17
1.1K0
memcached基础2
root@h101 memcached-1.4.24# rpm -qa | grep libevent
franket
2022/06/26
2550
RedHat7下PostGIS源码安装
顺便安装postgresql-devel、libxml2-devel,后边编译安装PostGIS会用到。
Florian
2018/02/05
1.6K0
进阶数据库系列(二十五):PostgreSQL 数据库日常运维管理
这是个bug,版本升级后,pg_config改变了,会导致后面装外部extension时没有装到指定目录。
民工哥
2023/08/22
1.8K0
进阶数据库系列(二十五):PostgreSQL 数据库日常运维管理
原 使用pg_basebackup搭建PostgreSQL流复制环境
环境:     OS: [ha@node0 ~]$ uname -a Linux node0 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux     内存:1G     CPU:1核     数据库: postgres=# select version();
王果壳
2018/05/17
1.1K0
【Linux】PostgreSQL 主从模式部署(源码编译方式)
近期,笔者承接了在 Linux 操作系统下部署 PostgreSQL 主从模式的需求,且客户要求必须是非容器化部署。
行者Sun
2024/09/02
5960
【Linux】PostgreSQL 主从模式部署(源码编译方式)
【DB宝68】使用源码编译来安装PostgreSQL13.3数据库
PG安装方法很多,和MySQL类似,给用户提供很大的选择空间。如:RPM包安装(在线、离线)、源码编译安装、系统自带、二进制、NDB安装等。
AiDBA宝典
2021/08/25
9550
推荐阅读
相关推荐
PGbouncer-轻量级PG连接池管理工具
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档