redis+Keepalived实现Redis高可用性(非sentinel)


环境:
    Master:192.168.19.131
    Slave:192.168.19.132


1、Master上修改KeepAlived的配置文件
    # vi  / etc / keepalived / keepalived . conf
$   sudo  vim   / etc / keepalived / keepalived . conf
vrrp_script   chk_redis   {
                 script   "/etc/keepalived/scripts/redis_check.sh"     ###监控脚本
                 interval   2                                          ###监控时间
}
vrrp_instance   VI_1   {
         state   MASTER                              ###设置为MASTER
         interface   eth0                            ###监控网卡    
         virtual_router_id   51
         priority   101                              ###权重值
         authentication   {
                      auth_type  PASS               ###加密
                      auth_pass  redis              ###密码
         }
         track_script   {
                 chk_redis                         ###执行上面定义的chk_redis
         }
         virtual_ipaddress   {
              10.6.1.200                           ###VIP
         }
         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
}

2、Slave上修改KeepAlived的配置文件
$   sudo  vim   / etc / keepalived / keepalived . conf
vrrp_script   chk_redis   {
                 script   "/etc/keepalived/scripts/redis_check.sh"     ###监控脚本
                 interval   2                                          ###监控时间
}
vrrp_instance   VI_1   {
         state   BACKUP                                  ###设置为BACKUP
         interface   eth0                                ###监控网卡
         virtual_router_id   51
         priority   100                                  ###比MASTRE权重值低
         authentication   {
                      auth_type  PASS
                      auth_pass  redis                  ###密码与MASTRE相同
         }
         track_script   {
                 chk_redis                         ###执行上面定义的chk_redis
         }
         virtual_ipaddress   {
              10.6.1.200                           ###VIP
         }
         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
}

3、在Master和Slave上创建监控Redis的脚本
#   sudo  mkdir   / etc / keepalived / scripts
sudo  vim   / etc / keepalived / scripts / redis_check . sh

$   sudo  mkdir   / etc / keepalived / scripts
$   sudo  vim   / etc / keepalived / scripts / redis_check . sh
#!/bin/bash

ALIVE = ` / home/soft/redis-3.0.3/src / redis - cli  PING `
if   [   "$ALIVE"   ==   "PONG"   ] ;   then
   echo   $ ALIVE
   exit   0
else
   echo   $ ALIVE
   exit   1
fi
4、编写以下负责运作的关键脚本:
首先,在Redis Master上创建notity_master与notify_backup脚本:
$   sudo  vim   / etc / keepalived / scripts / redis_master . sh
#!/bin/bash
 
REDISCLI = "/home/soft/redis-3.0.3/src/redis-cli"
LOGFILE = "/var/log/keepalived-redis-state.log"
 
echo   "[master]"   >>   $ LOGFILE
date   >>   $ LOGFILE
echo   "Being master...."   >>   $ LOGFILE   2 > & 1
 
echo   "Run SLAVEOF cmd ..."   >>   $ LOGFILE
$ REDISCLI  SLAVEOF   192.168.19.132   6379   >>   $ LOGFILE    2 > & 1
sleep   10   #延迟10秒以后待数据同步完成后再取消同步状态
 
echo   "Run SLAVEOF NO ONE cmd ..."   >>   $ LOGFILE
$ REDISCLI  SLAVEOF  NO  ONE   >>   $ LOGFILE   2 > & 1

$   sudo  vim   / etc / keepalived / scripts / redis_backup . sh
#!/bin/bash
 
REDISCLI = "/home/soft/redis-3.0.3/src/redis-cli"
LOGFILE = "/var/log/keepalived-redis-state.log"
 
echo   "[backup]"   >>   $ LOGFILE
date   >>   $ LOGFILE
echo   "Being slave...."   >>   $ LOGFILE   2 > & 1
 
sleep   15   #延迟15秒待数据被对方同步完成之后再切换主从角色
echo   "Run SLAVEOF cmd ..."   >>   $ LOGFILE
$ REDISCLI  SLAVEOF   192.168.19.132   6379   >>   $ LOGFILE    2 > & 1

接着,在Redis Slave上创建notity_master与notify_backup脚本:


$   sudo  vim   / etc / keepalived / scripts / redis_master . sh
#!/bin/bash
 
REDISCLI = "/home/soft/redis-3.0.3/src/redis-cli"
LOGFILE = "/var/log/keepalived-redis-state.log"
 
