$
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
}
|
$
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
}
|
$
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
|
$
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
|
$
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
|
$
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
|
脚本创建完成以后,我们开始按照如下流程进行测试:
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的角色,故障切换以及自动恢复都成功了。