1 概述redis
redis做为缓存工具,若是仅仅单机,一旦挂掉,将对业务形成严重的影响,所以建议生产环境上部署redis高可用环境,本文将基于Sentinel + keepalived 实现redis的高可用。vim
本文主要介绍实现的步骤和配置文件,不作原理上的介绍缓存
注意,redis的Sentinel高可用有一个很关键的点,只有master节点能够写入,其余节点都只能读,不能写,因此,vip必须配置在master节点上bash
三台redis ip 分别为服务器
主节点: 192.168.70.32app
备节点1:192.168.70.33curl
备节点2:192.168.70.34ide
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 redis dir "/appdata/redis" #指定数据持久化保持的路径 appendonly yes #是否持久化数据 appendfilename "appendonly.aof" #持久化数据的文件名称 masterauth "redis" #指定密码
备用节点
bind 0.0.0.0 daemonize yes requirepass redis dir "/appdata/redis" #指定数据持久化保持的路径 appendonly yes #是否持久化数据 appendfilename "appendonly.aof" #持久化数据的文件名称 masterauth "redis" #指定密码 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 #关闭redis /app/redis-4.0.8/src/redis-cli -h 127.0.0.1 -p 6379 -a redis shutdown
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 redis 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 redis -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 redis 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 Pass123456789 } virtual_ipaddress { #VIP地址,能够设置多个: 192.168.70.35 } track_script { chk_redis_master } }