patroni 配置
vim /home/postgres/app/patroni/patroni_config.yml
postgresql:
callbacks:
on_start: /home/postgres/app/patroni/patroni_callback.sh
on_stop: /home/postgres/app/patroni/patroni_callback.sh
on_role_change: /home/postgres/app/patroni/patroni_callback.sh
为 postgres 用户添加 sudo 权限
sudo visudo
#添加以下内容,允许 postgres 用户无需密码即可运行 ip 命令
postgres ALL=(ALL) NOPASSWD: /sbin/ip
callback 脚本内容
vim /home/postgres/app/patroni/patroni_callback.sh
#!/bin/bash
# 设置 PATH 环境变量,确保包含必要的命令路径
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 定义只读变量
readonly cb_name=$1
readonly role=$2
readonly scope=$3
# 定义 VIP 配置
VIP=192.168.2.241
VIPBRD=192.168.2.255
VIPNETMASK=255.255.255.0
VIPNETMASKBIT=24
VIPDEV=ens160
VIPLABEL=1
# 打印用法说明
function usage() {
echo "Usage: $0 <on_start|on_stop|on_role_change> <role> <scope>"
exit 1
}
# 添加 VIP
function addvip() {
# 确保使用绝对路径调用 date
echo "$(/bin/date +%Y-%m-%d\ %H:%M:%S,%3N) INFO: /sbin/ip addr add ${VIP}/${VIPNETMASKBIT} brd ${VIPBRD} dev ${VIPDEV} label ${VIPDEV}:${VIPLABEL}"
# 移除 sudo(如果需要特权权限,请确保用户有权限)
sudo /sbin/ip addr add ${VIP}/${VIPNETMASKBIT} brd ${VIPBRD} dev ${VIPDEV} label ${VIPDEV}:${VIPLABEL}
# 检查 arping 是否存在
if command -v /usr/sbin/arping >/dev/null 2>&1; then
/usr/sbin/arping -q -A -c 1 -I ${VIPDEV}:${VIPLABEL} ${VIP}
else
echo "$(/bin/date +%Y-%m-%d\ %H:%M:%S,%3N) WARNING: arping not found, skipping..."
fi
}
# 删除 VIP
function delvip() {
# 确保使用绝对路径调用 date
echo "$(/bin/date +%Y-%m-%d\ %H:%M:%S,%3N) INFO: /sbin/ip addr del ${VIP}/${VIPNETMASKBIT} dev ${VIPDEV} label ${VIPDEV}:${VIPLABEL}"
# 移除 sudo
sudo /sbin/ip addr del ${VIP}/${VIPNETMASKBIT} dev ${VIPDEV} label ${VIPDEV}:${VIPLABEL}
# 检查 arping 是否存在
if command -v /usr/sbin/arping >/dev/null 2>&1; then
/usr/sbin/arping -q -A -c 1 -I ${VIPDEV} ${VIP}
else
echo "$(/bin/date +%Y-%m-%d\ %H:%M:%S,%3N) WARNING: arping not found, skipping..."
fi
}
# 打印日志信息
echo "$(/bin/date +%Y-%m-%d\ %H:%M:%S,%3N) WARNING: patroni callback $cb_name $role $scope"
# 根据回调名称执行相应操作
case $cb_name in
on_stop)
delvip
;;
on_start)
;;
on_role_change)
if [[ $role == 'master' ]]; then
addvip
elif [[ $role == 'slave' ]] || [[ $role == 'replica' ]] || [[ $role == 'logical' ]]; then
delvip
fi
;;
*)
usage
;;
esac
chmod +x /home/postgres/app/patroni/patroni_callback.sh
可以看到切换时,脚本会在主节点上增加vip


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




