pgbouncer
在微服務架構中,每個微服務提供一項功能邏輯的處理,他們之間通過API交互,一般每個微服務或多或少需要與數據庫交互,每個微服務配置了DAO連接池。如果后端微服務較多,數據庫上默認創建的連接數量就有可能太多(微服務熟練×連接池配置的連接數量)。微服務的增加也會導致數據庫的連接的增加,即便大多數情況連接池空閑,也會導致數據庫端占用資源過多。
將連接池的配置遷移到數據庫端統一管理,pgbouncer是postgreSQL的輕量級連接池管理工具,可以有效提高連接的利用率,避免過多無效連接占用資源過多的情況,同時也能對客戶端連接進行限制,避免過多連接或惡意請求。
service1 -----> postgre <----- service3
^
|
service2
service1 ----->
service2 -----> pgbouncer -----> postgre
service3 ----->
pg是多進程結構,每增加一個session,pg會創建一個新建進程去處理會話,而pgbouncer能夠預先緩存pg的連接,當有連接請求進來的時候,直接分配pgbouncer與pg之間的空閑連接去執行,而不需要pg創建新的連接,以節省創建新的進程所消耗的時間和資源。
另外pgbouncer是使用libevent進行socket通信,效率高,開銷小,每個連接僅占用2kB內存。
pgbouncer支持三種連接池模式:
- session:這種模式和本質上直接與pg連接的方式基本一致。
- transaction:最常用的模式,一個連接的通道時分被事務所使用,當客戶端發出事務請求后,pgbouncer會在與數據庫之間的連接中找到一個連接是idle的去執行,當事務完成后,連接將重新被pgbouncer交給其他新事務去使用。
- sql:類似于autoconmiit,粒度較細,一條sql執行完就釋放連接,這條連接可能會被其他會話占用掉,這種方式比較節約資源,但破壞了事務的邏輯,需要評估應用系統中是否需要事務連接。
pgbouncer的使用
# 安裝
# centos7
yum install -y openssl openssl-devel libevent libevent-devel
wget //www.pgbouncer.org/downloads/files/1.20.0/pgbouncer-1.20.0.tar.gz
tar -zxvf pgbouncer-1.20.0.tar.gz
cd pgbouncer-1.20.0
./configure --prefix=/usr/local/
make && make install
# 配置
mkdir -p /etc/pgbouncer
vi /etc/pgbouncer/pgbouncer.ini
[databases]
template1 = host=10.150.57.9 port=5432 dbname=postgres user=postgres
[pgbouncer]
listen_port = 6432
listen_addr = 10.150.57.9
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
logfile = /etc/pgbouncer/pgbouncer.log
pidfile = /etc/pgbouncer/pgbouncer.pid
admin_users = postgres
stats_users = pgmon
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
vi /etc/pgbouncer/userlist.txt
"postgres" "Psswd@123"
"gaoyu" "Passwd@123"
# 啟動
pgbouncer -d /etc/pgbouncer/pgbouncer.ini
# 使用
psql -h 10.150.57.9 -p 6432 -U postgres template1