通过Keepalived实现Redis Failover自动故障切换功能

来源:互联网 发布:在Mac上如何使用jdk 编辑:程序博客网 时间:2024/04/30 20:28
通过Keepalived实现Redis Failover自动故障切换功能

一、主从的安装和配置
基本环境
两台机器:
master: 192.168.195.75
slave: 192.168.195.74

安装主服务器

vi redis.conf

.
修改磁盘上保存数据库文件的位置:
dbfilename /jcm-data/redisdb/dump.rdb

.
修改日志文件的位置

logfile /jcm-data/redisdb/redis.log

安装和配置从机

vi redis.conf
修改其中的一行
配置masterip地址和redis-server的端口。
slaveof 192.168.195.75 6379

4, 
启动和测试
主机: ./redis-server /opt/redis/redis.conf
从机
: ./redis-server /opt/redis/redis.conf
测试

在主机上启动redis客户端:
ssh 192.168.195.75
redis-cli
>set k1 v1
>get k1
"v1"
.
登陆从机,并在从机上启动客户端:

ssh 192.168.195.74
redis-cli
>get k1
"v1"
可以看到redis已经把数据同步过来了。

二 、通过Keepalived实现Redis Failover自动故障切换

修改MasterSlave/etc/hosts文件
[root@redis rc.d]# cat /etc/hosts
192.168.195.75 redis
192.168.195.74 redis-slave

Master
上是
[root@redis rc.d]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=redis

Slave
上是
[root@redis-slave linux]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=redis-slave
修改完主机名重启机器生效

Master 
 Slave 上 安装 keepalived
sudo apt-get install keepalived

service iptables stop 
一定要关闭IP 信息包过滤系统


配置keepalived配置文件:
首先,在Master上创建如下配置文件:
[root@redis linux]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email
Unknown macro: { yfhawei@jd.com }

notification_email_from yfhawei@jd.com
router_id redis
}

vrrp_script chk_redis
Unknown macro: { script "/etc/keepalived/scripts/redis_check.sh" interval 1 }

vrrp_instance mes_Redis {
state MASTER
interface eth0
garp_master_delay 10
smtp_alert
virtual_router_id 3
priority 100
nopreempt
advert_int 1
authentication
Unknown macro: { auth_type PASS auth_pass 1111 }

virtual_ipaddress
Unknown macro: { 192.168.195.200 }

track_script
Unknown macro: { chk_redis }

notify_master /etc/keepalived/scripts/redis_master.sh
notify_backup /etc/keepalived/scripts/redis_slave.sh
notify_fault /etc/keepalived/scripts/redis_fault.sh
notify_stop /etc/keepalived/scripts/redis_stop.sh
}

然后,在Slave上创建如下配置文件:
[root@redis-slave linux]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email
Unknown macro: { xiesongmeng@xlhtol.com }

notification_email_from keepalived@redis-slave
router_id redis-salve
}

vrrp_script chk_redis

vrrp_instance mes_Redis {
state BACKUP
interface eth0
garp_master_delay 10
smtp_alert
virtual_router_id 3
priority 90
nopreempt
advert_int 1
authentication
Unknown macro: { auth_type PASS auth_pass 1111 }

virtual_ipaddress
Unknown macro: { 192.168.195.200 }

track_script
Unknown macro: { chk_redis }

notify_master /etc/keepalived/scripts/redis_master.sh
notify_backup /etc/keepalived/scripts/redis_slave.sh
notify_fault /etc/keepalived/scripts/redis_fault.sh
notify_stop /etc/keepalived/scripts/redis_stop.sh
}

MasterSlave上创建监控Redis的脚本
mkdir /etc/keepalived/scripts
vim /etc/keepalived/scripts/redis_check.sh
#!/bin/bash
ALIVE=`/usr/local/bin/redis-cli PING`
if [ "$ALIVE" == "PONG" ]; then
echo $ALIVE
exit 0
else
echo $ALIVE
exit 1
fi

