资讯专栏INFORMATION COLUMN

pgbouncer的简单使用(下篇)

IT那活儿 / 3003人阅读
pgbouncer的简单使用(下篇)
相关阅读:
王宇,公众号:IT那活儿pgbouncer的简单使用(上篇)


四. 启动pgbouncer

启动pgbouncer ,这里必须以postgresql服务器用户启动,例如postgres。这里需要把pgbouncer的安装目录修改权限为postgres账户。chown -R postgres.postgres /usr/local/pgbouncer. 这样才能采用postgres账号启动。
su - postgres
/usr/local/pgbouncer/bin/pgbouncer -d /usr/local/pgbouncer/conf/pgbouncer.ini

[postgres@localhost config]$ pgbouncer -d pgbouncer.ini
2012-08-21 00:29:55.573 4247 LOG File descriptor limit: 1024 (H:1024), max_client_conn: 100, max fds possible: 130

查看日志 
tail -f /home/postgres/pgbouncer/pgbouncer.log

命令介绍

pgbouncer [-d][-R][-v][-u user]

-d 后台运行

-R 在线重启

-v 增加冗余信息,会消耗比较多的时间

-u 切换到指定的用户启动

-q 静默方式,不记录到stdout。请注意这并不影响记录详细,只是stdout是不被使用。在init.d脚本使用

-V 展示版本

-h 展示帮助命令

pgbouncer -V|-h

pgbouncer -d pgbouncer.ini -v ##加-v 可以打印出很多检查信息,对初使用者,是个不错的选择


关闭命令
用管理员用户登录pgbouncer 数据库 ,这个是一个虚拟库,然后执行shutdown 命令

psql -h 127.0.0.1 -p 6432 -u pgbouncer pgbouncer
(-u 后面接管理员用户)


1. 使用客户端连接到pgbouncer:

然后通过 postgresql 的psql登录pgbouncer工具的数据库pgbouncer,以便查看pgbouncer工具的状态。
这里注意连接pgbouncer 要采用pgbouncer.ini配置的pgbouncer节的listen端口:
[postgres@localhost pgbouncer]$ psql -h 127.0.0.1 -p 1999 -U u_kenyon f_game
Password for user u_kenyon: 
psql (9.1.2)
Type "help" for help.

f_game=> d
          List of relations
 Schema |    Name   | Type  | Owner
------------+-------------+--------+-------------
 public    |
 t_kenyon  | table  | postgres
 public    | test          | table  | test
 public    |
 test2        | table  | postgres
(3 rows)

f_game=> q

参数使用例子
连接pgbouncer本身的DB


[postgres@localhost config]$ psql -h 127.0.0.1 -p 1999 -U u_kenyon pgbouncer
Password for user u_kenyon: 
psql (9.1.2, server 1.5.2/bouncer)
WARNING: psql version 9.1, server version 1.5.
         Some psql features might not work.
Type "help" for help.

pgbouncer=# show help;
NOTICE:  Console usage
DETAIL:  

        SHOW  HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|VERSION
        SHOW  STATS|FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM
        SHOW  DNS_HOSTS|
DNS_ZONES
        SET key = arg
        RELOAD
        PAUSE [ ]
        RESUME [ ]
        KILL              SUSPEND
        SHUTDOWN
SHOW


2. 管理pgbouncer常用命令

1)SHOW HELP查看:

[postgres@localhost config]$ psql -h 127.0.0.1 -p 666 -U u_kenyon pgbouncer Password for user u_kenyon:
psql (9.1.2, server 1.5.2/bouncer)
WARNING: psql version 9.1, server version 1.5.
Some psql features might not work.
Type “helpfor help.
pgbouncer=# show help;
NOTICE: Console usage
DETAIL:
SHOW  HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|VERSION
SHOW  STATS|FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM
SHOW  DNS_HOSTS|DNS_ZONES
SET key = arg
RELOAD
PAUSE [ ]
RESUME [ ]
KILL SUSPEND
SHUTDOWN
SHOW如果在pgbouncer.ini文件进行了参数修改,则使用以下命令重新加载即可:
pgbouncer=# RELOAD;

2) 查看配置文件:

pgbouncer=# show config;
              key                     |                            value                             | changeable
