什么是Sentinel哨兵监控
前面搭建了主从复制,也了解到当主服务器宕机后,需要手动的把一台从服务器切换成主服务器。是不是感觉很麻烦?没错这样的话不仅费人工,还会造成一段时间内服务不可用,这显然是不可行的。所有,Redis就有了哨兵模式。Redis提供了哨兵命令,它是一个独立的进程哨兵通过发送命令给多个节点,并让Redis的服务器响应,从而来监控Redis实例的运行情况。当哨兵检查到主节点宕机了,会自动将从节点切换成主节点,并通知其他的从服务器修改配置文件切换主机。
Sentinel有三大任务
任务一:监控,Sentinel不会断地检查你的主服务器和从服务器是否工作正常。
任务二:提醒,当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他的应用程序来发送通知,提醒发现故障了。
任务三:自动故障转移,上面我们提到需要人工进行故障转移,而使用Sentinel就可以实现自动转移了。当一个主服务器不能正常工作的时候,Sentinel会开始自动故障转移操作,它会将故障的主服务器下的其中一个从服务器升级成主服务器,并让这个故障的主服务器下的所有从服务器改为复制新的主服务器。当客户端连接失败主服务器时,也会向客户端返回一个新的服务器地址,使得可以使用新的服务器地址来代连接失败的主服务器。
思考一下,这样是否会出现问题呢?一个哨兵进程对Redis服务器进行监控,如果因为网络问题呢,哨兵得不到服务器的响应了,这时你就会想那设置多个哨兵同时进行监控不就好了。但是多个哨兵监控的话,会形成多哨兵模式,接下来讲解一下多哨兵模式。
多哨兵模式下线名称介绍
主观下线(Subjectively Down,简称SDOWN)
是单个Sentinel实例对服务器做出下线的判断,比如上面所说的网络问题接受不到通知等。在一个服务器没有在down-after-milliseconds选项的指定时间内给Sentinel进行响应,那么Sentinel就会认为主管服务器已经下线了(理解成故障也可以)。
客观下线(Objectively Down,简称ODOWN)
指的多个Sentinel在对同一个服务器做出SDOWN判断,并且哨兵通过SENTINEL is-master-down-by-addr命令进行相互交流之后,得出服务器是否是下线。
客观下线这种条件只适用于主服务器
仲裁quornm
当在Sentinel给定的时间范围内,从其他Sentinel接受到了足够数量的主服务器下线报告,那么Sentinel就会将主服务器的状态从主动下线改成客观下线。这个足够数量就是配置文件中的值,一般设置为Sentinel的个数一般加1,比如4个Sentinel就设置成3个。
Sentinel哨兵搭建环境准备
核心流程:设置每秒ping,服务器超过指定时间不响应,那么就任务该服务器是主观下线的。多个哨兵任务主服务器是下线的话,那么就认为是客观下线,然后进行投票,在该主服务器下选择从服务器变成主服务器。如果没有足够数量同意这个主服务器下线,那么该服务器的状态就会被移除。
环境准备:
第一步:配置三个哨兵,每个哨兵的配置都是一样的。
第二步:启动的先后顺序为主服务器->从服务器->哨兵。
第三部:哨兵的端口号是:26379(记得要开放)
#不限制ip
bind 0.0.0.0
# 让sentinel服务后台运⾏
daemonize yes
# 配置监听的主服务器,mymaster代表服务器的名称,⾃定义,172.18.172.109 代表监控的主服务器,6379代表端⼝,
#2代表只有两个或两个以上的哨兵认为主服务器不可⽤的时候,才会进⾏failover操作。
sentinel monitor mymaster 172.18.172.109 6379 2
# sentinel auth-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码
sentinel auth-pass mymaster 123456
#超过5秒master还没有连接上,则认为master已经停⽌
sentinel down-after-milliseconds mymaster 5000
#如果该时间内没完成failover操作,则认为本次
failover失败
sentinel failover-timeout mymaster 30000
在redis/conf目录下创建三个哨兵
sentinel-1.conf
port 26379
bind 0.0.0.0
daemonize yes
pidfile "/var/run/redis-sentinel-1.pid"
logfile "/var/log/redis/sentinel_26379.log"
dir "/tmp"
sentinel monitor mymaster 8.129.113.233 6379
2
sentinel down-after-milliseconds mymaster
5000
sentinel auth-pass mymaster 123456
sentinel failover-timeout mymaster 30000
sentinel-2.conf
port 26380
bind 0.0.0.0
daemonize yes
pidfile "/var/run/redis-sentinel-2.pid"
logfile "/var/log/redis/sentinel_26380.log"
dir "/tmp"
sentinel monitor mymaster 8.129.113.233 6379
2
sentinel down-after-milliseconds mymaster
5000
sentinel auth-pass mymaster 123456
sentinel failover-timeout mymaster 30000
sentinel-3.conf
port 26381
bind 0.0.0.0
daemonize yes
pidfile "/var/run/redis-sentinel-3.pid"
logfile "/var/log/redis/sentinel_26381.log"
dir "/tmp"
sentinel monitor mymaster 8.129.113.233 6379
2
sentinel down-after-milliseconds mymaster
5000
sentinel auth-pass mymaster 123456
sentinel failover-timeout mymaster 30000
记得创建目录/var/log/redis文件夹,主要是用于存放哨兵的log日志文件
启动哨兵(启动哨兵失败需要开放网络安全组的端口)
./redis-server /usr/local/redis/conf/sentinel-1.conf --sentinel
./redis-server /usr/local/redis/conf/sentinel-2.conf --sentinel
./redis-server /usr/local/redis/conf/sentinel-3.conf --sentinel
优点:主从可以自动切换,可用性更高了。
缺点:主节点的写能力和存储能力受限
简单分析下日志
1.老大掉线了
2.疯狂向老大发送询问(老大,你挂掉没?没回答,就应该是挂掉了,这时哨兵就辅助从节点变成老大)
3.自己就成为了老大MASTER MODE enabled
4.跟其他小弟进行数据请求(前老大都挂了,你们还不跟我?)
5.接着就是新的主从建立好了
SpringBoot整合Redis主从+Sentinel哨兵
在上面已经清楚了解到如何在Redis中使用哨兵,并且如何搭建哨兵环境。接下来开始使用SpringBoot+Sentinel哨兵的整合。
首先在application.yml中配置中注释掉Redis的host与port
在添加新的配置(哨兵相关配置)
sentinel:
master: mymaster
nodes: 8.129.113.233:26379,8.129.113.233:26380,8.129.113.233:26381
这样就可以在项目中配置好Redis的哨兵相关配置了,哨兵在Redis里是使用得比较频繁的。