一、PgBouncer

PgBouncer介绍

PgBouncer是为PostgreSQL提供的轻量级连接池工具,作用如下:

  1. 能够缓存和PostgreSQL的连接,当有连接请求进来的时候,直接分配空闲进程,而不需要PostgreSQL fork出新进程来建立连接,以节省创建新进程,创建连接的资源消耗。
  2. 能够有效提高连接的利用率,避免过多的无效连接,导致数据库消耗资源过大,CPU占用过高。
  3. 对客户端连接进行限制,预防过多或恶意的连接请求。

轻量级体现在:

  1. 使用libevent进行socket同学,通信效率高。
  2. C语言编写,效率高,每个连接仅消耗2kB内存

基本概念

支持三种连接池模型:

  1. session,会话级连接,连接生命周期里,连接池分配一个数据库连接,客户端断开连接时,连接放回连接池。
  2. transaction, 事务级连接,客户端的每个事务结束时,数据库连接就会重新释放回连接池,在执行一个事务时,就需要从连接池重新获得一个连接。
  3. statement,语句级别连接 ,执行完一个SQL语句时,连接就会释放回连接池,再次执行一个SQL语句时,需要重新从连接池里获取连接,这种模式意味客户端需要强制“autocommit”模式。

PgBouncer安装方法

  1. 在Linux发行版中,包含已经编译好的PgBouncer,可以直接安装。RHEL/CentOS平台直接使用yum命令来安装。Debian/Ubuntu平台下,直接使用apt-get命令安装。

  2. 在官网http://pgfoundry.org上下载源码编译安装,需要先安装libevent依赖。

PgBouncer的简单使用

  1. 简单配置
    简单介绍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用户。所有的用户名和密码都会用双引号引起来,比手动备份要方便的多。这里唯一麻烦的就是脚本后面的连接字符串。

  1. 启动pgbouncer
    当用户文件配置好以后,就可以启动pgbouncer来使用了。
    使用linux发行版自带的包管理工具安装pgbouncer的时候,它会自动创建一个pgbouncer用户,而如果是自己编译的话,则需要手动创建这个用户。创建完成以后。需要切换到这个用户下来启动pgbouncer,pgbouncer是不允许在root用户下启动的。

切换完成后,它的启动命令格式是:
pgbouncer -d /etc/pgbouncer/pgbouncer.ini
-d 表示是以后后台进程的方式运行,后面跟的是配置文件的路径。启动完成,pgbouncer默认监听6432端口。

然后就可以使用psql来登录了。

  1. 停止pgbouncer
    目前pgbouncer还没有自主停止的脚本或者命令,只能通过kill命令来停止。格式是:
    cat /var/run/pgbouncer/pgbouncer.pid | xargs kill -9

  2. 连接信息的查看
    pgbouncer对外提供了一个虚拟数据库pgbouncer,之所以成为虚拟数据库,是因为它可以提供像PostgreSQL那样的数据库操作界面,但是这个数据库却并不是真实存在的。而是pgbouncer虚拟出来的一个命令行界面。登录命令是:

psql -p 6432  pgbouncer

登录以后可以使用show help命令查看所有的帮助命令信息,常用的两个命令是:

  1. show clients 用来查看客户端连接信息
  2. show pools 用来查看连接池信息

这篇文章主要讲解了pgbouncer的基本介绍,基本配置以及简单的使用。下一篇文章继续说pgbouncer的配置文件,熟悉它的高级配置。

你可能感兴趣的:(一、PgBouncer)