----------------------------------+------------------------------------------------------+------------
 job_name                         | pgbouncer                                                | no
 conffile                             | pgbouncer.ini                                            | yes
 logfile                               | /home/postgres/pgbouncer/pgbouncer.log | yes
 pidfile                               | /home/postgres/pgbouncer/pgbouncer.pid | no
 listen_addr                        | 127.0.0.1                                                 | no
 listen_port                         | 1999                                                        | no
 listen_backlog                   | 128                                                          | no
 unix_socket_dir                 | /tmp                                                         | no
 unix_socket_mode             | 511                                                           | no
 unix_socket_group             |                                                                    | no
 auth_type                           | md5                                                           | yes
 auth_file                             | /home/postgres/pgbouncer/user.txt          | yes
 pool_mode                         | transaction                                                | yes
 max_client_conn                | 100                                                         | yes
 default_pool_size               | 20                                                         | yes
 min_pool_size                    | 0                                                         | yes
 reserve_pool_size              | 0                                                         | yes
 reserve_pool_timeout         | 5                                                         | yes
 syslog                                | 0                                                         | yes
 syslog_facility                     | daemon                                                         | yes
 syslog_ident                       | pgbouncer                                                         | yes
 user                                   |                                                         | no
 autodb_idle_timeout           | 3600 | yes
 server_reset_query            | DISCARD ALL | yes
 server_check_query           | select 1 | yes
 server_check_delay           | 30                                                         | yes
 query_timeout                    | 0                                                         | yes
 query_wait_timeout            | 0                                                         | yes
 client_idle_timeout             | 0                                                         | yes
 client_login_timeout           | 60                                                         | yes
 idle_transaction_timeout    | 0                                                         | yes
 server_lifetime                   | 3600                                                         | yes
 server_idle_timeout            | 600                                                         | yes
 server_connect_timeout      | 15                                                         | yes
 server_login_retry               | 15                                                         | yes
 server_round_robin             | 0                                                         | yes
 suspend_timeout                 | 10                                                         | yes
 ignore_startup_parameters  |                                                         | yes
 disable_pqexec                    | 0                                                         | no
 dns_max_ttl                         | 15                                                         | yes
 dns_zone_check_period       | 0                                                         | yes
 pkt_buf                                | 2048                                                         | no
 sbuf_loopcnt                        | 5                                                         | yes
 tcp_defer_accept                 | 1                                                         | yes
 tcp_socket_buffer                | 0                                                         | yes
 tcp_keepalive                      | 1                                                         | yes
 tcp_keepcnt                         | 0                                                         | yes
 tcp_keepidle                        | 0                                                         | yes
 tcp_keepintvl                       | 0                                                         | yes
 verbose                                | 0                                                         | yes
 admin_users                        | u_kenyon                                                         | yes
 stats_users                          | | yes
 stats_period                         | 60                                                         | yes
 log_connections                   | 1                                                         | yes
 log_disconnections               | 1                                                         | yes
 log_pooler_errors                 | 1                                                         | yes
(56 rows)

本次测试环境修改的参数不多,还有其他参数如server_idle_timeout,max_connections也比较重要,后期再写。
使用reload可以不用重启pgbouncer而使修改的参数生效

pgbouncer=# reload;

RELOAD

pgbouncer=#

使用reload可以不用重启pgbouncer而使修改的参数生效

pgbouncer=# reload;

RELOAD

pgbouncer=#


3) 管理命令

在连接池端看连接数:

在DB端看连接数:

f_game=> select count(1) from pg_stat_activity;
count
---------------------
 2
 (1 row)

只有2个,看来池的效果已经初显成效,可预计高并发的时候池连接的可重复性使用,实际连接到DB端的进程并不是很多.

3. Java 连接 postgresql生效

那么要如何使程序连接生效呢?比如java web程序
之前我们连接数据库在java 配置文件采用的连接是:
这里我们改成 jdbc:postgresql://localhost:5433/server_main,和pgbouncer配置文件一致。账号密码为 user.txt 里面的账号密码对。这里其实就是将连接postgresql 通过pgbouncer来管理。

通过pgbouncer数据库show clients; 和 server_main 数据库中select count (1) from pg_stat_activity;可以看到,DB的连接大幅下降了,转到pgbouncer了。


4. 其他

注意使用psql连接工具,通过pgbouncer连接到数据库后,如果使用c dbname,切换数据库时,会自动切换到pgbouncer中配置的用户和数据库,具体如下图所示:


五. 常用命令

首先是登录了pgbouncer 的数据库,其次具有执行这些命令的权限

1. 通过admin用户连接pgbouncer查看配置:

psql -h 127.0.0.1 -p 6000 -U user pgbouncer

pgbouncer=# show config;

2. 通过admin用户连接pgbouncer查看运行情况:

show stats;   #查看连接池的状态信息

pgbouncer=# show stats;

database :数据库名称

total_requests:
pgbouncer汇聚SQL请求的总数

total_received:
 pgbouncer 接收网络请求总字节数

total_sent::
pgbouncer 发送到网络的总字节数

total_query_time:
pgbouncer 连接到PG数据库所使用的总时间数,单位微秒

avg_req:
上一个时刻,每秒请求平均数

avg_recv:
平均每秒钟在客户端那接收到的字节数

