簡介
pgbouncer 是一個 PostgreSQL 連接配接池。任何目标應用程式都可以像連接配接 PostgreSQL 伺服器一樣連接配接到pgbouncer,并且 pgbouncer 将建立到實際伺服器的連接配接,或者重用其現有的連接配接。pgbouncer 的目的是降低打開新連接配接到 PostgreSQL 的性能影響。
連接配接池
PostgreSQL允許我們通過參數max_connections來控制最大連接配接數 ,但是如果為前端應用的每次請求都配置設定一個新的DB連接配接,那麼DB服務端可能在連結風暴到來時需要一次性提供大量的連接配接插槽,這會嚴重消耗服務端的記憶體,并且會導緻性能急劇下降。
在高并發請求的應用場景,為了保護DB,取而代之的我們可以利用連接配接池的連接配接複用特性,來避免DB被突然到來的連接配接洪峰淹沒。這樣,當應用程式一次性發送成千上萬個查詢的時候,如果超過了DB的處理能力,請求将在會連接配接池中排隊,而不會導緻後端PostgreSQL崩潰。
與突然配置設定大量DB連接配接相比,這種在連接配接池中配置固定數量的連接配接處理來接收請求,查詢的性能要好得多。另外,用戶端的連接配接非常輕巧,除了檔案描述符外基本沒有其他消耗。但我們服務端連接配接卻很重,需要适當配置。用較少的伺服器連接配接來支援大量的用戶端連接配接,是我們在PostgreSQL使用pgouncer的主要用
作用
能夠緩存和PostgreSQL的連接配接,當有連接配接請求進來的時候,直接配置設定空閑程序,而不需要PostgreSQL fork出新程序來建立連接配接,以節省建立新程序,建立連接配接的資源消耗。
能夠有效提高連接配接的使用率,避免過多的無效連接配接,導緻資料庫消耗資源過大,CPU占用過高。
對用戶端連接配接進行限制,預防過多或惡意的連接配接請求。
特點
C語言編寫,效率高,記憶體消耗低(預設為2k/連接配接),因為Bouncer不需要每次都接受完整的資料包
可以把不同的資料庫連接配接到一個機器上,而對用戶端保持透明
支援線上的重新配置而無須重新開機
僅支援V3協定,是以後端版本須>=7.4
使用libevent進行socket通信,通信效率高。
下載下傳路徑
http://www.pgbouncer.org/downloads/
安裝
依賴
GNU Make 3.81+
Libevent 2.0+
pkg-config
OpenSSL 1.0.1+ for TLS support
(optional) c-ares as alternative to Libevent’s evdns
(optional) PAM libraries
- 安裝依賴
yum install -y libevent libevent-devel
yum install -y openssl-devel
編譯安裝
/configure --prefix=/usr/local/pgbouncer
* 如果 openssl 安裝失敗,可以不帶 openssl 選項
/configure --prefix=/usr/local/pgbouncer --without-openssl
make && make install
環境變量配置
echo 'export PATH=/usr/local/pgbouncer/bin:$PATH' >>/etc/profile
source /etc/profile
- 測試
[root@localhost pgbouncer-1.17.0]# pgbouncer -V
pgbouncer: /usr/local/lib/libssl.so.10: no version information available (required by pgbouncer)
PgBouncer 1.17.0
libevent 2.0.21-stable
adns: c-ares 1.10.0
tls: OpenSSL 1.0.2k-fips 26 Jan 2017
- 配置
mkdir -p /etc/pgbouncer
cat >> /etc/pgbouncer/userlist.txt <<"EOF"
"postgres" :"md55305adaac499dbbc6865a44e4aa5d8b4"
EOF
cat >> /etc/pgbouncer/pgbouncer.ini <<"EOF"
[databases]
*= host=207.207.35.100 port=5432 dbname=postgres user=postgres
[pgbouncer]
listen_port = 6432
listen_addr = 207.207.35.100
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
logfile = /etc/pgbouncer/pgbouncer.log
pidfile = /etc/pgbouncer/pgbouncer.pid
admin_users = postgres
stats_users = postgres
server_reset_query = DISCARD ALL
server_check_query = select 1
server_check_delay = 30
max_client_conn = 5000
default_pool_size = 20
reserve_pool_size = 5
dns_max_ttl = 15
pool_mode=transaction
EOF
chown postgres.postgres -R /etc/pgbouncer
注意事項: 上面的 userlist.txt 中格式為 “使用者名“ “加密之後在的密碼“
對于md5 加密的密碼, 可以從 PG 中擷取
postgres=# select usename,passwd from pg_shadow ;
usename | passwd
----------+-------------------------------------
postgres | md55305adaac499dbbc6865a44e4aa5d8b4
(1 row)
- 啟動
su - postgres
pgbouncer -d /etc/pgbouncer/pgbouncer.ini
- 測試遠端連接配接
[root@localhost ~]# /home/postgres/pgsql/bin/psql -U postgres -h 207.207.35.100 -p 6432 -d postgres -c "select version()"
Password for user postgres:
version
------------------------------------------------------------------------------------------------------------
PostgreSQL 11.8 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 7.5.0, 64-bit
(1 row)