Patroni集群中vip-manager无法启用虚拟IP的问题求助
问题描述
安装vip-manager用于管理PostgreSQL Patroni集群的可迁移虚拟IP,但vip-manager无法启用虚拟IP地址。
环境信息
- RHEL 9.3
- etcd版本:3.4.31
- patroni版本:3.0.4
- vip-manager版本:2.3.0
vip-manager配置
interval: 1000 trigger-key: "/pg_cluster/postgres/leader" trigger-value: "sp-smaxpsql1" ip: 10.164.20.180 # the virtual ip address to manage netmask: 24 # netmask for the virtual ip interface: ens33 #interface to which the virtual ip will be added hosting-type: basic # possible values: basic, or hetzner. dcs-type: etcd # etcd or consul dcs-endpoints: - http://10.164.20.177:2379 - http://10.164.20.178:2379 - http://10.164.20.179:2379 retry-num: 2 retry-after: 250 #in milliseconds verbose: true
etcd配置
ETCD_LISTEN_PEER_URLS="http://10.164.20.177:2380" ETCD_LISTEN_CLIENT_URLS="http://10.164.20.177:2379,http://localhost:2379" ETCD_NAME="sp-smaxpsql1" [Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.164.20.177:2380" ETCD_ADVERTISE_CLIENT_URLS="http://10.164.20.177:2379" ETCD_INITIAL_CLUSTER="sp-smaxpsql1=http://10.164.20.177:2380,sp-smaxpsql2=http://10.164.20.178:2380,sp-smaxpsql3=http://10.164.20.179:2380" ETCD_INITIAL_CLUSTER_TOKEN="postgresql-etcd-cluster" ETCD_INITIAL_CLUSTER_STATE="new" ETCD_DATA_DIR="/var/lib/etcd"
Patroni配置
scope: postgres namespace: /pg_cluster/ name: sp-smaxpsql1 restapi: listen: sp-smaxpsql1:8008 connect_address: sp-smaxpsql1:8008 etcd: hosts: 10.164.20.177:2379, 10.164.20.178:2379, 10.164.20.179:2379 bootstrap: dcs: ttl: 30 loop_wait: 10 retry_timeout: 10 maximum_lag_on_failover: 1048576 maximum_lag_on_syncnode: 15000000 synchronous_mode: false postgresql: use_pg_rewind: true use_slots: true parameters: shared_buffers: 8GB work_mem: 13981kB maintenance_work_mem: 2GB max_worker_processes: 16 wal_buffers: 64MB max_wal_size: 2GB min_wal_size: 8GB effective_cache_size: 24GB fsync: on checkpoint_completion_target: 0.9 log_rotation_size: 100MB listen_addresses: "*" max_connections: 2000 temp_buffers: 4MB default_statistics_target: 100 random_page_cost: 1.1 effective_io_concurrency: 200 ssl: true ssl_cert_file: /var/lib/pgsql/12/data/server.crt ssl_key_file: /var/lib/pgsql/12/data/server.key initdb: - encoding: UTF8 - data-checksums pg_hba: - host replication replicator 127.0.0.1/32 md5 - host replication replicator 10.164.20.177/32 md5 - host replication replicator 10.164.20.178/32 md5 - host replication replicator 10.164.20.179/32 md5 - host all all 0.0.0.0/0 md5 users: admin: password: admin options: - createrole - createdb postgresql: listen: sp-smaxpsql1:5432 connect_address: sp-smaxpsql1:5432 data_dir: /var/lib/pgsql/12/data bin_dir: /usr/pgsql-12/bin pgpass: /tmp/pgpass authentication: replication: username: replicator password: <*********> superuser: username: postgres password: <*********> rewind: username: pgrewind password: <*********> tags: nofailover: false noloadbalance: false clonefrom: false nosync: true
主节点vip-manager日志
Mar 27 15:24:26 sp-smaxpsql1 vip-manager[68389]: 2024/03/27 15:24:26 IP address 10.164.20.180/24 state is false, desired false Mar 27 15:24:36 sp-smaxpsql1 vip-manager[68389]: 2024/03/27 15:24:36 IP address 10.164.20.180/24 state is false, desired false Mar 27 15:24:46 sp-smaxpsql1 vip-manager[68389]: 2024/03/27 15:24:46 IP address 10.164.20.180/24 state is false, desired false Mar 27 15:24:56 sp-smaxpsql1 vip-manager[68389]: 2024/03/27 15:24:56 IP address 10.164.20.180/24 state is false, desired false Mar 27 15:25:06 sp-smaxpsql1 vip-manager[68389]: 2024/03/27 15:25:06 IP address 10.164.20.180/24 state is false, desired false Mar 27 15:25:16 sp-smaxpsql1 vip-manager[68389]: 2024/03/27 15:25:16 IP address 10.164.20.180/24 state is false, desired false Mar 27 15:25:26 sp-smaxpsql1 vip-manager[68389]: 2024/03/27 15:25:26 IP address 10.164.20.180/24 state is false, desired false Mar 27 15:25:36 sp-smaxpsql1 vip-manager[68389]: 2024/03/27 15:25:36 IP address 10.164.20.180/24 state is false, desired false Mar 27 15:25:46 sp-smaxpsql1 vip-manager[68389]: 2024/03/27 15:25:46 IP address 10.164.20.180/24 state is false, desired false
解决方案
从日志看,vip-manager认为当前节点不需要启用VIP(desired false),核心原因是etcd中trigger-key对应的值和trigger-value不匹配,或者vip-manager无法正确读取etcd中的键值。按以下步骤排查:
- 验证etcd中的leader键值
在任意节点执行etcdctl命令查看/pg_cluster/postgres/leader的值:
ETCDCTL_API=3 etcdctl --endpoints=http://10.164.20.177:2379,http://10.164.20.178:2379,http://10.164.20.179:2379 get /pg_cluster/postgres/leader
如果返回的值不是sp-smaxpsql1,说明当前主节点不是sp-smaxpsql1,或者Patroni没有正确更新etcd中的leader键。先确认Patroni集群的主节点状态:
patronictl -c /path/to/patroni.yml list
确保sp-smaxpsql1显示为Leader。
- 修正vip-manager的trigger配置
- 如果etcd中leader键的值是节点的IP而非主机名,把vip-manager的
trigger-value改成对应IP(比如10.164.20.177) - 检查
trigger-key路径是否和Patroni配置一致:Patroni的namespace是/pg_cluster/,scope是postgres,所以leader键的正确路径应该是/pg_cluster/postgres/leader,当前配置是对的,但要确认etcd中确实存在这个键。
- 检查vip-manager的权限
vip-manager需要root权限才能添加/删除虚拟IP,确保服务是以root身份运行:
ps aux | grep vip-manager
如果不是root,修改systemd服务配置(通常在/etc/systemd/system/vip-manager.service),添加User=root,然后重启服务:
systemctl daemon-reload systemctl restart vip-manager
- 手动测试添加VIP
在主节点手动执行添加VIP的命令,验证网络接口和IP是否可用:
ip addr add 10.164.20.180/24 dev ens33
执行后用ip addr show ens33检查是否添加成功,如果失败,可能是IP已被占用,或者网络接口名称错误(比如实际接口是ens3而非ens33,用ip link确认)。
- 验证vip-manager与etcd的连接
在vip-manager所在节点测试etcd连接:
ETCDCTL_API=3 etcdctl --endpoints=http://10.164.20.177:2379 endpoint health
如果连接失败,检查etcd服务是否运行,防火墙是否开放2379端口,或者etcd配置是否限制了客户端连接。
- 重启vip-manager服务
修改配置后,重启vip-manager并查看日志:
systemctl restart vip-manager journalctl -u vip-manager -f
观察日志中是否出现desired true的记录,此时VIP应该会被自动添加。
内容的提问来源于stack exchange,提问作者Murat Suluhan
相关产品推荐
相关产品推荐

