PgBouncer: 如何获取客户端连接 IP

由于 PostgreSQL 采用进程模式,大量连接对数据库性能会产生较大影响,在大量连接情况下,一般会在数据库和应用程序之间配置 pgbouncer,pgbouncer 可以配置在数据库主机上,也可以配置在单独一台服务器上,但是采用了 pgbouncer 后,在维护方面和以前有些区别:

环境信息

PostgreSQL 版本: PostgreSQL 9.1.2
pgbouncer 版本: pgbouncer version 1.4.2
PostgreSQL 原库IP 192.168.1.12
pgbouncer IP 192.168.1.10

区别一: pg_hba.conf 功能减弱

采用了 pgbouncer 之后 pg_hba.conf 功能减弱,这里说减弱,是因为原库上 pg_hba.conf 可以配置,但已经形同虚设,不能发挥原有的作用,因为可以配置原库上的 pg_hba.conf ,配置成只允许 pgbouncer,原库 pg_hba.conf 配置如下。

1
2
3
4
5
# TYPE DATABASE USER ADDRESS METHOD  
# "local" is for Unix domain socket connections only
local all all trust
#Pgbouncer IP
host all all 192.168.1.10/32 md5

尽管在原库上配置了 pg_hba.conf ,只允许 pgbouncer主机连库, 但是不能限制其它IP通过 pg_bouncer 连接数据库,从这个角度来说,采用 pgbouncer 无疑是增加了安全漏洞,当然可以采用其它措施弥补。

区别二: 主库上无法查询应用服务器 IP

在数据库维护过程中,经常需要查询某个库的业务服务器IP信息,查询哪些服务器在连接数据库,采用了 pgbouncer 后,这方面的查询没以前方便,例如在主库上查询连接 skytf 库的客户端 IP 信息,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
postgres=# select datname,usename ,client_addr,client_port from pg_stat_activity where datname='skytf';  
datname | usename | client_addr | client_port
-----------+-----------+-----------------+-------------
skytf | skytf | 192.168.1.10 | 32119
skytf | skytf | 192.168.1.10 | 18583
skytf | skytf | 192.168.1.10 | 31723
skytf | skytf | 192.168.1.10 | 32363
skytf | skytf | 192.168.1.10 | 58929
skytf | skytf | 192.168.1.10 | 58930
skytf | skytf | 192.168.1.10 | 58931
skytf | skytf | 192.168.1.10 | 58932
skytf | skytf | 192.168.1.10 | 58933
skytf | skytf | 192.168.1.10 | 58934
skytf | skytf | 192.168.1.10 | 58935
skytf | skytf | 192.168.1.10 | 58936
skytf | skytf | 192.168.1.10 | 58937
skytf | skytf | 192.168.1.10 | 58938

从上面查询结果来看,上面的 clietn_addr 只显示 pgbouncer 的 IP,而无法显示真正的客户端 IP,那么如何获取客户端的IP呢? 有两种方法:

方法一: 登陆 pgbouncer 控制台获取客户端IP信息

登陆 pgbouncer 控制台,并且执行 show clients 命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
postgres@db> psql -h 127.0.0.1 -p 1922 pgbouncer pgbouncer_admin  
psql (9.1.2, server 1.4.2/bouncer)
WARNING: psql version 9.1, server version 1.4.
Some psql features might not work.
Type "help" for help.

pgbouncer=# show clients;
type | user | database | state | addr | port | local_addr | local_port | connect_tim
e | request_time | ptr | link
------+-----------------+------------+--------+-----------------------+-------+------------------------+------------+---------------
------+---------------------+------------+------------
C | skytf | skytf | active | ::ffff:192.168.1.15 | 57791 | ::ffff:192.168.173.215 | 1922 | 2012-03-20 06:
45:28 | 2012-03-20 10:36:31 | 0x1350c9d0 | 0x1352e330

备注:为了格式输出,上面只列出一条记录,例如上面可以看出连接 skytf 库的业务服务器IP为 192.168.1.15,显然通过 pgbouncer 查询客户端 IP 不太方便。

方法二: 通过 pgbouncer 日志查看

另外一种方法可以通过 pgbouncer 日志查看, 如果 pgbouncer 日志功能没开启,那么需要在配置文件里配置 logfile 参数,这里不详细解释了。

原创文章,作者:506227337,如若转载,请注明出处:https://blog.ytso.com/tech/database/237837.html

(0)
上一篇 2022年1月29日 22:29
下一篇 2022年1月29日 22:29

相关推荐

发表回复

登录后才能评论