PgBouncer介紹
PgBouncer是為PostgreSQL提供的輕量級(jí)連接池工具,作用如下:
- 能夠緩存和PostgreSQL的連接,當(dāng)有連接請(qǐng)求進(jìn)來(lái)的時(shí)候,直接分配空閑進(jìn)程,而不需要PostgreSQL fork出新進(jìn)程來(lái)建立連接,以節(jié)省創(chuàng)建新進(jìn)程,創(chuàng)建連接的資源消耗。
- 能夠有效提高連接的利用率,避免過(guò)多的無(wú)效連接,導(dǎo)致數(shù)據(jù)庫(kù)消耗資源過(guò)大,CPU占用過(guò)高。
- 對(duì)客戶端連接進(jìn)行限制,預(yù)防過(guò)多或惡意的連接請(qǐng)求。
輕量級(jí)體現(xiàn)在:
- 使用libevent進(jìn)行socket同學(xué),通信效率高。
- C語(yǔ)言編寫(xiě),效率高,每個(gè)連接僅消耗2kB內(nèi)存
基本概念
支持三種連接池模型:
- session,會(huì)話級(jí)連接,連接生命周期里,連接池分配一個(gè)數(shù)據(jù)庫(kù)連接,客戶端斷開(kāi)連接時(shí),連接放回連接池。
- transaction, 事務(wù)級(jí)連接,客戶端的每個(gè)事務(wù)結(jié)束時(shí),數(shù)據(jù)庫(kù)連接就會(huì)重新釋放回連接池,在執(zhí)行一個(gè)事務(wù)時(shí),就需要從連接池重新獲得一個(gè)連接。
- statement,語(yǔ)句級(jí)別連接 ,執(zhí)行完一個(gè)SQL語(yǔ)句時(shí),連接就會(huì)釋放回連接池,再次執(zhí)行一個(gè)SQL語(yǔ)句時(shí),需要重新從連接池里獲取連接,這種模式意味客戶端需要強(qiáng)制“autocommit”模式。
PgBouncer安裝方法
在Linux發(fā)行版中,包含已經(jīng)編譯好的PgBouncer,可以直接安裝。RHEL/CentOS平臺(tái)直接使用yum命令來(lái)安裝。Debian/Ubuntu平臺(tái)下,直接使用apt-get命令安裝。
在官網(wǎng)http://pgfoundry.org上下載源碼編譯安裝,需要先安裝libevent依賴(lài)。
PgBouncer的簡(jiǎn)單使用
- 簡(jiǎn)單配置
簡(jiǎn)單介紹PgBouncer的配置文件pgbouncer.ini,后面詳細(xì)介紹具體配置。
使用系統(tǒng)自帶工具安裝的PgBouncer的配置文件路徑是/etc/pgbouncer/pgbouncer.ini,默認(rèn)的配置和含義如下:
[databases]
[pgbouncer]
logfile = /var/log/pgbouncer/pgbouncer.log # 日志文件位置
pidfile = /var/run/pgbouncer/pgbouncer.pid # pid文件位置
listen_addr = 127.0.0.1 # 監(jiān)聽(tīng)的地址
listen_port = 6432 # 監(jiān)聽(tīng)的端口
auth_type = trust # 認(rèn)證方式
auth_file = /etc/pgbouncer/userlist.txt # 認(rèn)證文件
admin_users = postgres # 管理員用戶名
stats_users = stats, postgres # 狀態(tài)用戶?stats和postgres
pool_mode = session # 池的模式,默認(rèn)session級(jí)別
server_reset_query = DISCARD ALL #
max_client_conn = 100 # 最大連接用戶數(shù),客戶端到pgbouncer的鏈接數(shù)量
default_pool_size = 20 # 默認(rèn)池大小,表示建立多少個(gè)pgbouncer到數(shù)據(jù)庫(kù)的連接
默認(rèn)情況下配置任何數(shù)據(jù)庫(kù)信息,需要我們添加一些簡(jiǎn)單的信息。從上面還可以看到,配置主要分為兩部分,第一部分是[databases]區(qū)域,是用來(lái)配置數(shù)據(jù)庫(kù)連接相關(guān)信息的。第二部分是[pgbouncer],是pgbouncer自身的配置。
下面來(lái)看一個(gè)[databases]部分配置的示例:
forcedb = host=127.0.0.1 port=3000 user=baz password=foo client_encoding=UNIODE datestyle=ISO connect_query='SELECT 1'
它的基本格式是:
對(duì)外提供的數(shù)據(jù)庫(kù)名 = host=主機(jī)IP port=端口 user=用戶 password=密碼
其他的規(guī)則都類(lèi)似,數(shù)據(jù)庫(kù)名后面的等號(hào)旁邊要有空格隔開(kāi),后面每個(gè)成對(duì)的數(shù)值之間用空格隔開(kāi)。這里面的主機(jī)和端口指的是PostgreSQL監(jiān)聽(tīng)的地址和端口,而用戶和密碼就是用來(lái)連接PostgreSQL數(shù)據(jù)庫(kù)的用戶名和密碼。
我們根據(jù)這個(gè)格式來(lái)建一個(gè)我們自己的配置:
testdb = host=192.168.1.244 port=5433 user=dbuser password=yourpassword connect_query='SELECT 1'
下面的[pgbouncer]區(qū)域就使用默認(rèn)配置,這個(gè)默認(rèn)配置里,我們需要說(shuō)一下下面這兩個(gè)配置:
auth_type = trust # 認(rèn)證方式
auth_file = /etc/pgbouncer/userlist.txt # 認(rèn)證文件
第一行是用于配置登錄pgbouncer的認(rèn)證方式的,和PostgreSQL認(rèn)證方式相同,默認(rèn)是trust,即所有的都信任,還可以使用md5加密的形式。第二行是用于配置認(rèn)證用戶的,即連接pgbouncer的用戶名都保存在該文件中。當(dāng)?shù)谝恍性O(shè)置為md5加密時(shí),則加密的密碼也必須保存在第二行配置的文件中。如果這個(gè)文件不存在,那么登錄的時(shí)候,無(wú)論是哪個(gè)用戶,都會(huì)提示下面的錯(cuò)誤:
-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
而這個(gè)認(rèn)證文件默認(rèn)情況下是沒(méi)有的,因此需要手動(dòng)生成。在PostgreSQL的9.x版本中,所有的用戶密碼都是保存在pg_shadow表里。PostgreSQL 8.x版本則是保存在數(shù)據(jù)庫(kù)目錄下,可以直接復(fù)制過(guò)來(lái)使用。我們使用的9.5版本,因此需要手動(dòng)生成這個(gè)文件。生成這個(gè)認(rèn)證文件有兩種方式,分別是SQL語(yǔ)句方式和pgbouncer自帶的mkauth.py腳本生成。
我們來(lái)看下兩種生成方式:
(1)SQL語(yǔ)句生成認(rèn)證文件
之前我們說(shuō)過(guò),用戶密碼默認(rèn)是保存在pg_shadow表里的,如下面所示:
postgres=# select usename, passwd from pg_shadow order by 1;
usename | passwd
----------+-------------------------------------
dbuser | md5baa6c789c3728a1a449b82005eb54a19
postgres |
usename和passwd兩列里面保存的就是我們需要的賬號(hào)和密碼,我們使用copy命令將它們導(dǎo)出來(lái):
postgres=# copy (select usename, passwd from pg_shadow order by 1) to '/var/lib/pgsql/9.5/auth_file';
COPY 2
我們打開(kāi)這個(gè)auth_file文件,內(nèi)容如下:
dbuser md5baa6c789c3728a1a449b82005eb54a19
postgres \N
里面保存有postgres的賬號(hào),一般不要使用這個(gè)超級(jí)管理員的身份,最好刪掉。然后保留可以連接數(shù)據(jù)庫(kù)的用戶賬號(hào)和加密后的密碼,將這個(gè)文件轉(zhuǎn)移到上面配置項(xiàng)指定的位置。并且文件名稱(chēng)要和上面變量里定義的文件名一致,否則會(huì)提示找不到這個(gè)文件。最后還要注意的一點(diǎn)是,默認(rèn)導(dǎo)出的文件里用戶名和密碼的格式pgbouncer無(wú)法識(shí)別,需要用雙引號(hào)引起來(lái),如下所示:
"dbuser" "md5baa6c789c3728a1a449b82005eb54a19"
這樣才能正確識(shí)別。
(2)使用mkauth.py來(lái)生成文件
這個(gè)文件是使用python編寫(xiě)的一個(gè)小腳本,已經(jīng)賦予了可執(zhí)行權(quán)限。執(zhí)行的時(shí)候需要兩個(gè)參數(shù),基本格式是:
/etc/pgbouncer/mkauth.py 用戶列表文件 "數(shù)據(jù)庫(kù)連接參數(shù)"
我們來(lái)看一個(gè)示例:
/etc/pgbouncer/mkauth.py /etc/pgbouncer/userlist.txt "host=127.0.0.1 user=postgres password=123456"
這里比較重要的是后面那一段參數(shù),=號(hào)兩邊不能有空格,兩個(gè)鍵值對(duì)之間要用空格隔開(kāi),不能用逗號(hào),否則會(huì)報(bào)錯(cuò)。用戶必須是有查詢pg_shadow表權(quán)限的用戶請(qǐng)記住這里的限制條件。
如果沒(méi)有錯(cuò)誤的話,就會(huì)在/etc/pgbouncer/目錄下生成userlist.txt文件。文件內(nèi)容如下所示:
"dbuser" "md5baa6c789c3728a1a449b82005eb54a19" ""
"postgres" "" ""
默認(rèn)會(huì)備份出PostgreSQL數(shù)據(jù)庫(kù)的pg_shadow表里的所有數(shù)據(jù)庫(kù),包括postgres用戶。所有的用戶名和密碼都會(huì)用雙引號(hào)引起來(lái),比手動(dòng)備份要方便的多。這里唯一麻煩的就是腳本后面的連接字符串。
- 啟動(dòng)pgbouncer
當(dāng)用戶文件配置好以后,就可以啟動(dòng)pgbouncer來(lái)使用了。
使用linux發(fā)行版自帶的包管理工具安裝pgbouncer的時(shí)候,它會(huì)自動(dòng)創(chuàng)建一個(gè)pgbouncer用戶,而如果是自己編譯的話,則需要手動(dòng)創(chuàng)建這個(gè)用戶。創(chuàng)建完成以后。需要切換到這個(gè)用戶下來(lái)啟動(dòng)pgbouncer,pgbouncer是不允許在root用戶下啟動(dòng)的。
切換完成后,它的啟動(dòng)命令格式是:
pgbouncer -d /etc/pgbouncer/pgbouncer.ini
-d 表示是以后后臺(tái)進(jìn)程的方式運(yùn)行,后面跟的是配置文件的路徑。啟動(dòng)完成,pgbouncer默認(rèn)監(jiān)聽(tīng)6432端口。
然后就可以使用psql來(lái)登錄了。
停止pgbouncer
目前pgbouncer還沒(méi)有自主停止的腳本或者命令,只能通過(guò)kill命令來(lái)停止。格式是:
cat /var/run/pgbouncer/pgbouncer.pid | xargs kill -9
連接信息的查看
pgbouncer對(duì)外提供了一個(gè)虛擬數(shù)據(jù)庫(kù)pgbouncer,之所以成為虛擬數(shù)據(jù)庫(kù),是因?yàn)樗梢蕴峁┫馪ostgreSQL那樣的數(shù)據(jù)庫(kù)操作界面,但是這個(gè)數(shù)據(jù)庫(kù)卻并不是真實(shí)存在的。而是pgbouncer虛擬出來(lái)的一個(gè)命令行界面。登錄命令是:
psql -p 6432 pgbouncer
登錄以后可以使用show help
命令查看所有的幫助命令信息,常用的兩個(gè)命令是:
-
show clients
用來(lái)查看客戶端連接信息 -
show pools
用來(lái)查看連接池信息
這篇文章主要講解了pgbouncer的基本介紹,基本配置以及簡(jiǎn)單的使用。下一篇文章繼續(xù)說(shuō)pgbouncer的配置文件,熟悉它的高級(jí)配置。