PgBouncer介绍
PgBouncer是为PostgreSQL提供的轻量级连接池工具,作用如下:
- 能够缓存和PostgreSQL的连接,当有连接请求进来的时候,直接分配空闲进程,而不需要PostgreSQL fork出新进程来建立连接,以节省创建新进程,创建连接的资源消耗。
- 能够有效提高连接的利用率,避免过多的无效连接,导致数据库消耗资源过大,CPU占用过高。
- 对客户端连接进行限制,预防过多或恶意的连接请求。
轻量级体现在:
- 使用libevent进行socket同学,通信效率高。
- C语言编写,效率高,每个连接仅消耗2kB内存
基本概念
支持三种连接池模型:
- session,会话级连接,连接生命周期里,连接池分配一个数据库连接,客户端断开连接时,连接放回连接池。
- transaction, 事务级连接,客户端的每个事务结束时,数据库连接就会重新释放回连接池,在执行一个事务时,就需要从连接池重新获得一个连接。
- statement,语句级别连接 ,执行完一个SQL语句时,连接就会释放回连接池,再次执行一个SQL语句时,需要重新从连接池里获取连接,这种模式意味客户端需要强制“autocommit”模式。
PgBouncer安装方法
-
在Linux发行版中,包含已经编译好的PgBouncer,可以直接安装。RHEL/CentOS平台直接使用yum命令来安装。Debian/Ubuntu平台下,直接使用apt-get命令安装。
-
在官网http://pgfoundry.org上下载源码编译安装,需要先安装libevent依赖。
PgBouncer的简单使用
- 简单配置
简单介绍PgBouncer的配置文件pgbouncer.ini,后面详细介绍具体配置。
使用系统自带工具安装的PgBouncer的配置文件路径是/etc/pgbouncer/pgbouncer.ini,默认的配置和含义如下:
[databases]
[pgbouncer]
logfile = /var/log/pgbouncer/pgbouncer.log # 日志文件位置
pidfile = /var/run/pgbouncer/pgbouncer.pid # pid文件位置
listen_addr = 127.0.0.1 # 监听的地址
listen_port = 6432 # 监听的端口
auth_type = trust # 认证方式
auth_file = /etc/pgbouncer/userlist.txt # 认证文件
admin_users = postgres # 管理员用户名
stats_users = stats, postgres # 状态用户?stats和postgres
pool_mode = session # 池的模式,默认session级别
server_reset_query = DISCARD ALL #
max_client_conn = 100 # 最大连接用户数,客户端到pgbouncer的链接数量
default_pool_size = 20 # 默认池大小,表示建立多少个pgbouncer到数据库的连接
默认情况下配置任何数据库信息,需要我们添加一些简单的信息。从上面还可以看到,配置主要分为两部分,第一部分是[databases]区域,是用来配置数据库连接相关信息的。第二部分是[pgbouncer],是pgbouncer自身的配置。
下面来看一个[databases]部分配置的示例:
forcedb = host=127.0.0.1 port=3000 user=baz password=foo client_encoding=UNIODE datestyle=ISO connect_query='SELECT 1'
它的基本格式是:
对外提供的数据库名 = host=主机IP port=端口 user=用户 password=密码
其他的规则都类似,数据库名后面的等号旁边要有空格隔开,后面每个成对的数值之间用空格隔开。这里面的主机和端口指的是PostgreSQL监听的地址和端口,而用户和密码就是用来连接PostgreSQL数据库的用户名和密码。
我们根据这个格式来建一个我们自己的配置:
testdb = host=192.168.1.244 port=5433 user=dbuser password=yourpassword connect_query='SELECT 1'
下面的[pgbouncer]区域就使用默认配置,这个默认配置里,我们需要说一下下面这两个配置:
auth_type = trust # 认证方式
auth_file = /etc/pgbouncer/userlist.txt # 认证文件
第一行是用于配置登录pgbouncer的认证方式的,和PostgreSQL认证方式相同,默认是trust,即所有的都信任,还可以使用md5加密的形式。第二行是用于配置认证用户的,即连接pgbouncer的用户名都保存在该文件中。当第一行设置为md5加密时,则加密的密码也必须保存在第二行配置的文件中。如果这个文件不存在,那么登录的时候,无论是哪个用户,都会提示下面的错误:
-bash-4.2$ psql -p 6432 testdb -h 127.0.0.1
psql: ERROR: No such user: postgres
-bash-4.2$ psql -p 6432 testdb -h 127.0.0.1 -U dbuser
psql: ERROR: No such user: dbuser
而这个认证文件默认情况下是没有的,因此需要手动生成。在PostgreSQL的9.x版本中,所有的用户密码都是保存在pg_shadow表里。PostgreSQL 8.x版本则是保存在数据库目录下,可以直接复制过来使用。我们使用的9.5版本,因此需要手动生成这个文件。生成这个认证文件有两种方式,分别是SQL语句方式和pgbouncer自带的mkauth.py脚本生成。
我们来看下两种生成方式:
(1)SQL语句生成认证文件
之前我们说过,用户密码默认是保存在pg_shadow表里的,如下面所示:
postgres=# select usename, passwd from pg_shadow order by 1;
usename | passwd
----------+-------------------------------------
dbuser | md5baa6c789c3728a1a449b82005eb54a19
postgres |
usename和passwd两列里面保存的就是我们需要的账号和密码,我们使用copy命令将它们导出来:
postgres=# copy (select usename, passwd from pg_shadow order by 1) to '/var/lib/pgsql/9.5/auth_file';
COPY 2
我们打开这个auth_file文件,内容如下:
dbuser md5baa6c789c3728a1a449b82005eb54a19
postgres \N
里面保存有postgres的账号,一般不要使用这个超级管理员的身份,最好删掉。然后保留可以连接数据库的用户账号和加密后的密码,将这个文件转移到上面配置项指定的位置。并且文件名称要和上面变量里定义的文件名一致,否则会提示找不到这个文件。最后还要注意的一点是,默认导出的文件里用户名和密码的格式pgbouncer无法识别,需要用双引号引起来,如下所示:
"dbuser" "md5baa6c789c3728a1a449b82005eb54a19"
这样才能正确识别。
(2)使用mkauth.py来生成文件
这个文件是使用python编写的一个小脚本,已经赋予了可执行权限。执行的时候需要两个参数,基本格式是:
/etc/pgbouncer/mkauth.py 用户列表文件 "数据库连接参数"
我们来看一个示例:
/etc/pgbouncer/mkauth.py /etc/pgbouncer/userlist.txt "host=127.0.0.1 user=postgres password=123456"
这里比较重要的是后面那一段参数,=号两边不能有空格,两个键值对之间要用空格隔开,不能用逗号,否则会报错。用户必须是有查询pg_shadow表权限的用户请记住这里的限制条件。
如果没有错误的话,就会在/etc/pgbouncer/目录下生成userlist.txt文件。文件内容如下所示:
"dbuser" "md5baa6c789c3728a1a449b82005eb54a19" ""
"postgres" "" ""
默认会备份出PostgreSQL数据库的pg_shadow表里的所有数据库,包括postgres用户。所有的用户名和密码都会用双引号引起来,比手动备份要方便的多。这里唯一麻烦的就是脚本后面的连接字符串。
- 启动pgbouncer
当用户文件配置好以后,就可以启动pgbouncer来使用了。
使用linux发行版自带的包管理工具安装pgbouncer的时候,它会自动创建一个pgbouncer用户,而如果是自己编译的话,则需要手动创建这个用户。创建完成以后。需要切换到这个用户下来启动pgbouncer,pgbouncer是不允许在root用户下启动的。
切换完成后,它的启动命令格式是:
pgbouncer -d /etc/pgbouncer/pgbouncer.ini
-d 表示是以后后台进程的方式运行,后面跟的是配置文件的路径。启动完成,pgbouncer默认监听6432端口。
然后就可以使用psql来登录了。
-
停止pgbouncer
目前pgbouncer还没有自主停止的脚本或者命令,只能通过kill命令来停止。格式是:
cat /var/run/pgbouncer/pgbouncer.pid | xargs kill -9
-
连接信息的查看
pgbouncer对外提供了一个虚拟数据库pgbouncer,之所以成为虚拟数据库,是因为它可以提供像PostgreSQL那样的数据库操作界面,但是这个数据库却并不是真实存在的。而是pgbouncer虚拟出来的一个命令行界面。登录命令是:
psql -p 6432 pgbouncer
登录以后可以使用show help
命令查看所有的帮助命令信息,常用的两个命令是:
-
show clients
用来查看客户端连接信息 -
show pools
用来查看连接池信息
这篇文章主要讲解了pgbouncer的基本介绍,基本配置以及简单的使用。下一篇文章继续说pgbouncer的配置文件,熟悉它的高级配置。
网友评论