Redis+Keepalived高可用方案详细分析(2)

apt-get install keepalived
2 安装Redis
    redis是采用源码编译安装的,Ubuntu12.04默认自带版本没有这么高,安装过程参照以前文档。

3 配置keepalived

global_defs { 

lvs_id LVS_redis 

vrrp_script chk_redis { 

script "/etc/keepalived/scripts/redis_check.sh"

weight -20

interval 2                                     

vrrp_instance VI_1 { 

state backup                             

interface eth0                           

virtual_router_id 51

nopreempt 

priority 200     

advert_int 5                     

track_script { 

chk_redis                     

virtual_ipaddress { 

10.20.112.29                       

notify_master /etc/keepalived/scripts/redis_master.sh 

notify_backup /etc/keepalived/scripts/redis_backup.sh 

notify_fault  /etc/keepalived/scripts/redis_fault.sh 

notify_stop  /etc/keepalived/scripts/redis_stop.sh 

}

4 配置redis,/etc/redis/redis.com 

最简单的配置就是把默认配置文件中的bind 127.0.0.1修改为0.0.0.0即可。

5 建立redis状态切换脚本

在/etc/keepalived目录下建立log和scripts目录。

在script下有五个脚本,一个是检测redis状态的redis_check.sh脚本,其余四个是keepalived状态变化时执行的脚本。keepalived有master/backup/stop/fault四种状态,因为我们主要是关注系统上的业务,所以在在keepalived进入fault/stop状态后,也认为是进入了backup状态,需要对redis的master/slave关系进行反转,否则即使VIP漂移过去,但是redis的主从关系还没有改变,会导致数据不一致,所以最终四个脚本只有两种内容。

5.1 redis服务状态检测脚本redis_check.sh(27上面内容和它一样)

#!/bin/bash 

###/etc/keepalived/scripts/redis_check.sh 

ALIVE=`/usr/bin/redis-cli PING` 

if [ "$ALIVE" == "PONG" ]; then 

echo $ALIVE 

exit 0

else

echo $ALIVE 

exit 1

fi

5.2 keepalived进入master状态时的检测脚本redis_master.sh


w sourceprint?01 #!/bin/bash 

###/etc/keepalived/scripts/redis_master.sh 

REDISCLI="redis-cli"

LOGFILE="/etc/keepalived/log/redis-state.log"

pid=$$ 

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver]" >> $LOGFILE 

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] Run 'SLAVEOF 10.20.112.27 6379'" >> $LOGFILE 

$REDISCLI SLAVEOF 10.20.112.27 6379 >> $LOGFILE  2>&1

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] wait 10 sec for data sync from old master" >> $LOGFILE 

sleep 10 

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] data rsync from old mater ok..." >> $LOGFILE 

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] Run slaveof no one,close master/slave" >> $LOGFILE 

$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] wait other slave connect...." >> $LOGFILE

5.3 keepalived进入backup/stop/fault时的检测脚本,由于内容都一致,所以只写出redis_backup.sh


#!/bin/bash 

###/etc/keepalived/scripts/redis_backup.sh 

REDISCLI="redis-cli"

LOGFILE="/etc/keepalived/log/redis-state.log"

pid=$$ 

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master]" >> $LOGFILE 

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] Being slave state..." >> $LOGFILE 2>&1

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] wait 10 sec for data sync from old master" >> $LOGFILE 

sleep 10

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] data rsync from old mater ok..." >> $LOGFILE 

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] Run 'SLAVEOF 10.20.112.27 6379'" >> $LOGFILE 

$REDISCLI SLAVEOF 10.20.112.27 6379 >> $LOGFILE  2>&1

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] slave connect to 10.20.112.27 ok..." >> $LOGFILE


配置10.20.112.27

1 安装keepalived

2 安装redis


3 配置redis,/etc/redis/redis.com


    前面三步骤均一样

4 配置keepalived

global_defs { 

lvs_id LVS_redis 

vrrp_script chk_redis { 

script "/etc/keepalived/scripts/redis_check.sh"   

weight  -20 

interval 2                                       

vrrp_instance VI_1 { 

state backup                                 

interface eth0                               

virtual_router_id 51 

priority 190   

advert_int  5                           

track_script { 

chk_redis                   

virtual_ipaddress { 

10.20.112.29                   

notify_master /etc/keepalived/scripts/redis_master.sh 

notify_backup /etc/keepalived/scripts/redis_backup.sh 

notify_fault  /etc/keepalived/scripts/redis_fault.sh 

notify_stop  /etc/keepalived/scripts/redis_stop.sh 

}

5 建立redis状态切换脚本

在/etc/keepalived目录下建立log和scripts目录

5.1 redis服务状态检测脚本redis_check.sh(26上面内容和它一样)

5.2 keepalived进入master状态时的检测脚本redis_master.sh


#!/bin/bash 

###/etc/keepalived/scripts/redis_master.sh 

REDISCLI="/usr/bin/redis-cli"

LOGFILE="/etc/keepalived/log/redis-state.log"

pid=$$ 

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[backup]" >> $LOGFILE 

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[backup] Run 'SLAVEOF 10.20.112.26 6379'" >> $LOGFILE 

$REDISCLI SLAVEOF 10.20.112.26 6379 >> $LOGFILE  2>&1

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[backup] wait 10 sec for data sync from old master" >> $LOGFILE 

sleep 10

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] data rsync from old mater ok..." >> $LOGFILE 

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] Run slaveof no one,close master/slave" >> $LOGFILE 

$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] wait other slave connect...." >> $LOGFILE

5.3 keepalived进入backup/stop/fault时的检测脚本,由于内容都一致,所以只写出redis_backup.sh


#!/bin/bash 

###/etc/keepalived/scripts/redis_backup.sh 

REDISCLI="/usr/bin/redis-cli"

LOGFILE="/etc/keepalived/log/redis-state.log"

pid=$$ 

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] Being slave state..." >> $LOGFILE 2>&1

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] wait 15 sec for data sync from old master" >> $LOGFILE 

sleep 15 

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] data rsync from old mater ok..." >> $LOGFILE 

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] Run 'SLAVEOF 10.20.112.26 6379'" >> $LOGFILE 

$REDISCLI SLAVEOF 10.20.112.26 6379 >> $LOGFILE  2>&1

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] slave connect to 10.20.112.26 ok..." >> $LOGFILE

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/927f71cfe41b8c9231d6bf96610640a9.html