温馨提示×

Debian与PostgreSQL集群部署方案

小樊
33
2025-12-30 21:26:28
栏目: 云计算

Debian 上的 PostgreSQL 集群部署方案

一、方案总览与适用场景

  • 流复制 + 自动故障转移(Patroni + etcd/consul):适合需要自动主从切换多节点统一管理的生产环境。Patroni负责实例生命周期与故障转移,DCS(如etcd/consul)保存集群状态与锁,支持读写分离同步/异步复制策略。对于跨机房/跨云,可结合HAProxy/Keepalived做入口路由与健康检查。
  • 流复制 + 手动切换(repmgr):适合倾向轻量可控、对自动切换要求不高的团队。repmgr提供节点注册、故障检测、切换与克隆能力,部署与运维简单,易于纳入现有体系。
  • 分布式横向扩展(Citus):适合多租户 SaaS实时分析等需要把查询分散到多节点的场景。Citus是PostgreSQL的扩展(extension),通过协调节点与数据分片实现并行查询与扩展

二、方案一 流复制 + Patroni 自动故障转移(推荐)

  • 组件与拓扑
    • 数据库节点:建议至少3节点(奇数更易达成一致性),运行PostgreSQL流复制。
    • DCS:etcd/consul 3节点(跨机架/可用区部署),保存集群状态与选主信息。
    • 入口层:HAProxy/Keepalived(可选VIP),对外暴露读写端口只读端口,实现读写分离与健康检查。
  • 部署步骤(Debian)
    1. 安装 PostgreSQL 与 Patroni
      • apt update && apt install -y postgresql postgresql-contrib
      • apt install -y python3-pip && pip3 install patroni[etcd]
    2. 配置 DCS(以 etcd 为例)
      • 在3台 etcd 节点部署集群(示例:/etc/default/etcd),确保 2379/2380 互通。
    3. 配置 Patroni(/etc/patroni.yml 示例)
      • scope: postgres
      • namespace: /db/
      • name: pg1
      • restapi: {listen: 0.0.0.0:8008, connect_address: 192.168.1.11:8008}
      • etcd: {host: 192.168.1.21:2379}
      • bootstrap:
        • dcs: {ttl: 30, loop_wait: 10, retry_timeout: 10, maximum_lag_on_failover: 1048576, postgresql: {use_pg_rewind: true, use_slots: true}}
        • initdb: [{encoding: UTF8, locale: en_US.UTF-8}]
        • pg_hba: [{type: host, database: replication, user: replicator, address: 192.168.1.0/24, method: md5}]
      • postgresql:
        • parameters:
          • wal_level: replica
          • max_wal_senders: 10
          • wal_keep_segments: 64
          • hot_standby: on
          • max_connections: 200
          • effective_cache_size: 25%
    4. 初始化与启动
      • 在第一个节点执行:patroni /etc/patroni.yml(引导集群)
      • 其余节点启动后自动加入;通过 http://节点IP:8008 查看成员状态。
    5. 入口与读写分离(HAProxy 示例)
      • listen postgres_write
        • bind *:5432
        • mode tcp
        • option httpchk GET /master
        • server pg1 192.168.1.11:5432 check port 8008 inter 3s fall 3 rise 2
        • server pg2 192.168.1.12:5432 check port 8008 backup
      • listen postgres_read
        • bind *:5433
        • mode tcp
        • balance roundrobin
        • server pg1 192.168.1.11:5432 check port 8008
        • server pg2 192.168.1.12:5432 check port 8008
        • server pg3 192.168.1.13:5432 check port 8008
  • 关键要点
    • 复制与一致性:按需配置 synchronous_standby_namessynchronous_commit(如 on/remote_write),在性能与零丢失间权衡。
    • 回放加速:启用 use_pg_rewind: true,缩短故障后重建时间。
    • 监控与告警:对接 Prometheus + Grafana(Patroni/etcd 均有指标端点),对复制延迟、连接数、WAL堆积设置阈值告警。

三、方案二 流复制 + repmgr 手动/半自动切换

  • 适用场景:希望简化依赖(无需DCS),由运维在故障时手动执行切换或脚本化切换。
  • 部署步骤(Debian)
    1. 安装 PostgreSQL 与 repmgr(以 PostgreSQL 14 为例)
      • apt-get install -y postgresql-14 postgresql-14-repmgr rsync
    2. 配置 SSH 免密与 sudo 权限
      • 三节点间 postgres 用户互相免密;visudo 授权 postgres 用户执行 systemctl 动作。
    3. 主库创建复制用户与 repmgr 库
      • sudo -u postgres psql -c “CREATE ROLE replicator WITH LOGIN REPLICATION PASSWORD ‘repl_pass’;”
      • sudo -u postgres psql -c “CREATE DATABASE repmgr OWNER repmgr;”
    4. 配置 repmgr(/etc/repmgr.conf)
      • node_id=1
      • node_name=‘node1’
      • conninfo=‘host=192.168.1.11 user=repmgr dbname=repmgr password=repmgr_pass’
      • data_directory=‘/var/lib/postgresql/14/main’
      • pg_basebackup_options=‘–wal-method=stream’
    5. 注册主库与备库
      • 主库:repmgr -f /etc/repmgr.conf primary register
      • 备库:pg_basebackup -h 主库 -U replicator -D /var/lib/postgresql/14/main -P -X stream
      • 备库:repmgr -f /etc/repmgr.conf standby register
    6. 切换与故障处理
      • 手动切换:repmgr standby switchover -f /etc/repmgr.conf
      • 故障提升:repmgr standby promote -f /etc/repmgr.conf
  • 关键要点
    • 依赖 rsyncSSH 做基础备份与节点克隆,网络与权限需严格收敛。
    • 建议配合 虚拟IP/HAProxy 做入口漂移,减少应用改动。

四、方案三 分布式横向扩展 Citus(多租户/实时分析)

  • 适用场景:需要跨节点并行查询大表分片协调节点路由的业务。
  • 部署步骤(Debian)
    1. 安装 PostgreSQL 14 与 Citus 扩展
      • curl https://install.citusdata.com/community/deb.sh | sudo bash
      • apt-get -y install postgresql-14-citus-10.2
    2. 初始化协调节点
      • sudo su - postgres
      • echo “shared_preload_libraries = ‘citus’” >> $PGDATA/postgresql.conf
      • pg_ctl -D $PGDATA -o “-p 5432” start
      • psql -p 5432 -c “CREATE EXTENSION citus;”
    3. 添加工作节点
      • psql -p 5432 -c “SELECT * from citus_add_node(‘192.168.1.12’, 5432);”
      • psql -p 5432 -c “SELECT * from citus_add_node(‘192.168.1.13’, 5432);”
    4. 验证
      • psql -p 5432 -c “SELECT citus_version();”
  • 关键要点
    • Citus 是 PostgreSQL 扩展,通过协调节点分发查询到分片节点,适合多租户实时分析;开发/测试可用 Docker 快速体验,生产需部署多节点集群。

五、备份恢复与日常运维

  • 备份策略
    • 物理备份:基于 WAL 归档pg_basebackup 全量 + 持续归档,支持时间点恢复(PITR)。
    • 逻辑备份:使用 pg_dump/pg_dumpall对象级备份与迁移(不替代PITR)。
  • 恢复演练
    • 定期在隔离环境演练 PITR备库重建,验证 WAL保留恢复目标时间 是否满足 RPO/RTO
  • 监控与日志
    • 关注 复制延迟WAL堆积连接数/锁慢查询;结合 Prometheus/Grafana 与日志采集,建立阈值告警容量水位预警。

0