sentinel作用:

redis sentinel是一个分布式架构,包含若干个sentinel节点和Redis数据节点,每个sentinel会对数据节点和其余sentinel节点进行监控,方发现节点不可达,会对节点标记下线。
如果表示的是主节点,那么sentinel会和其他sentinel节点进行协商,当定义的sentinel都觉得主节点不可达,就会选举出一个sentinel节点来完成故障转移工作,同时通知redis。

节点:
192.168.10.199 redis主节点 sentinel节点
192.168.10.200 redis从节点 sentinel节点
192.168.10.175 VIP

部署:
YUM:
yum install redis -y

redis主从配置:

主节点配置:
/etc/redis.conf:
daemonize	yes
appendonly	 yes
appendfilename "appendonly.aof"
appendfsync	everysec
port	6379
bind	0.0.0.0
timeout	10
save 900 1
save 300 10
save 60 10000
dbfilename "dump.rdb"
slave-read-only	yes
requirepass	“***”
masterauth	“***”
slave-priority	99
maxmemory	18000000000(18G)

daemonize	yes						是否已保护模式开启
appendonly	 yes					开启AOF持久化
appendfilename "appendonly.aof"		AOF持久化文件名称
appendfsync	everysec				每秒往AOF文件写入一次(消耗资源)
port	6379						定义端口
bind	0.0.0.0						绑定地址
timeout	10							连接超时时间(客户端空闲多久关闭连接)

save 900 1						    900秒内有1个键的改动,则做一次快照
save 300 10					 	    300秒内有10个键的改动,则做一次快照
save 60 10000					    60秒内有10000个键的改动,则做一次快照
这三个是“或关系”

dbfilename "dump.rdb"				RDB持久化文件名称
slave-read-only	yes			  		定义了从节点只能读
requirepass	“******”   				redis登录密码
masterauth	“******”  			    认证密码(因为主节点down掉变成从节点需要认证主节点,所以此处定义,如果没有故障转移,只是主从,无需定义)
slave-priority	99				    slave优先级(定义的越低,优先级越高)
maxmemory	18000000000(18G)    	定义的redis使用的最大内存

持久化方式根据实际情况选择即可!!!

从节点:
主从配置基本一致,注意logfile和port就ok,再添加下面一行
slaveof 192.168.10.199 6379

验证:
(1). redis-cli -p 6681 -a ******* info replication
主节点

从节点

(2) 主节点set一个值,去从节点get

至此,主从同步配置完成,接下来添加sentinel


部署sentinel:

编辑配置文件/etc/redis-sentinel.conf(如果出现问题可以添加loglevel debug查看)

主节点:
port		26379
logfile	/var/log/redis_6379/redis_26379.log
dir		/mnt/local0/redis_sentinel_26379
sentinel  monitor  mymaster  192.168.10.199  6379  2
sentinel  down-after-milliseconds  mymaster  10000
sentinel  failover-timeout  mymaster  5000
sentinel  auth-pass  mymaster  KMkm!Redisw00X

配置解释:
port		26379							定义端口

logfile	/var/log/redis_6379/redis_26379.log		定义sentinel日志

dir		/mnt/local0/redis_sentinel_26379		定义sentinel的工作目录

sentinel  monitor  mymaster  192.168.10.199  6379  2
定义了sentinel集群名称为“mymaster”,主节点为“192.168.10.199”,主节点端口为“6379”,2的意思是有几个sentinel节点认为主redis-server down掉之后才做故障转移。

sentinel  down-after-milliseconds  mymaster  10000
定义了主节点如果10秒内不回复sentinel,那么sentinel就认为主节点down掉,默认单位是毫秒

sentinel  failover-timeout  mymaster  5000
定义了故障转移时间,当开始failover的时候,所有的slave指向新的master所需要的时间

sentinel  auth-pass  mymaster  KMkm!Redisw00X
设置连接master和slave时的密码,注意的是sentinel不能给master和slave设置不同的密码,所以,master和slave的密码应该相同

从节点:
跟主节点一致就好

验证:

关掉主节点的redis-server,sentinel就会进行选举投票并完成故障转移
查看日志:tail -f /var/log/redis_6379/sentinel.log

因为Master是199,可以看到已经从199转到了200了

VIP解决方案:

此处我们做的redis主从+sentinel,那么连接的时候我们会提供一个IP和端口,那么问题来了,当我主节点down掉之后,从节点成为了主节点,那么IP已经变动了,怎么办?这里提出了VIP的解决方案。
redis始终向外提供一个VIP,redis进行故障转移时,需要做的就是把VIP从之前的redis服务器漂移到新的主redis服务器上。

实现:
在/etc/redis-sentinel.conf下添加一行,调用脚本
sentinel client-reconfig-script mymaster /opt/redis/redis.sh

脚本内容:
#!/bin/bash
MASTER_IP=$6  #第六个参数是新主redis的ip地址
LOCAL_IP='192.168.10.199' 
VIP='192.168.10.175'
NETMASK='24'
INTERFACE='em1'
if [ ${MASTER_IP} = ${LOCAL_IP} ];then
    /sbin/ip  addr  add ${VIP}/${NETMASK}  dev ${INTERFACE}  #将VIP绑定到该服务器上
    /sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}
    exit 0
else
   /sbin/ip  addr del  ${VIP}/${NETMASK}  dev ${INTERFACE}   #将VIP从该服务器上删除
   exit 0
fi
exit 1  #如果返回1,sentinel会一直执行这个脚本

需要注意的是,当你第一次使用脚本的时候,要在主节点上手动创建VIP
ip addr add 192.168.10.175/24 dev em1
arping -q -c 3 -A 192.168.10.175 -I em1

验证:
使用VIP登录redis及sentinel
关闭主节点后,VIP正常使用,集群正常运行。


FAQ:

当我主从节点部署成功之后,开启了sentinel节点,但是查看日志的时候发现主节点不会恢复sentinel,那么就会导致过了10秒之后,我sentinel认为主redis-server节点down掉了?
解决过程:
1.首先确定自己的配置没有问题;
2.想到了是不是防火墙做了限制,事实证明并没有;
3.在sentinel里开启了loglevel debug,结果发现输出的日志上明确指出了没有认证,原来sentinel发送请求的时候没有认证主redis-server的密码,所以导致过了10s(down-after-milliseconds),sentinel没有收到主redis-server的回复,就认为主redis down掉了
在sentinel的配置文件里添加:
sentinel auth-pass mymaster ******
就OK了!


如发现以上有问题,请一定告知!!!