您的位置:首页 > 数据库 > Redis

Redis 高可用 基于Sentinel + keepalived 实现

2018-08-03 20:20 816 查看
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
注意,时间一定要同步,否则集群功能异常,如不能启动集群,或者集群master不会转移
如果sentinel日志中有如下的报错,则可能是服务器时间不对,导致了节点不会转移,检查服务器时间问题,如果是虚拟机,如esxi系统,可能是esxi系统时间异常导致该esxi上服务器时间全部异常,要重点检查。
1926:X 26 Aug 01:02:09.334 # +tilt #tilt mode entered
1926:X 26 Aug 01:02:39.402 # -tilt #tilt mode exited
只要服务器时间正确,按照以下的配置,基本可以实现高可用,即故障转移。
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就一定会成功主节点,不建议配置这个选项
slaveof 192.168.70.32 6379
主备其他的配置选择默认即可

#启动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
logfile "/tmp/26379.log" #日志路径,可不写,排查故障时建议写
loglevel debug  #调试时使用,一般不配置
其他配置可以保持不变
另外,该文件,会跟进master故障转移,自动写入一部分配置,如下截图



启动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
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis Sentinel keepalive