一、Redis 主从复制 + Keepalived 实现高可用

作用:保证Redis高可用,首先搭建Redis 主从复制,然后在主从两台机器上分别安装keepalived服务,把VIP定位在主Redis上,以供对外提供服务,然后在主服务机器上,添加守护进程,判断redis进程是否正常,如不正常,把keepalived服务停止,使VIP漂移到从服务器上,并且在从服务器上添加相应的守护进程,实时判断VIP是否在本机上,如在,立刻执行从库提升为主库。

二、网络拓扑图

三、分别在两台机器安装Redis

操作步骤省略,可根据上面的Redis 之 主从复制文档

四、分别在两台机器安装Keepalived

操作步骤省略,可参考Keepalived + Nginx文档

五、在主—Redis服务器上添加守护进程(检查Redis服务)

[root@web02 script]# cat check_redis.sh 
#!/bin/bash

redispid=$(netstat -tlunp | grep redis |wc -l)
if [ "$redispid" = "0" ];
				then
							/etc/init.d/keepalived stop
fi

[root@web02 script]# crontab -l
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1
* * * * * sleep 5; /app/redis/script/check_redis.sh > /dev/null 2>&1

六、在从—Redis服务器上添加守护进程(检查VIP)

[root@web01 scripts]# cat check_vip.sh 
#!/bin/bash

vip=$(ifconfig | grep "10.3.150.200" | wc -l)
if [ "$redispid" = "0" ];
				then
							/app/redis/redis-cli slaveof NO ONE
fi

[root@web01 scripts]# crontab -l
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1
* * * * * sleep 5; /app/scripts/check_vip.sh > /dev/null 2>&1

七、检查效果,把主Redis服务停止

1、主Redis操作

[root@web02 redis]# service redis stop
Stopping ...
Redis stopped
[root@web02 redis]# ifconfig            #10.3.150.200 IP已不存在
eth1      Link encap:Ethernet  HWaddr 00:50:56:AA:F0:34  
					inet addr:10.3.150.199  Bcast:10.3.150.255  Mask:255.255.255.0
					inet6 addr: fe80::250:56ff:feaa:f034/64 Scope:Link
					UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
					RX packets:1568328 errors:0 dropped:0 overruns:0 frame:0
					TX packets:23711 errors:0 dropped:0 overruns:0 carrier:0
					collisions:0 txqueuelen:1000 
					RX bytes:129233925 (123.2 MiB)  TX bytes:1884745 (1.7 MiB)

lo        Link encap:Local Loopback  
					inet addr:127.0.0.1  Mask:255.0.0.0
					inet6 addr: ::1/128 Scope:Host
					UP LOOPBACK RUNNING  MTU:65536  Metric:1
					RX packets:3513 errors:0 dropped:0 overruns:0 frame:0
					TX packets:3513 errors:0 dropped:0 overruns:0 carrier:0
					collisions:0 txqueuelen:0 
					RX bytes:147960 (144.4 KiB)  TX bytes:147960 (144.4 KiB)

[root@web02 redis]# 

2、从Redis操作

[root@web01 scripts]# ifconfig
eth1      Link encap:Ethernet  HWaddr 00:50:56:AA:51:29  
					inet addr:10.3.150.198  Bcast:10.3.150.255  Mask:255.255.255.0
					inet6 addr: fe80::250:56ff:feaa:5129/64 Scope:Link
					UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
					RX packets:1640859 errors:0 dropped:0 overruns:0 frame:0
					TX packets:59623 errors:0 dropped:0 overruns:0 carrier:0
					collisions:0 txqueuelen:1000 
					RX bytes:612262488 (583.8 MiB)  TX bytes:5160543 (4.9 MiB)

eth1:1    Link encap:Ethernet  HWaddr 00:50:56:AA:51:29  
					inet addr:10.3.150.200  Bcast:0.0.0.0  Mask:255.255.255.0
					UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

[root@web01 redis]# ./redis-cli     #登陆Redis
127.0.0.1:6379> keys *                 #显示所有key
 1) "14"
 2) "12"
 3) "9"
 4) "2"
 5) "4"
 6) "5"
 7) "10"
 8) "15"
 9) "7"
10) "16"
11) "1"
12) "3"
13) "13"
14) "8"
15) "6"
127.0.0.1:6379> set test aa       #创建一个key,测试是否把从库提升为主库
OK

八、检查结果

通过keepalived + 两台机的守护进程,可实现Redis高可用功能,对比哨兵模式,减少数据中转环节,提高数据处理速度,避免哨兵的单点故障,而导致服务器无法提供,同时也减少了服务器的资源开销。