Redis是最为常用的缓存中间件之一,单机模式的Redis有宕机的风险,并且单机性能受限于CPU的处理性能,在需要高性能、高可靠的场景中,单机Redis就不太合适了,这时可以采用Redis的哨兵模式。
1. 简介
哨兵是用于监控redis集群中master状态的工具,本质是一个独立于redis服务的独立线程,哨兵模式已被集成在redis2.4之后的版本中,这里的哨兵有两个作用:
- 监控状态:通过发送命令,监控主服务器、从服务器和其他哨兵的状态;
- 主从切换:当哨兵检测到master宕机,则会通过订阅模式通知其他slave服务器,修改配置文件,使其中一个成为master服务器;
在没有出现哨兵模式前,主从切换的主要过程是:当主服务器由于故障不能提供服务,需要手动将从节点晋升为主节点,不仅浪费人力,更浪费时间,还会造成一段时间内的服务不可用,在很多场景中,这种故障处理方式是无法接受的。
哨兵模式下的故障切换过程大致如下:
- 每个哨兵进程以每秒一次的频率向Redis集群中的主服务器、从服务器和其他哨兵发送一个ping命令;
- 如果一个实例举例最后一次回复ping命令的超过
down-after-milliseconds
选项所指定的值,则这个实例会被哨兵标记为主观下线
; - 当有足够数量的哨兵进程(大于等于配置文件中指定的值)在指定时间范围内确认了master服务器进入了主观下线,则master服务器会被标记为
客观下线
;这时哨兵之间会进行一次投票,投票的结果将决定是否进行故障切换,若是,则由其中一个哨兵将宕机master下某个slave节点选举为master节点,然后通过订阅发布模式通知其他哨兵,让它们将自己监控的slave服务器切换到新的主服务器上; - 这个过程对于客户端而言是透明的;
2. 搭建主从分离
Redis的主从分离是哨兵模式的基础,在主从分离模式下,存在一个master服务器和若干个slave服务器,master服务器可读可写,slave服务器只能读,配置主从分离需要分别修改master和slave的配置文件,然后重启使之生效。
master服务器不需要太多特殊修改,只要保证关键参数不与slave服务器发生冲突即可:
### master的redis.conf
# 服务占用端口
port 6379
# 服务使用的pidfile
pidfile /var/run/redis_6379.pid
# 设置服务密码
requirepass 123456
slave服务器需要指定它所属的master服务器,如果master服务器设置了服务密码,那么也需要在slave服务器中配置相应密码:
### slave的redis.conf
# 服务占用端口
port 6380
# 服务使用的pidfile
pidfile /var/run/redis_6380.pid
# 所属master服务器,格式为: slaveof <ip> <端口>
slaveof 127.0.0.1 6379
# 配置所属master服务器的服务密码,格式为:master auth <password>
master auth 123456
3. 搭建哨兵模式
在主从分离模式下,我们可以修改哨兵的配置文件来实现哨兵模式,其主要核心的配置如下:
### sentinel的sentinel.conf
# 配置监听的主服务器,格式为:sentinel monitor <自定义服务器名称> <ip> <端口> <权值>
sentinel monitor mymaster 127.0.0.1 6379 1
# 配置master节点的服务密码,格式为:sentinel auth-pass <自定义服务器名称> <密码>
sentinel auth-pass mymaster 123456
修改好配置文件后,依次重启各个服务,顺序为:master服务器、slave服务器、sentinel哨兵。
4. 代码使用
Redis哨兵模式在spring cloud项目中的使用主要是通过修改application.yml 配置文件来实现的,主要配置如下:
spring:
redis:
sentinel:
master: mymaster
nodes:
- 127.0.0.1:26379
- 127.0.0.1:26380
password: 123456
lettuce:
pool:
max-active: 200
max-idle: 20
min-idle: 5
max-wait: -1ms