使用keepalived实现redis主从切换

安装keepalived和redis主从的过程不再赘述,可参见本人其他部署文章。

主机名 IP地址 所安装软件
jia3.ty.com 192.168.10.103 keepalived(backup-高优先级),redis(master)
jia4.ty.com 192.168.10.104 keepalived(backup-低优先级),redis(slave)
192.168.10.103和192.168.10.104的keepalived配置如下:

[[email protected] keepalived]# more /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id REDIS_KEEPALIVED
}

vrrp_script chk_redis {
    script "/etc/keepalived/script/chk_redis.sh"
    interval 3
}

vrrp_instance REDIS_1 {
    state BACKUP
    nopreempt
    interface eth1
    virtual_router_id 51
    priority 200          #192.168.10.104该项配置值为100,其他都一样
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass redis
    }
    track_script {
        chk_redis
    }
    virtual_ipaddress {
        192.168.10.111/24
    }
    notify_master "/etc/keepalived/script/become_master.sh"
}

涉及到的两个脚本内容如下:

[[email protected] keepalived]# more /etc/keepalived/script/chk_redis.sh 

#!/bin/bash

A=`/app/redis/bin/redis-cli -h 127.0.0.1 -p 6379 PING`
if [ "$A"x != "PONG"x ]
then 
        /app/redis/bin/redis-server /app/redis/conf/redis.conf
        sleep 2
        if [ "`/app/redis/bin/redis-cli -h 127.0.0.1 -p 6379 PING`"x != "PONG"x ]
        then
                /etc/init.d/keepalived stop
        fi
fi

[[email protected] keepalived]# more /etc/keepalived/script/become_master.sh 

#!/bin/bash
/app/redis/bin/redis-cli -h 127.0.0.1 -p 6379 slaveof no one

说明:

	1.keepalived使用双Backup非抢占模式
	2.redis主从切换的实现是通过检测本机redis进程,当服务不可用时停止keepalived服务做VIP切换,当获得VIP时让Redis执行slaveof no one命令变成主。
	3.需要检测keepalived状态,当发现VIP切换后需要尽快恢复至初始状态。

测试:

查看当前状态

192.168.10.103现在是redis master和VIP的所有者,如下图:

使用keepalived实现redis主从切换使用keepalived实现redis主从切换使用keepalived实现redis主从切换

192.168.10.104现在是redis slave并且没有VIP,如下图所示:

使用keepalived实现redis主从切换使用keepalived实现redis主从切换

检测脚本发现redis不可用之后会先尝试启动redis服务

我们先将redis进程杀掉,发现redis会自动启动,如下图:

使用keepalived实现redis主从切换

然后我们测试一下,当进程无法启动时,发生VIP切换后,从redis会不会自动变成主redis。

在当前的主Redis即103机器上,将redis-server命令改名成redis-server.bak 然后杀掉redis进程,模拟redis启动失败。

使用keepalived实现redis主从切换

这时,可以看到VIP已经切换到了104机器上。

使用keepalived实现redis主从切换

使用keepalived实现redis主从切换

看一下104机器上的Redis是否已经变成主,如下图:

使用keepalived实现redis主从切换

可以看到104机器的redis已经由从redis变成了主redis,这时向VIP写入是正常的。

我们的监控应该能够监控到keepalived的VIP切换的状态,并告警,当我们收到告警后进行状态复原,过程如下:

启动redis并指定为104的从redis ---> 启动keepalived  ---> 查看状态

使用keepalived实现redis主从切换

查看现在的状态,如下图:

使用keepalived实现redis主从切换使用keepalived实现redis主从切换

可以看到这个状态和最初始的状态相比而言,只是将192.168.10.103和192.168.10.104两台机器的角色调换了一下。

如此循环往复,实现redis的主从切换高可用。


缺点:

1.在恢复之前两个节点都挂掉的话,应用不可用 

2.如果是keepalived自身不可用,也会导致主从切换

优点:

1.切换速度秒级切换

2.VIP非抢占模式,切换过程平滑,恢复不会抢占VIP

3.配置相对简单


如有更好的想法可以讨论。或者更全面的方式也可以讨论。共同学习。

至此,文章结束。