avg_sent:
平均每秒发送到客户端的字节数

avg_query:
每微秒平均查询数

show servers;  列出数据库与pgbouncer之间连接,
type: S 表示服务器
user: pgbouncer 连接数据库服务器的用户名
database: 所连接的数据库名
state: pgbouncer 连接服务器的连接状态 (active ,used , idle )
addr:postgresql 服务器的地址
port : postgresql监听的端口
local_addr :当前pgboucer 所在服务器的ip
local_port :连接在本地机器开启的端口
connect_time : 连接创建的时间
request_time: 最后一个请求发出的时间
ptr: 本连接的一个内部对象地址,作为唯一的ID标示
link: 客户端连接服务器的配对地址
show clients; 客户端连接pgbouncer 的状态信息列出客户端及客户端连接状态
type:C,表示客户端
user:客户端连接的用户
database:数据库名
state:客户端连接的状态 active、used、waiting或者idle之一
addr:客户端的 IP 地址
port:客户端连接去的端口
local_addr:本地机器上连接到的对端地址
local_port:本地机器上的连接到的对端端口
connect_time:最后的客户端连接的时间戳
request_time:最后的客户端请求的时间戳
ptr:这个连接的内部对象的地址,用做唯一 ID
link:这个客户端连接对应的服务器的地址
show pools; 列出连接池,查看连接池中连接的状态信息
database:数据库名
user:用户名
cl_active:当前 active (活跃)的客户端连接的个数
cl_waiting:当前 waiting (等待)的客户端连接个数
sv_active:当前 active (活跃)的服务器连接个数
sv_idle:当前 idle (空闲) 的服务器连接个数
sv_used:当前 used (在使用)的服务器连接个数
sv_tested:当前 tested (测试过)的服务器连接个数
sv_login:当前 login (登录)到 PostgreSQL 服务器的个数
maxwait:队列中第一个(最老的那个)客户端等待的时间长度,单位是秒.如果这个数值开始上升,那么就意味着当前的连接池中的服务器处理请求的速度不够快.原因可能是服务器过载,也可能只是 pool_size 太小
show lists ;  显示连接池的计数信息
databases:数据库的个数
users:用户的个数
pools:连接池的个数
free_clients:空闲客户端的个数
used_clients:已用的客户端的个数
login_clients:处于已登录状态的客户端个数
free_servers:空闲服务器个数
used_servers:已用服务器个数
show users;
show databases;  列出pgbouncer数据库别名及相关数据库
name:已配置的数据库名字记录
host:pgbouncer 连接到的主机名
port:pgbouncer 连接到的端口号
database:pgbouncer 实际连接的数据库名
force_user:当用户是连接字串的一部分的时候,在 pgbouncer 和 PostgreSQL 之间的连接会强制成给出的用户,不管 client user 是什么
pool_size:最大的服务器端连接数目
show fds; 内部命令 - 显示正在使用的文件描述符列表以及附加到它们的内部状态。
显示正在使用的 fd 列表如果连接的用户的用户名是 “pgbouncer”,那么通过 unix socket 连接,并且和运行的进程有同样的 UID,实际的 fd 列表是通过这个连接传递的这个机制用于做在线重启。
fd:文件描述符的数字值
task:pooler,client 或 server 之一
user:使用该 FD 的连接用户
database:使用该 FD 的连接的数据库
addr:使用该 FD 的连接的 IP 地址,如果使用的是 unix socket,就是 unix
port:使用该 FD 的连接的端口号
cancel:这个连接的取消键字
link:对应的服务器/客户端的 fd如果为 idle (空闲)则为 NULL
show config;查看所有的配置信息
show dns_hosts;
show dns_zones;

#其余运行参数可以通过如下命令查看

pgbouncer=# show help;

SHOW STATS_TOTALS;
SHOW STATS的子集显示总值(total_)。;
SHOW STATS_AVERAGES;  SHOW STATS的子集显示平均值(avg_)。


3. 进程控制命令

PAUSE[db]:

这个命令尝试终止所有的到服务器端连接,首先会等待所有的查询都完成后,这个命令只有等到所有的查询都结束时才会返回,用于数据库重启。如果有指定[db] 则是终止指定的数据库;

KILL db:

马上终止指定数据库的客户端跟服务器端的连接。
suspend:

刷新所有的套接字缓冲区,pgbouncer 将停止对其的监听,这个命令只有将所有的缓冲区都清空后才会返回。用于pgbouncer 在线重启

resume [db]:

这个命令配合 pause 跟 suspend 使用的,解除pgbouncer 的终止状态

shutdown:

关闭pgbouncer

reload:

重载配置文件,并更新所有的已更改的设置

DISABLE:

拒绝指定数据库上所有新客户端连接

