2021年1月21日 星期四

redis master slave failover

Redis master slave模式的只有二台server下 fail over作法
1. 指定一台redis server為 master,另一台為slave 
2. 在slave server設定crontab執行以下shell script 
3. 執行邏輯是 
a. 當master,及slave都回PONG,那就設定master server為master, slave server為slave
b. 當只有slave回PONG,那就將slave server改為master, 並將hosts 的 lan.redis IP改為slave IP
c. 當只有master回PONG, 將hosts 的lan.redis IP改為master
d. 都連不上..., email通知?
也就 master reids修復後,就符合條件 a或 c; 
master redis faile時,則符合條件 b 條件d, 
沒有可服務的redis, 需通知維運人員來處理。
slave=$(/usr/bin/docker exec -i redis_cli bash -c "redis-cli -h 172.20.0.6 ping" | cut -c 1-4)
master=$(/usr/bin/docker exec -i redis_cli bash -c "redis-cli -h 10.123.123.20 ping" | cut -c 1-4)
echo "Master=$master"
echo "slave="${slave}
if [ "${master}" == "PONG" ] && [ "${slave}" == "PONG" ]; then
  slave_role=$(/usr/bin/docker exec -i redis_cli redis-cli -h 172.20.0.6 info replication | grep role | cut -c 6-10)
  if [ "${slave_role}" == "maste" ]; then
      master_role=$(/usr/bin/docker exec -i redis_cli redis-cli -h 10.123.123.20 info replication | grep role)
      slave_role=$(/usr/bin/docker exec -i redis_cli redis-cli -h 172.20.0.6 info replication | grep role | cut -c 6-10)
      echo "master_role(10.123.123.20): "${master_role}
      echo "slave_role(10.123.123.11):"$savle_role
    #10.123.123.11為slave, 10.123.123.20為master
      /usr/bin/docker exec -i redis_cli redis-cli -h 172.20.0.6 slaveof 10.123.123.20 6379
      /usr/bin/docker exec -i redis_cli redis-cli -h 10.123.123.20 slaveof no one
    #lan.redis 為 10.123.123.20
      sed -i 's/172.20.0.6/10.123.123.20/g' /home/docker/nginx-dev/vol/auth_api_dev/etc/hosts
  fi
elif [ "${master}" != "PONG" ] && [ "${slave}" == "PONG" ]; then
 #master 10.123.123.20連不上去,改至 10.123.123.11為 master
  /usr/bin/docker exec -i redis_cli redis-cli -h 172.20.0.6 slaveof no one
 #lan.redis 為 10.123.123.11
  sed -i 's/10.123.123.20/172.20.0.6/g' /home/docker/nginx-dev/vol/auth_api_dev/etc/hosts
  echo "遠端 10.123.123.20 redis連不上,改連 10.123.123.11(172.20.0.6) redis"
elif [ "${master}" == "PONG" ] && [ "${slave}" != "PONG" ]; then
 #10.123.123.20為 master
  /usr/bin/docker exec -i redis_cli redis-cli -h 10.123.123.20 slaveof no one
 #lan.redis 為 10.123.123.20
  sed -i 's/172.20.0.6/10.123.123.20/g' /home/docker/nginx-dev/vol/auth_api_dev/etc/hosts
  echo "本機 10.123.123.11(172.20.0.6) redis連不上,改連master 10.123.123.20 redis"
else
  echo "10.123.123.20 and 10.123.123.11的 redis都連不上"
fi

沒有留言:

張貼留言