温馨提示×

PostgreSQL在Ubuntu上的集群搭建方案

小樊
66
2025-09-23 10:54:35
栏目: 云计算

PostgreSQL在Ubuntu上的集群搭建方案

一、基础环境准备

在Ubuntu系统上搭建PostgreSQL集群前,需完成以下基础配置:

  1. 安装PostgreSQL:在所有节点执行sudo apt update && sudo apt install -y postgresql postgresql-contrib,安装PostgreSQL数据库及扩展工具。
  2. 安装repmgr工具:repmgr是PostgreSQL集群管理的核心工具,用于主从复制、故障检测与自动切换。执行以下命令安装:
    sudo apt install -y libcurl4-openssl-dev libjson-c-dev flex libselinux1-dev libzstd-dev liblz4-dev libxslt1-dev libxml2-dev libpam0g-dev libssl-dev libkrb5-dev zlib1g-dev libreadline-dev
    wget https://www.repmgr.org/download/repmgr-5.5.0.tar.gz
    tar xvf repmgr-5.5.0.tar.gz
    cd repmgr-5.5.0/
    ./configure && make && sudo make install
    
  3. 配置SSH免密登录:在主节点生成SSH密钥(ssh-keygen),并将公钥复制到所有从节点(ssh-copy-id <从节点IP>),确保节点间可通过SSH无密码通信。
  4. 规划集群架构:常见架构包括“1主2备”(基础高可用)、“1主2备+Pgpool”(负载均衡+故障转移)。节点IP需固定,避免变动。

二、基于repmgr的主从集群搭建(基础高可用)

1. 主节点配置

  • 修改PostgreSQL配置文件/etc/postgresql/<版本>/main/postgresql.conf):
    wal_level = replica                # 启用WAL日志(支持复制)
    max_wal_senders = 10               # 允许的最大WAL发送器数量(至少比备节点数多1)
    max_replication_slots = 10         # 最大复制槽数(与备节点数一致)
    hot_standby = on                   # 允许备节点以只读模式运行
    
  • 修改pg_hba.conf文件/etc/postgresql/<版本>/main/pg_hba.conf):
    添加以下规则,允许从节点连接主节点:
    host    replication     repmgr    <从节点IP>/32    md5
    host    repmgr          repmgr    192.168.1.0/24    trust  # 集群内部节点信任(生产环境建议用md5)
    
  • 重启PostgreSQL服务sudo systemctl restart postgresql
  • 创建repmgr用户与数据库
    sudo -u postgres psql -c "CREATE USER repmgr WITH SUPERUSER REPLICATION PASSWORD 'repmgr123';"
    sudo -u postgres createdb -O repmgr repmgr;
    ALTER USER repmgr SET search_path TO repmgr, "$user", public;
    

2. 从节点配置

  • 停止PostgreSQL服务sudo systemctl stop postgresql
  • 清空数据目录(若为全新节点):sudo rm -rf /var/lib/postgresql/<版本>/main/*
  • 克隆主节点数据:使用pg_basebackup从主节点同步数据:
    sudo -u postgres pg_basebackup -h <主节点IP> -D /var/lib/postgresql/<版本>/main -U repmgr -P --wal-method=stream
    
  • 创建repmgr.conf文件/etc/repmgr.conf):
    node_id=2                          # 从节点ID(主节点为1)
    node_name='node2'                  # 节点名称(需唯一)
    conninfo='host=<从节点IP> user=repmgr dbname=repmgr connect_timeout=2'
    data_directory='/var/lib/postgresql/<版本>/main'
    

3. 注册与启动集群

  • 主节点注册:在主节点执行repmgr -f /etc/repmgr.conf primary register,将主节点加入集群。
  • 从节点注册:在从节点执行repmgr -f /etc/repmgr.conf standby register,将从节点注册到主节点。
  • 验证集群状态:在任意节点执行repmgr -f /etc/repmgr.conf cluster show,查看集群节点状态(主节点状态为“primary”,从节点为“standby”)。
  • 启动repmgrd守护进程:在所有节点执行repmgrd -f /etc/repmgr.conf --daemonize,监控节点状态并自动处理故障。

三、集成Pgpool实现负载均衡与自动故障转移

Pgpool是一个PostgreSQL中间件,提供连接池、负载均衡、自动故障转移功能,适用于生产级高可用场景。

1. 安装Pgpool

在独立节点(或主节点)安装Pgpool:

sudo apt install -y pgpool2

2. 配置Pgpool

  • 修改Pgpool配置文件/etc/pgpool2/pgpool.conf):
    listen_addresses = '*'             # 监听所有IP
    backend_hostname0 = '<主节点IP>'    # 主节点IP
    backend_port0 = 5432
    backend_weight0 = 1
    backend_hostname1 = '<备节点1IP>'   # 备节点1IP
    backend_port1 = 5432
    backend_weight1 = 1
    backend_hostname2 = '<备节点2IP>'   # 备节点2IP
    backend_port2 = 5432
    backend_weight2 = 1
    sr_check_period = 10               # 主节点状态检查间隔(秒)
    failover_command = '/etc/pgpool2/failover.sh %d %H %P'  # 故障转移脚本
    load_balance_mode = on             # 开启负载均衡
    
  • 创建故障转移脚本/etc/pgpool2/failover.sh):
    编写脚本实现主节点故障时自动晋升备节点(需根据环境调整路径):
    #!/bin/bash
    FAILED_NODE=$1
    NEW_PRIMARY=$2
    PGDATA=$3
    # 停止故障节点的Pgpool服务
    ssh postgres@$FAILED_NODE "systemctl stop pgpool"
    # 晋升备节点为主节点
    ssh postgres@$NEW_PRIMARY "pg_ctl promote -D $PGDATA"
    # 重新配置Pgpool连接
    ssh postgres@$NEW_PRIMARY "pgpool -n -f /etc/pgpool2/pgpool.conf"
    

3. 启动Pgpool

sudo systemctl start pgpool2
sudo systemctl enable pgpool2

4. 验证负载均衡

通过Pgpool节点连接数据库(psql -h <PgpoolIP> -U postgres),执行查询时,Pgpool会自动将读请求分发到备节点,写请求发送到主节点。

四、注意事项

  1. 数据一致性:确保主从节点的wal_levelarchive_mode等参数一致,避免数据丢失。
  2. 安全配置:生产环境中,pg_hba.conf应使用md5scram-sha-256认证,避免明文密码传输。
  3. 监控与告警:使用pg_stat_replication视图监控复制状态,结合Prometheus+Granafa搭建监控告警体系。
  4. 备份策略:定期备份主节点数据(如使用pg_dumpbarman),避免集群完全故障时数据丢失。

0