ENALBLE:

准许之前DISABLE命令之后的新客户端连接

4. PgBouncer连接类型

会话池连接:
即以一个session为生命期,当客户端断开的时候,才断开并释放连接回连接池
事务连接:
服务器连接只是在一个事务的过程里赋予客户端的
语句连接:
在每个查询结束之后,服务器的连接都会立即放回连接池。在这种模式下将不允许多语句的事务。否则,会给出如下提示,比如

test=# begin;
 ERROR: Long transactions not allowed
   server closed the connection unexpectedly
   This probably means the server terminated abnormally
   before or while processing the request.
 The connection to the server was lost. Attempting reset: Succeeded.

5. 客户端连接方式

这里我简单说明一下客户端不同连接方式时服务器端的处理方式,以perl中为例:

$dbh = DBI -> connect(dbi:Pg:dbname=test;host=127.0.0.1;port=6000, postgres, ) or die

$DBI::errstr;

客户端为AutoCommit时,transaction类型 = statements类型
pool类型为transaction类型,如果客户端不为AutoCommit时,必须显示Commit,否则连接不释放
pool类型为statements类型时,连接不支持长语句,因此客户端必须AutoCommit,否则依然会报错
AutoCommit配置为:
{AutoCommit => 0}

6. 连接参数配置及客户端状态

max_client_conn
这个为允许客户端连接的最大数目
你可以通过show clients进行查看,当客户段连接大于此设置时,客户端会得到类似如下信息:
psql: ERROR:  no more connections allowed
default_pool_size
这个为当前连接池中允许的最大处理连接
比如default_pool_size=3,如果在连接池没有空余连接的情况下,如果已经连接的客户端尝试通过PgBouncer向后端执行查询请求,
则客户端会一直处理等待状态,当有空余的连接释放时,比如其他的客户端断开连接时,PgBouncer才会把此请求放如连接池中,
向后端提出服务请求,后端收到请求后,才执行请求返回结果,比如
template1=# select * from test;


六. pgboucher日志


in b/s:这个比较好读懂,每秒读入字节数。
 out b/s:和in b/s一样,表示每秒读出的字节数。
 query us:平均每个查询话费的时间,单位微秒。us应该是used的缩写。
 wait time : 等待耗时 微秒
 xacts/s: 每秒多少个事务操作
 queries/s:每秒多少次请求数
 xact  us:每个事务耗时多少微秒
 还可以查看 pgbouncer库上的  SHOW STATS_TOTALS
 
END


更多精彩干货分享

点击下方名片关注

IT那活儿

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129811.html

相关文章

  • 构建可扩展PostgreSQL解决方案

    摘要:这可以通过负载平衡来实现数据分片当问题不是并发查询的数量,而是数据库的大小和单个查询的速度时,可以实现不同的方法。 showImg(https://segmentfault.com/img/remote/1460000018875091); 来源 | 愿码(ChainDesk.CN)内容编辑 愿码Slogan | 连接每个程序员的故事 网站 | http://chaindesk.cn...

    jonh_felix 评论0 收藏0
  • 构建可扩展PostgreSQL解决方案

    摘要:这可以通过负载平衡来实现数据分片当问题不是并发查询的数量,而是数据库的大小和单个查询的速度时,可以实现不同的方法。 showImg(https://segmentfault.com/img/remote/1460000018875091); 来源 | 愿码(ChainDesk.CN)内容编辑 愿码Slogan | 连接每个程序员的故事 网站 | http://chaindesk.cn...

    FrozenMap 评论0 收藏0
  • Python Enclosing作用域、闭包、装饰器话聊下篇

    摘要:作用域闭包装饰器话聊下篇作用域闭包装饰器的基础篇,请看作用域闭包装饰器话聊上篇我经常看到有人的装饰器是带参数的,这又是咋回事呢这个其实很简单的,你还记得上次我说相当于那么相当于也就是说,返回的是一个装饰器函数,然后再去装饰其他函数。 Python Enclosing作用域、闭包、装饰器话聊下篇 Python Enclosing作用域、闭包、装饰器的基础篇,请看Python Enclos...

    DirtyMind 评论0 收藏0
  • Spring Boot [配置-下篇]

    摘要:进行异常的捕捉与错误信息页面的定制。告诉,这是一个对象,该对象应该被注册为在应用程序上下文中的。不同框架的不同配置这里以作为演示默认情况下,保护已启用。你必须配置包含令牌的所有的网页来工作。该命名结构旨在帮你找到需要的。 导读: 在上篇文章中我们了解到Spring Boot 的一些常用的外部化配置,在本篇中我们将会继续对类的配置进行了解 一个简单的例子[错误页面定制]: 在 Spr...

    StonePanda 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<