编写以下负责运作的关键脚本:
notify_master /etc/keepalived/scripts/redis_master.sh
notify_backup /etc/keepalived/scripts/redis_slave.sh
notify_fault /etc/keepalived/scripts/redis_fault.sh
notify_stop /etc/keepalived/scripts/redis_stop.sh

因为Keepalived在转换状态时会依照状态来呼叫:
当进入Master状态时会呼叫notify_master
当进入Backup状态时会呼叫
notify_backup
当发现异常情况时进入Fault状态呼叫
notify_fault
Keepalived程序终止时则呼叫
notify_stop

首先,在Redis Master上创建notity_masternotify_backup脚本:

vim /etc/keepalived/scripts/redis_master.sh
#!/bin/bash

REDISCLI="/usr/local/bin/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.195.74 6379 >> $LOGFILE 2>&1
sleep 10 #
延迟10秒以后待数据同步完成后再取消同步状态

echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

vim /etc/keepalived/scripts/redis_slave.sh
#!/bin/bash

REDISCLI="/usr/local/bin/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.195.74 6379 >> $LOGFILE 2>&1

接着,在Redis Slave上创建notity_masternotify_backup脚本:

vim /etc/keepalived/scripts/redis_master.sh
#!/bin/bash

REDISCLI="/usr/local/bin/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.195.75 6379 >> $LOGFILE 2>&1
sleep 10 #
延迟10秒以后待数据同步完成后再取消同步状态

echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

vim /etc/keepalived/scripts/redis_slave.sh
#!/bin/bash

REDISCLI="/usr/local/bin/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.195.75 6379 >> $LOGFILE 2>&1

然后在MasterSlave创建如下相同的脚本:
vim /etc/keepalived/scripts/redis_fault.sh
#!/bin/bash

LOGFILE=/var/log/keepalived-redis-state.log

echo "fault" >> $LOGFILE
date >> $LOGFILE

vim /etc/keepalived/scripts/redis_stop.sh
#!/bin/bash

LOGFILE=/var/log/keepalived-redis-state.log

echo "stop" >> $LOGFILE
date >> $LOGFILE

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

脚本创建完成以后,开始按照如下流程进行测试:
1.
启动Master上的Redis
[root@redis bin]# pwd
/usr/local/bin
[root@redis bin]# ./redis-server redis.conf

2.
启动Slave上的
Redis
[root@redis bin]# pwd
/usr/local/bin
[root@redis bin]# ./redis-server redis.conf

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

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

5.
尝试通过VIP连接
Redis:
[root@redis bin]#pwd
/usr/local/bin
[root@redis bin]# ./redis-cli -h 192.168.195.200 info
role:master
slave0:192.168.195.74,6379,online
连接成功,Slave也连接上来了


6.
尝试插入一些数据:
[root@redis bin]# ./redis-cli -h 192.168.195.200 SET Hello Redis
VIP读取数据
[root@redis bin]# ./redis-cli -h 192.168.195.200 GET Hello
"Redis"

Master读取数据
[root@redis bin]# ./redis-cli -h 192.168.195.75 GET Hello
"Redis"

Slave读取数据
[root@redis-slave bin]# ./redis-cli -h 192.168.195.75 GET Hello
"Redis"

下面,模拟故障产生:
Master上的Redis进程杀死:
[root@redis bin]# ./redis-cli shutdown

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

同时Slave上的日志显示:
[root@redis-slave scripts]# tail /var/log/keepalived-redis-state.log
master
Thu Nov 15 12:06:04 CST 2012
Being master....
Run SLAVEOF cmd ...
OK
Run SLAVEOF NO ONE cmd ...
OK

然后我们可以发现,Slave已经接管服务,并且担任Master的角色了。
./redis-cli -h 192.168.195.200 info
./redis-cli -h 192.168.195.74 info
role:master

然后我们恢复MasterRedis进程
主变成slave

然后把 74 redis停掉

75
恢复主的角色,在把 74 redis开启

恢复 75是主, 74是备

自动切换成功!

*************************************

郑州就维 www.zzjiuwei.com


0 0
原创粉丝点击