为开源数据库集群配置VIP(虚拟IP)的2种方案
本文详细介绍了两种为开源数据库集群配置VIP的方案:Patroni内置VIP管理和repmgr+Keepalived组合方案。Patroni方案通过配置文件直接集成VIP管理功能,包括VIP地址、接口设置和回调脚本;repmgr方案则需配合Keepalived实现VIP漂移,通过监控脚本和优先级机制确保VIP跟随主节点。两种方案各有优劣:Patroni配置更简洁但依赖特定版本功能,repmgr+K
·
为开源数据库集群配置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方案 | 需要额外组件 |
| 社区支持 | 非常活跃 | 稳定但相对传统 |
| 适用场景 | 新部署,云环境 | 传统部署,已有经验 |
推荐选择:
-
选择Patroni如果:
- 新项目或重新部署
- 希望更现代化的方案
- 需要与云原生工具集成
- 希望减少运维复杂度
-
选择repmgr+Keepalived如果:
- 已有repmgr使用经验
- 需要与传统运维体系集成
- 对Keepalived有深入理解
- 需要更细粒度的控制
最佳实践建议:
- 生产环境建议使用Patroni,它提供了更完整和现代的HA解决方案
- 无论选择哪种方案,都要确保有完善的监控和告警
- 定期进行故障转移测试
- VIP应该配合DNS使用,应用层使用域名连接数据库
两种方案都是经过大量生产验证的可靠方案,具体选择可以根据团队的技术栈和运维经验来决定。
更多推荐
所有评论(0)