postgresql数据库连接池pgbouncer的搭建
最近有些項目我們是采用PostgreSQL進行后端數(shù)據(jù)庫,由于要對客戶端的連接使用類型和連接數(shù)進行控制,因此我們采用PgBouncer來進行實施。
PgBouncer相關的基本文檔pgsqldb中文站已經(jīng)有不少文檔,這里我就不再作過多的說明,我將集中對其中的幾個要點和我實踐中遇到的問題和大家分享一下。
OK,肺話也不多少,開始正題吧;D
PgBouncer介紹
什么是PgBouncer?
PgBouncer是一個輕量級的數(shù)據(jù)庫連接池。download
PgBouncer的作用
PgBouncer可以在后端數(shù)據(jù)庫和前端應用間建立連接的橋梁,由PgBouncer去處理和后端數(shù)據(jù)庫的連接關系。
對客戶端連接進行限制,預防過多或者惡意的連接請求。
PgBouncer的特點
內(nèi)存消耗低(默認為2k/連接),因為Bouncer不需要每次都接受完整的數(shù)據(jù)包
可以把不同的數(shù)據(jù)庫連接到一個機器上,而對客戶端保持透明
支持在線的重新配置而無須重啟
僅支持V3協(xié)議,因此后端版本須>=7.4
開始使用PgBouncer
基本ini文件配置(假設我們創(chuàng)建了新的ini文件/usr/local/pgsql/conf/pgbouncer.ini)
1. 添加目標數(shù)據(jù)庫的連接字符串,這個表示PgBouncer將會在哪些后端數(shù)據(jù)庫中建立連接,比如:
template1 = host=127.0.0.1 port=5432 dbname=template1
2. 設定PgBouncer的監(jiān)聽端口, port=5555,默認為6000
3. 創(chuàng)建用戶列表文件并添加用戶信息,此用戶為允許客戶端使用的連接用戶名,比如:
A. zhaoyi@zhaoyi-laptop:[~]$ echo "user" "password" > /usr/local/pgsql/user.txt
B. 在ini設定:auth_file = /usr/local/pgsql/user.txt
4. 創(chuàng)建admin用戶,在配置中添加:admin_users = user,用戶可以使用此用戶名連接pgbouncer并查看運行狀況等,
注意:此用戶必須為user.txt文件中已經(jīng)存在的用戶。
啟動并測試連接/查看運行狀況
1. 啟動:pgbouncer -d pgbouncer.ini
2. 測試連接:psql -h 127.0.0.1 -p 6000 -U user template1
3. 通過admin用戶連接pgbouncer查看配置:
psql -h 127.0.0.1 -p 6000 -U user pgbouncer
pgbouncer=# show config;
3. 通過admin用戶連接pgbouncer查看運行情況:
pgbouncer=# show stats;
pgbouncer=# show lists;?
pgbouncer=# show pools;
pgbouncer=# show databases;
#其余運行參數(shù)可以通過如下命令查看
pgbouncer=# show help;
4. 參數(shù)修改:如果修改了ini文件中相關參數(shù),需要通過命令告知bouncer重新讀取配置內(nèi)容:
pgbouncer=# reload;
?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.
客戶端連接方式
這里我簡單說明一下客戶端不同連接方式時服務器端的處理方式,以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}
連接參數(shù)配置及客戶端狀態(tài)
max_client_conn
這個為允許客戶端連接的最大數(shù)目
你可以通過show clients進行查看,當客戶段連接大于此設置時,客戶端會得到類似如下信息:
psql: ERROR:? no more connections allowed
default_pool_size
這個為當前連接池中允許的最大處理連接
比如default_pool_size=3,如果在連接池沒有空余連接的情況下,如果已經(jīng)連接的客戶端嘗試通過PgBouncer向后端執(zhí)行查詢請求,
則客戶端會一直處理等待狀態(tài),當有空余的連接釋放時,比如其他的客戶端斷開連接時,PgBouncer才會把此請求放如連接池中,
向后端提出服務請求,后端收到請求后,才執(zhí)行請求返回結果,比如
template1=# select * from test;
?--no result
以上測試都是基于 pgbouncer version 1.1.1 + psql (PostgreSQL) 8.3.3
?
轉:http://www.cnblogs.com/BloodAndBone/archive/2011/02/28/1967123.html
轉載于:https://www.cnblogs.com/shuaixf/archive/2011/11/22/2259094.html
總結
以上是生活随笔為你收集整理的postgresql数据库连接池pgbouncer的搭建的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 64位操作系统下IIS报“试图加载格式不
- 下一篇: 技术人员写blog的好处