暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

分享一个 patroni vip 的回调脚本

原创 黄山谷 2025-07-03
398

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论