一、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的配置文件,熟悉它的高级配置。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,358评论 6 343
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,754评论 0 5
  • 一转眼小宝贝已经一岁多了,感觉时间过得很快,一直以来小家伙的抵抗力比较差,差不多每个月都会有点不舒服,每当看到他...
    D067_小伟_佛山阅读 158评论 0 5
  • ———袁少 这娇羞的太阳 转眼火焰般滚烫 空中弥漫幸福的灰尘 跨过小憩的庇荫 嗜血毒刺来袭 地上獠牙绊脚 背带深嵌...
    君照阅读 328评论 0 0