为开源数据库集群配置VIP(虚拟IP),Patroni和repmgr确实是最主流的两种方案。它们提供了完整的HA解决方案,包括VIP管理。以下是基于这两个工具的详细配置方案:

一、Patroni + VIP 方案

Patroni内置VIP管理功能,通过REST API和回调脚本实现。

方案架构

Primary (Node1) : 192.168.1.10 + VIP 192.168.1.100
Replica (Node2) : 192.168.1.11
Replica (Node3) : 192.168.1.12

配置步骤

1. 安装依赖

# 所有节点安装
sudo apt-get install -y patroni etcd-client python3-psycopg2

2. Patroni配置文件 (patroni.yml)

scope: pg_cluster
name: node1  # 各节点分别改为node1、node2、node3

restapi:
  listen: 0.0.0.0:8008
  connect_address: 192.168.1.10:8008  # 各节点使用自己的IP

etcd:
  hosts: ["192.168.1.10:2379", "192.168.1.11:2379", "192.168.1.12:2379"]

bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
    postgresql:
      use_pg_rewind: true
      parameters:
        max_connections: 100
        shared_buffers: 128MB

  initdb:
  - encoding: UTF8
  - data-checksums

  pg_hba:
  - host replication replicator 192.168.1.0/24 md5
  - host all all 0.0.0.0/0 md5

postgresql:
  listen: 0.0.0.0:5432
  connect_address: 192.168.1.10:5432  # 各节点使用自己的IP
  data_dir: /var/lib/postgresql/14/main
  pgpass: /tmp/pgpass
  authentication:
    replication:
      username: replicator
      password: rep_password
    superuser:
      username: postgres
      password: postgres_password

  parameters:
    logging_collector: true

# VIP配置 - 关键部分
tags:
  vip: 192.168.1.100/24
  vip_interface: eth0
  vip_skip_check: false
  nofailover: false

3. VIP管理脚本 (/etc/patroni/vip_manager.sh)

#!/bin/bash

VIP=$1
INTERFACE=$2
ACTION=$3

case $ACTION in
    on_start)
        # 当成为主节点时添加VIP
        ip addr add $VIP dev $INTERFACE
        ;;
    on_stop)
        # 当不再是主节点时移除VIP
        ip addr del $VIP dev $INTERFACE
        ;;
    on_role_change)
        # 角色变更时的处理
        NEW_ROLE=$4
        if [ "$NEW_ROLE" = "master" ]; then
            ip addr add $VIP dev $INTERFACE 2>/dev/null || true
        else
            ip addr del $VIP dev $INTERFACE 2>/dev/null || true
        fi
        ;;
esac

4. 配置systemd服务

# /etc/systemd/system/patroni.service
[Unit]
Description=Runners to orchestrate a high-availability PostgreSQL
After=syslog.target network.target

[Service]
Type=simple
User=postgres
Group=postgres
ExecStart=/usr/bin/patroni /etc/patroni/patroni.yml
KillMode=process
TimeoutSec=30
Restart=no

[Install]
WantedBy=multi-user.target

5. 启动集群

sudo systemctl daemon-reload
# 从第一个节点开始启动
sudo systemctl start patroni

二、repmgr + Keepalived 方案

repmgr本身不直接管理VIP,通常与Keepalived结合使用。

方案架构

Primary + Keepalived MASTER : 192.168.1.10 + VIP 192.168.1.100
Replica + Keepalived BACKUP : 192.168.1.11

配置步骤

1. 安装软件包

# 所有节点安装
sudo apt-get install -y postgresql-14 repmgrd keepalived

2. 配置repmgr (主节点)

# /etc/repmgr.conf
node_id=1
node_name=node1
conninfo='host=192.168.1.10 user=repmgr dbname=repmgr connect_timeout=2'
data_directory='/var/lib/postgresql/14/main'

log_level=INFO
log_file='/var/log/postgresql/repmgr.log'

failover=automatic
promote_command='repmgr standby promote -f /etc/repmgr.conf'
follow_command='repmgr standby follow -f /etc/repmgr.conf'

# 监控设置
monitor_interval_secs=10
monitor_history_minutes=90

3. 配置repmgrd服务

# /etc/default/repmgrd
REPMGRD_ENABLED=yes
REPMGRD_CONF="/etc/repmgr.conf"
REPMGRD_OPTS="--daemonize=false"

4. 配置Keepalived (主节点配置)

# /etc/keepalived/keepalived.conf
global_defs {
    router_id pg_cluster
}

vrrp_script chk_pg_master {
    script "/usr/bin/pg_isready -h 192.168.1.10 -p 5432"
    interval 2
    fall 2
    rise 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    
    authentication {
        auth_type PASS
        auth_pass postgres
    }
    
    virtual_ipaddress {
        192.168.1.100/24 dev eth0
    }
    
    track_script {
        chk_pg_master
    }
    
    # 当状态变更时执行脚本
    notify_master "/etc/keepalived/notify_master.sh"
    notify_backup "/etc/keepalived/notify_backup.sh"
    notify_fault "/etc/keepalived/notify_fault.sh"
}

5. Keepalived状态变更脚本

# /etc/keepalived/notify_master.sh
#!/bin/bash
# 成为主节点时的处理
LOGFILE="/var/log/keepalived/state.log"
echo "`date` Becoming MASTER" >> $LOGFILE

# 可以在这里触发repmgr的强制切换
# sudo -u postgres repmgr standby promote -f /etc/repmgr.conf

6. 从节点Keepalived配置

# /etc/keepalived/keepalived.conf (从节点)
global_defs {
    router_id pg_cluster_node2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90  # 优先级低于主节点
    advert_int 1
    
    authentication {
        auth_type PASS
        auth_pass postgres
    }
    
    virtual_ipaddress {
        192.168.1.100/24 dev eth0
    }
    
    track_script {
        chk_pg_master
    }
}

三、两种方案对比与选择建议

特性 Patroni方案 repmgr+Keepalived方案
VIP管理 内置支持,简单配置 需配合Keepalived
架构复杂度 较低,一体化方案 较高,多组件配合
学习曲线 中等,需理解DCS概念 较高,需掌握多个工具
功能完整性 完整HA方案 需要额外组件
社区支持 非常活跃 稳定但相对传统
适用场景 新部署,云环境 传统部署,已有经验

推荐选择:

  1. 选择Patroni如果

    • 新项目或重新部署
    • 希望更现代化的方案
    • 需要与云原生工具集成
    • 希望减少运维复杂度
  2. 选择repmgr+Keepalived如果

    • 已有repmgr使用经验
    • 需要与传统运维体系集成
    • 对Keepalived有深入理解
    • 需要更细粒度的控制

最佳实践建议:

  • 生产环境建议使用Patroni,它提供了更完整和现代的HA解决方案
  • 无论选择哪种方案,都要确保有完善的监控和告警
  • 定期进行故障转移测试
  • VIP应该配合DNS使用,应用层使用域名连接数据库

两种方案都是经过大量生产验证的可靠方案,具体选择可以根据团队的技术栈和运维经验来决定。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