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故障转移,自动写入一部分配置,如下截图
启动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
[[email protected] ~]# 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 } }
原文地址:http://blog.51cto.com/ghbsunny/2154262