作者:何偉平
來源:http://www.pgsqldb.org/mwiki/index.php/Pgbouncer%E6%90%AD%E5%BB%BA%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5%E6%B1%A0
最近有些項目我們是採用PostgreSQL進行後端資料庫,由於要對用戶端的串連使用類型和串連數進行控制,因此我們採用PgBouncer來進行實施。
PgBouncer相關的基本文檔pgsqldb中文站已經有不少文檔,這裡我就不再作過多的說明,我將集中對其中的幾個要點和我實踐中遇到的問題和大家分享一下。
OK,肺話也不多少,開始正題吧;D
gBouncer介紹
PgBouncer是一個輕量級的資料庫連接池。download
- PgBouncer可以在後端資料庫和前端應用間建立串連的橋樑,由PgBouncer去處理和後端資料庫的串連關係。
- 對用戶端串連進行限制,預防過多或者惡意的串連請求。
- 記憶體消耗低(預設為2k/串連),因為Bouncer不需要每次都接受完整的資料包
- 可以把不同的資料庫連接到一個機器上,而對用戶端保持透明
- 支援線上的重新設定而無須重啟
- 僅支援V3協議,因此後端版本須>=7.4
開始使用PgBouncer
- 基本ini檔案配置(假設我們建立了新的ini檔案/usr/local/pgsql/conf/pgbouncer.ini)
1. 添加目標資料庫的連接字串,這個表示PgBouncer將會在哪些後端資料庫中建立串連,比如:
template1 = host=127.0.0.1 port=5432 dbname=template1
2. 設定PgBouncer的監聽連接埠, port=5555,預設為6000
3. 建立使用者列表檔案並添加使用者資訊,此使用者為允許用戶端使用的串連使用者名稱,比如:
A. zhaoyi@zhaoyi-laptop:[~]$ echo "user" "password" > /usr/local/pgsql/user.txtB. 在ini設定:auth_file = /usr/local/pgsql/user.txt
4. 建立admin使用者,在配置中添加:admin_users = user,使用者可以使用此使用者名稱串連pgbouncer並查看健全狀態等,注意:此使用者必須為user.txt檔案中已經存在的使用者。
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 pgbouncerpgbouncer=# show config;
3. 通過admin使用者串連pgbouncer查看運行情況:
pgbouncer=# show stats;pgbouncer=# show lists; pgbouncer=# show pools;pgbouncer=# show databases;#其餘運行參數可以通過如下命令查看pgbouncer=# show help;
4. 參數修改:如果修改了ini檔案中相關參數,需要通過命令告知bouncer重新讀取配置內容:
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}
串連參數配置及用戶端狀態
- 這個為允許用戶端串連的最大數目
- 你可以通過show clients進行查看,當客戶段串連大於此設定時,用戶端會得到類似如下資訊:
psql: ERROR: no more connections allowed
- 這個為當前串連池中允許的最大處理串連
- 比如default_pool_size=3,如果在串連池沒有空餘串連的情況下,如果已經串連的用戶端嘗試通過PgBouncer向後端執行查詢請求,則用戶端會一直處理等待狀態,當有空餘的串連釋放時,比如其他的用戶端中斷連線時,PgBouncer才會把此請求放如串連池中,向後端提出服務要求,後端收到請求後,才執行請求返回結果,比如
template1=# select * from test; --no result
以上測試都是基於 pgbouncer version 1.1.1 + psql (PostgreSQL) 8.3.3
相關文檔
- Config file documentation
- Usage document
- 使用者手冊
- 管理員手冊
相關參考:
http://pgfoundry.org/projects/pgbouncer/