个人笔记-Redis-哨兵模式

卡bug的鱼

Redis是最为常用的缓存中间件之一,单机模式的Redis有宕机的风险,并且单机性能受限于CPU的处理性能,在需要高性能、高可靠的场景中,单机Redis就不太合适了,这时可以采用Redis的哨兵模式。

1. 简介

哨兵是用于监控redis集群中master状态的工具,本质是一个独立于redis服务的独立线程,哨兵模式已被集成在redis2.4之后的版本中,这里的哨兵有两个作用:

  1. 监控状态:通过发送命令,监控主服务器、从服务器和其他哨兵的状态;
  2. 主从切换:当哨兵检测到master宕机,则会通过订阅模式通知其他slave服务器,修改配置文件,使其中一个成为master服务器;

在没有出现哨兵模式前,主从切换的主要过程是:当主服务器由于故障不能提供服务,需要手动将从节点晋升为主节点,不仅浪费人力,更浪费时间,还会造成一段时间内的服务不可用,在很多场景中,这种故障处理方式是无法接受的。

哨兵模式下的故障切换过程大致如下:

  1. 每个哨兵进程以每秒一次的频率向Redis集群中的主服务器、从服务器和其他哨兵发送一个ping命令;
  2. 如果一个实例举例最后一次回复ping命令的超过down-after-milliseconds选项所指定的值,则这个实例会被哨兵标记为主观下线
  3. 当有足够数量的哨兵进程(大于等于配置文件中指定的值)在指定时间范围内确认了master服务器进入了主观下线,则master服务器会被标记为客观下线;这时哨兵之间会进行一次投票,投票的结果将决定是否进行故障切换,若是,则由其中一个哨兵将宕机master下某个slave节点选举为master节点,然后通过订阅发布模式通知其他哨兵,让它们将自己监控的slave服务器切换到新的主服务器上;
  4. 这个过程对于客户端而言是透明的;

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  <端口>
slaveof 127.0.0.1 6379
# 配置所属master服务器的服务密码,格式为:master auth 
master auth 123456

3. 搭建哨兵模式

在主从分离模式下,我们可以修改哨兵的配置文件来实现哨兵模式,其主要核心的配置如下:

### sentinel的sentinel.conf

# 配置监听的主服务器,格式为:sentinel monitor <自定义服务器名称>  <端口> <权值> 
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

你可能感兴趣的:(缓存)