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 

参考引用