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了!
如发现以上有问题,请一定告知!!!