1  概述

redis作为缓存工具,如果仅仅单机,一旦挂掉,将对业务造成严重的影响,因此建议生产环境上部署redis高可用环境,本文将基于Sentinel + keepalived 实现redis的高可用。

本文主要介绍实现的步骤和配置文件,不做原理上的介绍

注意,redis的Sentinel高可用有一个很关键的点,只有master节点可以写入,其他节点都只能读,不能写,所以,vip必须配置在master节点上

三台redis ip 分别为

主节点: 192.168.70.32

备节点1:192.168.70.33

备节点2:192.168.70.34

VIP:192.168.70.35

2  部署keepalived

这里采用编译安装来实现。

服务包:keepalived-1.4.3.tar.gz

步骤如下

yum -y install curl gcc openssl-devel libnl3-devel net-snmp-devel popt-devel libnfnetlink-devel
tar xf keepalived-1.4.3.tar.gz -C /usr/local/
cd /usr/local/keepalived-1.4.3/
./configure --prefix=/app/keepalived
make
make install
mkdir /etc/keepalived
vim /etc/keepalived/keepalived.conf 
#注意,keepalived.conf的配置文件很关键,是实现高可用的关键环节,内容太多,这里把配置文件作为附件放着文章后面,配置文件里主要是 要对redis的主节点进行监控
cp /usr/local/keepalived-1.4.3/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/keepalived
cp /app/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /app/keepalived/sbin/keepalived /usr/sbin/
chown root:root /etc/init.d/keepalived 
chmod u+s /app/keepalived/sbin/keepalived
chkconfig --add keepalived 
chkconfig keepalived on

到这里keepalived配置完成

3  redis部署

3.1 redis编译安装

服务包:redis-4.0.8.tar.gz

tar -xzf redis-4.0.8.tar.gz  -C /app

#添加make 

cd /app/redis-4.0.8/src
make
make test

#如果以上步骤遇到 You need tcl 8.5 or newer in order to run the Redis test 的报错,安装tcl,命令yum install tcl -y

#设置开机启动

vim /etc/rc.d/rc.local
/app/redis-4.0.8/src/redis-server /app/redis-4.0.8/redis.conf

#添加PATH

vim /etc/profile.d/redis.sh 
export PATH=/app/redis-4.0.8/src:$PATH
source /etc/profile.d/redis.sh

#编辑配置文件

主节点配置修改如下:

vim /app/redis-4.0.8/redis.conf
bind 0.0.0.0
daemonize yes 
requirepass redis123456
dir "/appdata/redis"   #指定数据持久化保持的路径
appendonly yes  #是否持久化数据
appendfilename "appendonly.aof"  #持久化数据的文件名称
masterauth "redis123456"     #指定密码

备用节点

bind 0.0.0.0
daemonize yes 
requirepass redis123456
dir "/appdata/redis"   #指定数据持久化保持的路径
appendonly yes  #是否持久化数据
appendfilename "appendonly.aof"  #持久化数据的文件名称
masterauth "redis123456"     #指定密码
slave-priority 90       #和主节点的区别,主节点不需要配置这条命令

主备其他的配置选择默认即可

#启动redis服务

/app/redis-4.0.8/src/redis-server /app/redis-4.0.8/redis.conf

3.2  配置sentinel

主备节点都是一样的配置

vim  /app/redis-4.0.8/sentinel.conf 
protected-mode yes #很关键,如果protected-mode和bind两行没有配置,将导致redis的master节点故障后不会转移
bind 0.0.0.0
daemonize yes #后台运行
port 26379
dir "/tmp"
sentinel monitor mymaster 192.168.70.32 6379 2   #配置主节点的ip,另外2表示有3台sentinel,如果5台sentinel,这里配置5
sentinel down-after-milliseconds mymaster 3000  #故障转移时间,单位ms
sentinel failover-timeout mymaster 18000
sentinel auth-pass mymaster redis123456

其他配置可以保持不变

另外,该文件,会跟进master故障转移,自动写入一部分配置,如下截图

image.png

启动sentinel
/app/redis-4.0.8/src/redis-sentinel  /app/redis-4.0.8/sentinel.conf 
写入配置自启动文件
vim /etc/rc.local
/app/redis-4.0.8/src/redis-sentinel  /app/redis-4.0.8/sentinel.conf

4  测试

所有的节点都启动后,就可以 测试高可用

从任意机器连接vip

[root@redis-01 ~]# redis-cli -a redis123456 -h 192.168.70.35

192.168.70.35:6379> get key

"abc"

192.168.70.35:6379> set key abcd

OK

192.168.70.35:6379> get key

"abcd"

192.168.70.35:6379> 

假设,vip 配置在 192.168.70.32服务器上,把这台服务器的redis进程杀掉后,vip会转移到其他两台的任意一样,并且vip可以正常访问

则高可用实现

以上实现高可用,对vip的转移,还有bind的ip配置很关键,会成功环境不成功的问题所在

5  附件

keepalived配置文件

主从配置就四点不一样

router_id不一样

优先级不一样

state主从不一样

从节点配置不抢占ip ,nopreempt,可以 配置在 track_script配置段下

如下

    track_script {
            chk_redis_master
          }
        nopreempt

主配置文件如下

vim /etc/keepalived/keepalived.conf
#Keepalived配置文件
global_defs {
        router_id NodeA                 #路由ID, 主备的ID不能相同
}
vrrp_script chk_redis_master {
    script "/app/redis-4.0.8/src/redis-cli -a redis123456 info | grep role:master >/dev/null 2>&1"
#以上这个命令是整个高可用的关键,保证了当本节点不是master时,vip进行转移到role 为master的节点上,如果不成功,redis-cli需要写绝对路径
    interval 1
    timeout 2
    fall 2
    rise 1
}
vrrp_sync_group VG_1 {
    group {
        VI_1
    }
}
vrrp_instance VI_1 {
        state MASTER #Keepalived的角色。Master表示主服务器,从服务器设置为BACKUP
        interface eth0          #指定监测网卡
        virtual_router_id 35
        priority 100            #优先级,BACKUP机器上的优先级要小于这个值
        advert_int 1            #设置主备之间的检查时间,单位为s
        authentication {        #定义验证类型和密码
                auth_type PASS
                auth_pass Pass1234
        }
        virtual_ipaddress {     #VIP地址,可以设置多个:
                192.168.70.35
        }
        track_script {
            chk_redis_master
          }
}