环境介绍:

wKiom1eQaN6ypRFMAACM7C6mGfU877.jpg-wh_500x0-wm_3-wmp_4-s_3122638359.png

实现的原理

master和backup服务器分别安装哨兵和keepalived,master的优先级为100,backup的优先级为99,在salve服务器上配置vrrp_script检查脚本规则,检查slave当前的角色状态,一旦slave的redis角色状态为master,就把slave的优先级加2变为101,使其获得vip的权限;

master的redis服务挂掉后,哨兵会将slave提升为新的master,slave检查角色状态为master时将优先级加2获得vip,当原来master的redis服务起来后哨兵将其作为slave加入到主从复制

当变为master的slave节点上redis服务挂掉后,哨兵会将redis的master设置为原来的master节点,vrrp_script检查自己的redis不是master时,将优先级减2变为99,原来的master优先级比slave优先级高,原来的master获得vip权限

 

以下操作主从服务器步骤一样,这里只安装一次

一、安装redis和哨兵服务

1、下载redis服务软件包到服务器,解压后并编译安装(主从步骤一样,这里只安装一次)

[root@centos01 /]# tar xzvf redis-3.2.9.tar.gz
[root@centos01 /]# cd redis-3.2.9/
[root@centos01 redis-3.2.9]# make && make ×××tall
[root@centos01 redis-3.2.9]# ./utils/×××tall_server.sh
Welcome to the redis service ×××taller   ##一路回车
Installation successful!

2、修改redis配置文件,修改为后台运行、监听所有地址(其他参数按需修改),重启redis服务

[root@centos01 redis-3.2.9]# vim /etc/redis/6379.conf
bind 0.0.0.0
daemonize yes
[root@centos01 redis-3.2.9]# /etc/init.d/redis_6379 restart

3、复制哨兵的配置文件和启动文件到redis安装目录

[root@centos01 redis-3.2.9]# cp sentinel.conf /etc/redis/
[root@centos01 redis-3.2.9]# cp src/redis-sentinel /etc/redis/

二、设置redis主从复制,并配置哨兵监控

1、登录slave-redis服务器,将master设置为192.168.2.225

[root@slave /]# redis-cli
127.0.0.1:6379> SLAVEOF 192.168.2.225 6379  ##设置master为2.225
127.0.0.1:6379> INFO Replication

3、修改master和slave服务器的sentinel.conf配置文件(master和slave配置一致)

##修改master的哨兵文件
[root@master /]# cd /etc/redis/
[root@master /]# vim /etc/redis/sentinel.conf
port 26379
dir "/tmp"
sentinel monitor mymaster 192.168.2.225 6379 1 #(指定监控的master地址和端口号,1表示多个sentinel同意才进行主从切换)
sentinel down-after-milliseconds mymaster 4000 #(超过多少毫秒连接不到master认定为master死掉)
sentinel failover-timeout mymaster 18000 #(当主从切换多久后认为主从切换失败)
daemonize yes    #(后台运行)
logfile "/var/log/redis_sentinel.log"  #(日志文件保存路径)
[root@master redis]# ./redis-sentinel sentinel.conf #启动哨兵服务

三、配置keepalived实现高可用

1、使用yum方式安装keepalived软件包(master和slave都安装)

[root@master redis]# yum ×××tall -y keepalived
[root@master redis]# ./redis-sentinel sentinel.conf #启动哨兵服务

2、修改keepalived配置文件

Master配置文件内容
! Configuration File for keepalived
global_defs {
   router_id redis-225 ##设备名称
}
vrrp_×××tance VI_redis {
    state MASTER ##当前设备为master
    interface eth0 ##vip绑定的网卡
    virtual_router_id 79 ##备份组id,同一备份组要一致
    priority 100 ##优先级,优先级高的成为master
    advert_int 3 ##每多少秒进行一次健康检查
    authentication {
        auth_type PASS
        auth_pass redis
    }
    virtual_ipaddress {
        192.168.2.253 dev eth0 label eth0:1 ##vip地址并设置一个网卡别名
    }
}

BACKUP配置文件内容

! Configuration File for keepalived
global_defs {
   router_id redis-224
}
vrrp_script chkmaster {
        script "/etc/keepalived/scripts/chkmaster.sh" #检查当前redis是否为master
        interval 3 #每3秒检查一次
        weight 2 #当本机为master检测结果返回1,将优先级加2
        fall 2   ##检测失败多少次就才认为是真的失败
        rise 1    ##检测成功1为就认为是成功的
    }
vrrp_×××tance VI_redis {
    state BACKUP #本机的状态信息
    interface eth0 #vip绑定的网卡
    virtual_router_id 79 ##备份组id,同一备份组要一致
    priority 99 ##优先级,优先级高的成为master
    advert_int 3 ##每多少秒进行一次健康检查
    authentication {
        auth_type PASS
        auth_pass redis
    }
    virtual_ipaddress {
        192.168.2.253 dev eth0 label eth0:1
    }
    track_script { ##调用状态检查
        chkmaster
    }
}

状态检查脚本内容:

#!/bin/bash
STATUS=`/usr/local/bin/redis-cli info | grep role:master | wc -l`
echo $STATUS
if [ "$STATUS" -eq 0 ];then
    exit 1
else
    exit 0
fi

验证结果:

1. 关闭masterredis服务程序,查看vipredis主服务器切换到slave

2. 开启masterredis服务程序,redis服务以slave身份加入到slave服务器中

3. 关闭slave服务器的redis服务,查看vipredis主服务器切换到master

4. 开启slaveredis服务程序,redis服务以slave身份加入到master服务器中


遇到的一个主从不切换的坑

停掉master主从切换日志提示此错误

图片1.png

解决办法:

1)如果redis实例没有配置

protected-mode yes

bind 192.168.98.136

则在sentinel 配置文件加上

protected-mode no

即可

2)如果redis实例有配置

protected-mode yes

bind 192.168.98.136

则在sentinel 配置文件加上

protected-mode yes

bind 192.168.98.136


我是将redis配置文件和sentinel配置文件中都“protected-mode no”改为no重启服务解决了问题