PG连接池工具PgBouncer
前言
Postgres 采用在每个连接上生成一个新进程的方式工作。而 MySQL 则在每个连接上生成一个新线程。因此,Postgres 提供了更好的隔离性,例如,一个无效的内存访问错误只会导致单个进程崩溃,而不是整个数据库服务器。另一方面,进程模型消耗更多资源。因此,在部署 Postgres 时建议通过连接池(如 PgBouncer 或 pgcat)代理连接。
docker-compose
version: '3.6'
services:
db:
container_name: postgres
image: postgres:13.15-bookworm
privileged: true
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
#- POSTGRES_DB: demo
- TZ=Asia/Shanghai
volumes:
- /data/dbs/pg_data:/var/lib/postgresql/data:rw
networks:
- pgsql_net
restart: unless-stopped
healthcheck:
test: [ "CMD-SHELL", "pg_isready -d postgres" ]
interval: 30s
timeout: 10s
retries: 5
pgbouncer:
image: edoburu/pgbouncer:1.22.1-p0
networks:
- pgsql_net
environment:
- DB_USER=postgres
- DB_PASSWORD=postgres
- DB_HOST=db
- DB_NAME=postgres
- POOL_MODE=transaction
- ADMIN_USERS=postgres
- MAX_DB_CONNECTIONS=100
- DEFAULT_POOL_SIZE=40
- MAX_CLIENT_CONN=200
- TZ=Asia/Shanghai
#- AUTH_TYPE=scram-sha-256
ports:
- "8849:5432"
depends_on:
- db
networks:
pgsql_net:
创建外部容器网络
docker network create --driver=bridge --subnet 10.88.1.0/25 --gateway 10.88.1.1 --opt "com.docker.network.bridge.name"="br0" pgsql-net
服务启动
# docker-compose up -d