利用keepalived实现redis的高可用。keepalived利用shell脚本,定期检测redis服务是否正常。当redis服务异常时,利用虚拟IP的漂移实现故障切换

实现双机热备,当redis-master异常时,redis-slave快速切换成master提供服务。 当redis-master数据更新时,redis-slave数据能同步更新。


一、Redis主备配置

1、先在master和slave 各自安装好redis;

2、配置主备:
        a、修改master端 bind 0.0.0.0;
        b、Slave端增加: slaveof 192.168.230.27 6379;#master端ip master端port

3、重启服务,查看日志,查看info信息,master_link_status 为up则成功,为down则失败。

双中心 redis 哨兵模式 redis双中心双活_Keepalived



二、Redis主备切换


redis提供了一个sentinel(哨兵),来实现主从切换的功能。


Redis Sentinel的主从切换方案



Redis 2.8版开始正式提供名为Sentinel的主从切换方案,Sentinel用于管理多个Redis服务器实例,主要负责三个方面的任务:


    1. 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。


    2. 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。


    3. 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。


Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。


启动哨兵命令


redis-server sentinel.conf --sentinel


配置信息

双中心 redis 哨兵模式 redis双中心双活_redis_02

三、keepalived配置redis高可用

1、在Master和Slave上安装Keepalived

2、修改配置文件

Master 配置文件:

! Configuration File for keepalived
 global_defs {
 router_id LVS_DEVEL
 #vrrp_skip_check_adv_addr
 #vrrp_strict
 #vrrp_garp_interval 0
 #vrrp_gna_interval 0
 }
 vrrp_script chk_redis 
 { 
 script "/etc/keepalived/scripts/redis_check.sh 192.168.230.27 6379 123456" 
 interval 2 
 timeout 2
 fall 3
 } vrrp_instance VI_HC {
 state MASTER
 interface enp0s3
 virtual_router_id 151
 priority 110
 advert_int 1
 authentication {
 auth_type PASS
 auth_pass 1111
 }
 virtual_ipaddress {
 192.168.230.100/24
 }

 track_script { 
 chk_redis 
 } 
 notify_master "/etc/keepalived/scripts/redis_master.sh 127.0.0.1 192.168.230.28 6379"
 notify_backup "/etc/keepalived/scripts/redis_backup.sh 127.0.0.1 192.168.230.28 6379"
 notify_fault /etc/keepalived/scripts/redis_fault.sh 
 notify_stop /etc/keepalived/scripts/redis_stop.sh 
 } virtual_server 192.168.230.100 6379 {
 delay_loop 6
 lb_algo rr
 lb_kind DR
 persistence_timeout 0
 protocol TCP real_server 192.168.230.27 6379 { 
 weight 1 
 TCP_CHECK { 
 connect_timeout 3 
 delay_before_retry 3 
 connect_port 6379
 } 
 }
 real_server 192.168.230.28 6379 {
 weight 1
 TCP_CHECK {
 connect_timeout 3
 delay_before_retry 3
 connect_port 6379
 }
 }
 }

    Slave 配置文件只需修改两处:

 state BACKUP

 priority 80    权值要比Master小

脚本创建完成以后,我们开始按照如下流程进行测试:

1.启动Master上的Redis
$ /etc/init.d/redis start

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

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

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



5.尝试通过VIP连接Redis:

连接成功,停掉主,会切换到备,可以进行测试



四、监听脚本

编写以下负责运作的关键脚本:

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