You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker环境下PostgreSQL多节点数据同步与负载均衡协作实施步骤咨询

Docker环境下PostgreSQL多节点数据同步与负载均衡协作实施步骤咨询

兄弟我完全懂你这种业务增长后,想给数据库扩容却被各种概念绕晕的感觉!先给你掰明白核心逻辑:PostgreSQL原生的主从复制是解决「数据同步」的基础,而pgpool-II是用来做「负载均衡、读写分离、故障切换」这些上层协作调度的工具——两者是搭配使用的,不是二选一!下面给你一步步拆解Docker环境下的实操步骤,都是踩过坑的经验:

一、先搞定主从数据同步(基础中的基础,先让新节点和老库数据对齐)

你的现有Debian11上的PostgreSQL容器是主库,新机器上的空容器是从库,先把主库的数据同步到从库,再开启实时同步:

1. 配置主库(现有带数据的PostgreSQL容器)

  • 先进入主库容器:
    docker exec -it <你的主库容器名/ID> bash
    
  • 编辑PostgreSQL配置文件/var/lib/postgresql/data/postgresql.conf,修改以下关键参数:
    listen_addresses = '*'          # 允许其他节点访问主库
    wal_level = replica             # 开启WAL日志,用于主从复制
    max_wal_senders = 10            # 允许的最大复制连接数,根据你未来的节点数调整
    wal_keep_size = 1GB             # 保留足够的WAL日志,避免从库同步时跟不上(别用默认的16MB,容易坑)
    hot_standby = on                # 可选:允许主库接受只读查询,分担部分压力
    
  • 编辑/var/lib/postgresql/data/pg_hba.conf,给从库机器开复制权限:
    # 替换成你的从库机器IP/子网,比如从库IP是192.168.1.100,就写192.168.1.100/32
    host    replication     replicator     <从库机器IP/子网>      scram-sha-256
    
  • 创建专门用于复制的用户:
    CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD '你的强密码';
    
  • 重启主库容器让配置生效:
    docker restart <你的主库容器名/ID>
    

2. 给从库(新机器上的空容器)同步初始数据并配置实时复制

  • 先停掉从库容器:
    docker stop <你的从库容器名/ID>
    
  • 在从库机器上,用pg_basebackup把主库的全量数据拉到从库的挂载目录(比如你从库容器是-v /opt/postgres-slave/data:/var/lib/postgresql/data,就用这个目录):
    pg_basebackup -h <主库机器IP> -U replicator -D /opt/postgres-slave/data -P -X stream
    

    提示:如果从库机器没装pg_basebackup,可以临时启动一个PostgreSQL容器来执行这个命令,或者直接从主库容器里把数据目录打包拷贝过来(但pg_basebackup是官方推荐的方式)

  • 在从库的挂载目录下创建recovery.signal文件(PostgreSQL 12+用这个代替旧版的recovery.conf):
    touch /opt/postgres-slave/data/recovery.signal
    
  • 编辑从库的postgresql.conf,添加主从同步的配置:
    primary_conninfo = 'host=<主库机器IP> port=5432 user=replicator password=你的强密码 application_name=slave1'
    hot_standby = on                # 允许从库接受只读查询,方便后续负载均衡
    
  • 启动从库容器:
    docker start <你的从库容器名/ID>
    
  • 验证同步:在主库建个测试表插数据,比如CREATE TABLE test_sync (id int); INSERT INTO test_sync VALUES (1);,然后去从库查询SELECT * FROM test_sync;,能查到数据就说明同步成功了!也可以在主库执行SELECT * FROM pg_stat_replication;,能看到从库的连接信息。

二、部署pgpool-II实现多节点协作(负载均衡+读写分离)

当主从同步搞定后,就可以用pgpool-II把多个节点整合起来,对外提供统一的入口,自动分配请求、做故障切换:

1. 准备pgpool-II的配置文件

  • 先在宿主机创建一个目录存放pgpool的配置,比如/opt/pgpool/config
  • 创建pgpool.conf,关键参数如下(根据你的实际IP修改):
    listen_addresses = '*'
    port = 9999                     # pgpool对外的端口,客户端都连这个
    # 配置主库节点
    backend_hostname0 = '<主库机器IP>'
    backend_port0 = 5432
    backend_weight0 = 1             # 主库权重,读写请求会分配到这里(如果要读写分离可以调整)
    # 配置从库节点
    backend_hostname1 = '<从库机器IP>'
    backend_port1 = 5432
    backend_weight1 = 2             # 从库权重,只读请求会分配更多流量(数值越大分配越多)
    enable_pool_hba = on
    pool_passwd = '/etc/pgpool/pool_passwd'  # 存放用户密码加密文件的路径
    replication_mode = off          # 我们用的是PostgreSQL原生复制,所以关掉pgpool自己的复制
    load_balance_mode = on          # 开启负载均衡
    master_slave_mode = on          # 开启主从模式,自动识别主库
    master_slave_sub_mode = 'stream' # 用流复制模式
    
  • 创建pool_passwd文件,添加数据库用户的加密密码(比如postgres用户):
    # 如果没装pg_md5,可以用pgpool容器来生成
    docker run --rm pgpool/pgpool2 pg_md5 -u postgres 你的postgres密码 >> /opt/pgpool/config/pool_passwd
    

2. 启动pgpool-II容器

docker run -d --name pgpool -p 9999:9999 -v /opt/pgpool/config:/etc/pgpool pgpool/pgpool2

3. 验证负载均衡

用数据库客户端连接pgpool机器IP:9999,执行几次查询,然后在pgpool容器里执行SELECT * FROM pg_pool_nodes;,就能看到请求被分配到不同的节点了!如果主库挂了,pgpool会自动把写请求切换到新的主库(需要额外配置故障切换脚本,这个可以后续再优化)。

三、你之前踩坑的常见排查点

  • Docker网络问题:确保主从库的5432端口在宿主机是暴露的,或者用Docker overlay网络(如果是同一集群),否则从库连不上主库
  • WAL日志不足:如果主库的wal_keep_size设太小,从库同步时会找不到对应的WAL文件,导致同步失败,建议至少设1GB
  • 权限问题:pg_hba.conf一定要给从库IP开复制权限,否则replicator用户连不上主库
  • 挂载目录权限:从库的挂载目录权限要和PostgreSQL容器的用户一致(一般是UID=999的postgres用户),否则容器启动会报错

备注:内容来源于stack exchange,提问作者mmmhh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 12:14:33