echo   "[master]"   >>   $ LOGFILE
date   >>   $ LOGFILE
echo   "Being master...."   >>   $ LOGFILE   2 > & 1
 
echo   "Run SLAVEOF cmd ..."   >>   $ LOGFILE
$ REDISCLI  SLAVEOF   192.168.19.131   6379   >>   $ LOGFILE    2 > & 1
sleep   10   #延迟10秒以后待数据同步完成后再取消同步状态
 
echo   "Run SLAVEOF NO ONE cmd ..."   >>   $ LOGFILE
$ REDISCLI  SLAVEOF  NO  ONE   >>   $ LOGFILE   2 > & 1
$   sudo  vim   / etc / keepalived / scripts / redis_backup . sh
#!/bin/bash
 
REDISCLI = "/home/soft/redis-3.0.3/src/redis-cli"
LOGFILE = "/var/log/keepalived-redis-state.log"
 
echo   "[backup]"   >>   $ LOGFILE
date   >>   $ LOGFILE
echo   "Being slave...."   >>   $ LOGFILE   2 > & 1
 
sleep   15   #延迟15秒待数据被对方同步完成之后再切换主从角色
echo   "Run SLAVEOF cmd ..."   >>   $ LOGFILE
$ REDISCLI  SLAVEOF   192.168.19.131   6379   >>   $ LOGFILE    2 > & 1

然后在Master与Slave创建如下相同的脚本:

$   sudo  vim   / etc / keepalived / scripts / redis_fault . sh
#!/bin/bash
 
LOGFILE = / var / log / keepalived - redis - state . log
 
echo   "[fault]"   >>   $ LOGFILE
date   >>   $ LOGFILE

$   sudo  vim   / etc / keepalived / scripts / redis_stop . sh
#!/bin/bash
 
LOGFILE = / var / log / keepalived - redis - state . log
 
echo   "[stop]"   >>   $ LOGFILE
date   >>   $ LOGFILE

给脚本都加上可执行权限:
$ sudo chmod +x /etc/keepalived/scripts/*.sh

脚本创建完成以后,我们开始按照如下流程进行测试:
1.启动Master上的Redis
$ sudo /etc/init.d/redis start

2.启动Slave上的Redis
$ sudo /etc/init.d/redis start

3.启动Master上的Keepalived
$ sudo /etc/init.d/keepalived start

4.启动Slave上的Keepalived
$ sudo /etc/init.d/keepalived start

5.尝试通过VIP连接Redis:
$ redis-cli -h 10.6.1.200 INFO

连接成功,Slave也连接上来了。
role:master
slave0:192.168.19.132,6379,online

6.尝试插入一些数据:
$ redis-cli -h 10.6.1.200 SET Hello Redis
OK

从VIP读取数据
$ redis-cli -h 10.6.1.200 GET Hello
"Redis"

从Master读取数据
$ redis-cli -h 192.168.19.131 GET Hello
"Redis"

从Slave读取数据
$ redis-cli -h 192.168.19.132 GET Hello

"Redis"

下面,模拟故障产生:
将Master上的Redis进程杀死:
$ sudo killall -9 redis-server

查看Master上的Keepalived日志
$ tailf /var/log/keepalived-redis-state.log
[fault]
Thu Sep 27 08:29:01 CST 2012

同时Slave上的日志显示:
$ tailf /var/log/keepalived-redis-state.log
[master]
Fri Sep 28 14:14:09 CST 2012
Being master....
Run SLAVEOF cmd ...
OK
Run SLAVEOF NO ONE cmd ...
OK

然后我们可以发现,Slave已经接管服务,并且担任Master的角色了。
$ redis-cli -h 10.6.1.200 INFO
$ redis-cli -h 192.168.19.132 INFO
role:master

然后我们恢复Master的Redis进程
$ sudo /etc/init.d/redis start

查看Master上的Keepalived日志
$ tailf /var/log/keepalived-redis-state.log
[master]
Thu Sep 27 08:31:33 CST 2012
Being master....
Run SLAVEOF cmd ...
OK
Run SLAVEOF NO ONE cmd ...
OK

同时Slave上的日志显示:
$ tailf /var/log/keepalived-redis-state.log
[backup]
Fri Sep 28 14:16:37 CST 2012
Being slave....
Run SLAVEOF cmd ...
OK

可以发现目前的Master已经再次恢复了Master的角色,故障切换以及自动恢复都成功了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值