keepalived实现redis主从高可用

方案说明  

两台机器(称为A和B),以统一的VIP对外提供服务 
1.正常情况下,A和B都启动,B会把A的数据同步过来(B is slave of A) 
2.当A挂了后,VIP漂移到B;B的keepalived 通知redis 执行:slaveof no one,由B提供服务 
3.当A起来后,VIP不切换,仍在B上面;而A的keepalived 通知redis 执行slaveof B,开始把B的数据同步过来(A is slave of B) 
4.依此循环 

也就是说: 
当两台机器都正常时,一个为master,一个为slave; 
当master挂掉时,slave升级为master; 
当原master再次起来时,它不会抢占,而是作为slave;依此循环 


机器  

10.75.201.67:/home/redis 
10.75.201.66: /home/redis 
初次启动时,10.75.201.67为master,10.75.201.66为slave 

配置  
Java代码   收藏代码
  1. //A机器  
  2. vrrp_script chk_nutcraker {  
  3.                 script "/home/redis/redis/bin/redis_check.sh"  
  4.                 interval 2  
  5. }  
  6. vrrp_instance VI_2 {  
  7.         state BACKUP        #both BACKUP  
  8.         interface eth1  
  9.         virtual_router_id 12  
  10.         priority 101    #101 on master, 100 on backup  
  11.         nopreempt       #both nopreempt  
  12.         track_script {  
  13.                 chk_nutcraker  
  14.         }  
  15.         virtual_ipaddress {  
  16.              10.75.201.3  
  17.         }  
  18.         notify /home/redis/redis/bin/redis_notify.sh  
  19. }  

Java代码   收藏代码
  1. //B机器  
  2. vrrp_script chk_nutcraker {  
  3.                 script "/home/redis/redis/bin/redis_check.sh"  
  4.                 interval 2  
  5. }  
  6. vrrp_instance VI_2 {  
  7.         state BACKUP        #both BACKUP  
  8.         interface eth1  
  9.         virtual_router_id 12  
  10.         priority 100    #101 on master, 100 on backup  
  11.         nopreempt       #both nopreempt  
  12.         track_script {  
  13.                 chk_nutcraker  
  14.         }  
  15.         virtual_ipaddress {  
  16.              10.75.201.3  
  17.         }  
  18.         notify /home/redis/redis/bin/redis_notify.sh  
  19. }  


检测redis是否正常的脚本: 
[root@redhat1 ~]# cat /home/redis/redis/bin/redis_check.sh 
Java代码   收藏代码
  1. #!/bin/bash  
  2.   
  3. ALIVE=`/home/redis/redis/bin/redis-cli PING`  
  4. if [ "$ALIVE" == "PONG" ]; then  
  5.   echo $ALIVE  
  6.   exit 0  
  7. else  
  8.   echo $ALIVE  
  9.   exit 1  
  10. fi  


redis根据keepalived状态转移而更新自己的状态:进入master时slaveof no one,进入backup时,slaveof另一台机器: 
[root@redhat1 ~]# cat /home/redis/redis/bin/redis_notify.sh 
Java代码   收藏代码
  1. #!/bin/bash  
  2.   
  3. REMOTE=10.75.201.67  #在10.75.201.67机器上则为10.75.201.66  
  4. PORT=6379  
  5.   
  6. REDIS_HOME=/home/redis/redis  
  7. REDISCLI="$REDIS_HOME/bin/redis-cli"  
  8. LOGFILE="$REDIS_HOME/logs/redis_notify.log"  
  9.   
  10. DATE_TIME=`date "+%Y-%m-%d %H:%M:%S"`  
  11.   
  12. TYPE=$1  
  13. NAME=$2  
  14. STATE=$3  
  15.   
  16. case $STATE in  
  17.         "MASTER")   
  18.                   echo "$DATE_TIME:became master:" >> $LOGFILE  
  19.                   $REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1   
  20.                   exit 0  
  21.                   ;;  
  22.         "BACKUP")    
  23.                   echo "$DATE_TIME:became slave:" >> $LOGFILE  
  24.                   $REDISCLI SLAVEOF $REMOTE $PORT >> $LOGFILE  2>&1  
  25.                   exit 0  
  26.                   ;;  
  27.         "FAULT")    
  28.                   echo "$DATE_TIME:[fault]" >> $LOGFILE  
  29.                   exit 0  
  30.                   ;;  
  31.         *)        echo "unknown state"  
  32.                   exit 1  
  33.                   ;;  
  34. Esac  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值