部署 PostgreSQL
自托管 Postgres,Docker、调优、备份和高可用。
平台高级
为什么
自托管 Postgres 完全控制配置、扩展和调优。Docker + pgBackRest + repmgr 提供 HA、PITR 和扩展支持,托管不一定有。
平台即服务采用率 2024 年增长 24%,团队从虚拟机管理转向 git push 部署。the cloud infrastructure market reached $330B in 2024, growing 22% year-over-year (Synergy Research),PaaS 层捕获了大多数新工作负载。
何时使用
自定义扩展、大规模成本优化和合规用自托管 Postgres。简单优先托管(RDS、Supabase)。
如何做
1. Docker — postgres:16 镜像加 volume 存数据
2. 配置 — postgresql.conf 调优(shared_buffers、work_mem)
3. 初始化 — init.sql 放 docker-entrypoint-initdb.d
4. 备份 — pg_dump 或 pgBackRest 增量
5. HA — repmgr 或 Patroni 复制 + 故障转移
6. 监控 — pg_stat_statements、pg_stat_activity
7. 扩展 — CREATE EXTENSION 装 pgvector、postgis
示例
# docker-compose.yml
services:
postgres:
image: postgres:16
environment:
POSTGRES_DB: mydb
POSTGRES_PASSWORD: secret
volumes:
- pgdata:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
command: >
postgres
-c shared_buffers=256MB
-c work_mem=16MB
-c max_connections=200
volumes:
pgdata:
# 备份
docker exec mydb pg_dump -U postgres mydb | gzip > backup.sql.gz
# 恢复
gunzip < backup.sql.gz | docker exec -i mydb psql -U postgres mydb
常见问题
- ⚠shared_buffers 过低 — 默认 128MB,生产设 RAM 25%
- ⚠无备份 — pg_dump 不够,用 pgBackRest 做 PITR
- ⚠环境间配置漂移 — 使用基础设施即代码(Terraform/Pulumi)保持 dev/staging/prod 一致
最佳实践
- ✓shared_buffers 设 RAM 25% — 最大单项性能提升
- ✓备份用 pgBackRest — 增量、压缩、PITR
- ✓设置健康检查和优雅关闭 — 处理 SIGTERM 以在退出前排空进行中的请求