Redis以其高效的访问速度著称。但由于官方还未发布redis-cluster,而redis的replica又有诸多不便:比如一组master-slave的机器,如果之间有链接瞬段,或者对slave重新执行slaveof命令,会导致slave机器从头开始同步一次master的数据,造成较大的开销。
以下描述了使用keepalived+redis主从的一种高可用方法。安装方法在这里就不赘述了,google之则可。
1. redis服务配置
主机 端口 角色
redis0 6379 master
redis1 6379 slave
2. keepalived的配置
redis0和redis1使用一个虚拟ip
并使用如下脚本监控redis服务是否存活。监控脚本:
- #!/bin/bash
- /usr/local/bin/redis-cli -h 192.168.1.53 -p 6379 info > /dev/null
- if [ $? -eq 0 ]; then
- echo "redis OK"
- exit 0
- else
- echo "no redis service found!"
- /usr/local/bin/redis-server /path/to/redis.conf
- # try to start it again
- /usr/local/bin/redis-cli -h 192.168.11.53 -p 6380 info > /dev/null
- if [ $? -eq 0 ]; then
- exit 0
- else
- # restart failed
- killall keepalived
- echo "error"
- fi
- fi
要实现redis故障恢复,可以使用keepalived配置的notify_master, notify_backup这两个方法执行特有的脚本。实际上只要在slave(即redis1)上有2个脚本,第一个用于在redis1接管虚拟ip之后,执行slaveof no one把自己变成master。第二个用户在redis1交出虚拟ip之后,在redis0执行slaveof no one确保redis0恢复为主的状态,并对自己执行slaveof redis0 6379开始重新从master同步数据,如果自己已经是slave就没必要同步了。
redis1上keepalived的配置方法如下,redis0只要去掉notify_master, notify_backup两行即可。
- ! Configuration File for keepalived
- global_defs {
- router_id redis1
- }
- vrrp_script Monitor_Redis {
- script "/opt/redis_keepalive.sh"
- interval 10
- weight 2
- }
- vrrp_instance 360 {
- state BUCKUP #(主机为MASTER,备用机为BACKUP)
- interface eth0 #(HA监测网络接口)
- virtual_router_id 110 #(主、备机的virtual_router_id必须相同)
- mcast_src_ip 192.168.11.53 #(多播的源IP,设置为本机外网IP,与VIP同一网卡)此项可不设置
- priority 70 #(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)
- advert_int 1 #(VRRP Multicast广播周期秒数)
- authentication {
- ......
- }
- notify_master /opt/redis_2master.sh
- notify_backup /opt/redis_2backup.sh
- track_script {
- Monitor_Redis #(调用nginx进程检测脚本)
- }
- virtual_ipaddress {
- 192.168.11.4 #(VRRP HA虚拟地址)
- }
- }