适用于一主一从,通过脚本管理故障转移,架构如下:
架构图.png
脚本大致思路如下:
流程图.png
start_server.sh
#!/bin/bash
single=0 #单机状态
if [ $# -eq 3 ]; then
ip_out=$1
ip_in=$2
ip_my=$3
else
ip_out="219.219.68.1" #网关 ip
ip_in="219.219.68.134" #另一台redis ip
ip_my="219.219.68.135" #本机ip
fi
Ping_Out(){
ping $ip_out -c 1 -w 1 >> ping.log
}
Ping_In(){
ping $ip_in -c 1 -w 1 >> ping.log
}
Ping_O(){
Ping_In
if [ $? -ne 0 ] ;then
test 1 -eq 0
else
redis-cli -h $ip_in -p 7000 PING 2>&1 | grep PONG
fi
}
Wait_DisConn(){
conn_status=0 #主从连接正常
until [ $conn_status -ne 0 ]
do
echo "主从连接正常,5s后重新检测"
sleep 5
Ping_O
conn_status=$?
done
echo "主从连接断开"
}
while true
do
#主从连接良好,不需要改变
Ping_O
if [ $? -eq 0 ] ;then
#等待断开
Wait_DisConn
single=0
fi
Ping_Out
net_status=$?
#与路由连接正常
if [ $net_status -eq 0 -a $single -eq 0 ] ;then
./redis_master.sh $ip_my
single=1
elif [ $net_status -ne 0 ] ;then
while true
do
ROLE=`redis-cli -h $ip_in -p 7000 ROLE 2>&1 | grep master`
if [ "$ROLE" ] ;then
./redis_backup.sh $ip_in
break
fi
sleep 5
done
fi
sleep 5 #每隔5s检测一次
done
redis_master.sh
#!/bin/bash
sleep 10
echo "[master]"
echo "Being master...."
echo "Run SLAVEOF cmd ..."
redis-cli -p 7000 SLAVEOF $1 7000
if [ $? -ne 0 ];then
echo "data rsync fail."
else
echo "data rsync OK."
fi
sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态
echo "Run SLAVEOF NO ONE cmd ..."
redis-cli -p 7000 SLAVEOF NO ONE
if [ $? -ne 0 ];then
echo "Run SLAVEOF NO ONE cmd fail."
else
echo "Run SLAVEOF NO ONE cmd OK."
fi
redis_backup.sh
#!/bin/bash
echo "[backup]"
echo "Being slave...."
sleep 10 #延迟10秒待数据被对方同步完成之后再切换主从角色
echo "Run SLAVEOF cmd ..."
redis-cli -p 7000 SLAVEOF $1 7000
网友评论