当使用Redis-Sentinel做冗余时,如何以不同方式使用VIP,我认为使用client-reconfig-script脚本是一种可行方法,让我们试试。


redis1 172.16.171.100/24
redis2 172.16.171.110/24

redis3 172.16.171.120/24

VIP 172.16.171.250/24



sentinel.conf配置:


port 26379
daemonize yes
logfile "/usr/local/redis/sentinel.log"
dir "/usr/local/redis/tmp"
sentinel monitor mymaster 172.16.171.120 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 60000
sentinel notification-script mymaster /usr/local/redis/notify.sh
sentinel client-reconfig-script mymaster /usr/local/redis/failover.sh
sentinel auth-pass mymaster skymobi



failover.sh


#!/bin/sh
_DEBUG="on"
DEBUGFILE=/usr/local/redis/sentinel_failover.log
VIP='172.16.171.250'
MASTERIP=${6}
MASK='24'
IFACE='eth0'
MYIP=$(ip -4 -o addr show dev ${IFACE}| grep -v secondary| awk '{split($4,a,"/");print a[1]}')

DEBUG () {
        if [ "$_DEBUG" = "on" ]; then
                $@
        fi
}

rm -rf ${DEBUGFILE}
set -e
DEBUG date >> ${DEBUGFILE}
DEBUG echo $@ >> ${DEBUGFILE}

DEBUG echo "Master: ${MASTERIP} My IP: ${MYIP}" >> ${DEBUGFILE}
if [ ${MASTERIP} == ${MYIP} ]; then
        if [ $(ip addr show ${IFACE} | grep ${VIP} | wc -l) -eq 0 ]; then
                /sbin/ip addr add ${VIP}/${MASK} dev ${IFACE}
                DEBUG echo "sudo /sbin/ip addr add ${VIP}/${MASK} dev ${IFACE}" >> ${DEBUGFILE}
                /usr/sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}
        fi
        exit 0
else
        if [ $(ip addr show ${IFACE} | grep ${VIP} | wc -l) -ne 0 ]; then
                /sbin/ip addr del ${VIP}/${MASK} dev ${IFACE}
                DEBUG echo "sudo /sbin/ip addr del ${VIP}/${MASK} dev ${IFACE}" >> ${DEBUGFILE}
        fi
        exit 0
fi
exit 1



结论

之后你可以尝试kill master而不是宕机来测试failover,我认为这是个比较好且容易实现的方法。 
sentinel down-after-milliseconds mymaster 3000 
大约在3秒左右会检测到redis的宕机。在更恶劣的环境,可以尝试减小这个值。