Redis哨兵模式

suaxi
2021-01-03 / 0 评论 / 145 阅读 / 正在检测是否收录...

哨兵模式

Redis 2.8引入,Rentinel哨兵模式

哨兵模式是一种特殊的模式,它是一个独立的进程,其原理是:哨兵通过发送命令,等待redis服务器响应,从而监控运行的多个redis实例。

哨兵模式的作用:

  • 通过发送命令,让redis服务器返回监控的运行状态(包括主从所有节点)
  • 当哨兵检测到master宕机,会在自动将slave切换为master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让他们切换主服务器节点

一般情况下使用多个哨兵进行监控,且哨兵之间互相监督:

4.哨兵监控原理.png

当master节点出现问题时,哨兵01先检测到问题,系统并不会马上进行failover,仅仅是哨兵01主观的认为主节点不可用,这个过程称为主观下线。当其他哨兵也检测到主节点服务不可用时,并且数量达到了一定的值,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover(故障转移)操作。当切换完成之后,就会通过发布订阅模式让各个哨兵把自己监控的节点进行master主节点切换(从故障节点切换为投票后票数最高的节点),这个过程称为客观下线。


测试

1、redis配置文件目录下新建sentinel.conf

#sentinel monitor 被监控名 主机地址 端口 1
sentinel monitor myredis 127.0.0.1 6380 1
#master节点密码(必须配置)
sentinel auth-pass myredis 123456

后面的数字1,代表当主机出现问题时,slave进行投票决定让谁成为主机,票数最多的成为主节点

2、启动哨兵模式

[root@suaxi bin]# redis-sentinel sconf/sentinel.conf 
19524:X 03 Jan 2021 21:33:38.148 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
19524:X 03 Jan 2021 21:33:38.148 # Redis version=6.0.9, bits=64, commit=00000000, modified=0, pid=1 started
19524:X 03 Jan 2021 21:33:38.148 # Configuration loaded
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 6.0.9 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 19524
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

19524:X 03 Jan 2021 21:33:38.149 # Sentinel ID is dce67565b60ad27529a7bbcfe2457faa3a306c4e
19524:X 03 Jan 2021 21:33:38.149 # +monitor master myredis 127.0.0.1 6379 quorum 1
19524:X 03 Jan 2021 21:33:38.151 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6
19524:X 03 Jan 2021 21:33:38.155 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 127.0.0.1 6
19524:X 03 Jan 2021 21:34:20.556 # +sdown master myredis 127.0.0.1 6379
19524:X 03 Jan 2021 21:34:20.556 # +odown master myredis 127.0.0.1 6379 #quorum 1/1
19524:X 03 Jan 2021 21:34:20.556 # +new-epoch 3
19524:X 03 Jan 2021 21:34:20.556 # +try-failover master myredis 127.0.0.1 6379
19524:X 03 Jan 2021 21:34:20.560 # +vote-for-leader dce67565b60ad27529a7bbcfe2457faa3a306c4e 3
19524:X 03 Jan 2021 21:34:20.560 # +elected-leader master myredis 127.0.0.1 6379
19524:X 03 Jan 2021 21:34:20.560 # +failover-state-select-slave master myredis 127.0.0.1 6379
19524:X 03 Jan 2021 21:34:20.622 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 1279
19524:X 03 Jan 2021 21:34:20.622 * +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.yredis 127.0.0.1 6379
19524:X 03 Jan 2021 21:34:20.674 * +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 63is 127.0.0.1 6379
19524:X 03 Jan 2021 21:34:21.037 # +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 1279
19524:X 03 Jan 2021 21:34:21.037 # +failover-state-reconf-slaves master myredis 127.0.0.1 6379
19524:X 03 Jan 2021 21:34:21.104 * +slave-reconf-sent slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 6379
19524:X 03 Jan 2021 21:34:22.060 * +slave-reconf-inprog slave 127.0.0.1:6381 127.0.0.1 6381 @ myred.1 6379

3.failover故障转移.png

如果之前端口为6379的主节点重新恢复后,不能再成为主节点,哨兵模式会将其分配为slave从节点


优缺点

优点:

1、哨兵模式集群基于主从复制模式
2、主从切换,系统可用性更好

缺点:

1、哨兵集群容量很大,在线扩容不方便
2、哨兵模式配置繁杂

sentinel.conf详细配置
# Example sentinel.conf

# 运行端口默认26379
 port 26379

# 工作目录
 dir /tmp

# 监控的redis主节点
# master-name 可自定义命名的主节点名字,只能由字母A-Z、数字0-9、.-_等字符组成
# quorum 配置多少个哨兵节点同意认为master节点失联,这时客观认为主节点已失联(客观下线)
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
 sentinel monitor myredis 127.0.0.1 6379 1

# 设置哨兵连接主节点的密码
# sentinel auth-pass <master-name> <password>
 sentinel auth-pass myredis 123456

# 指定多少毫秒后,主节点没有应答哨兵监控,哨兵主观上认为主节点出现问题,默认为30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>
 sentinel down-after-milliseconds myredis 30000

# 指定在发生failover[故障转移]主备切换时,有多少个slave节点同时对新的master节点进行同步
# 数字越小,完成failover的时间越长,数字越大,越多的slave节点会因replication而不可用
# 可将这个值设为1,来保证每次只有一个slave节点处于不能处理命令请求的状态
# sentinel parallel-syncs <master-name> <numslaves>
 sentinel parallel-syncs myredis 1

# 故障转移超时时间 failover-timeout,可用于以下几个方面
# 1.同一个sentinel对同一个master两次failover之间的时间间隔
# 2.当一个slave从一个出现问题的master那里同步数据开始计算时间,直到slave被纠正为向正确的master同步数据时
# 3.当想要取消一个正在进行failover所需要的时间
# 4.当进行failover时,配置所有slave指向新的master所需的最大时间(即使过了这个时间,slave依然会被配置到正确的master,此时不遵循parallel-syncs规则)
# 默认为三分钟,单位毫秒
# sentinel failover-timeout <master-name> <milliseconds>
 sentinel failover-timeout myredis 180000

# SCRIPTS EXECUTION

# 配置当某一事件发生时所需要执行的脚本,以此来通知管理员
# 1.若脚本执行后返回1,那么该脚本稍后会被再次执行,默认次数为10
# 2.若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会被重复执行
# 3.如果脚本在执行过程中收到系统中断信号而被终止,则与返回值为1时的操作一致
# 一个脚本的最大执行时间为60s,将会被SIGKILL信号终止,之后重新执行

# 通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,一个是事件的类型,一个是事件的描述。如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。
# sentinel notification-script <master-name> <script-path>
 sentinel notification-script myredis /var/redis/notify.sh

# 客户端重新配置主节点参数脚本  
# 当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。  
# 以下参数将会在调用脚本时传给脚本:  
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>  
# 目前<state>总是“failover”,  
# <role>是“leader”或者“observer”中的一个。   
# 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的  
# 这个脚本应该是通用的,能被多次调用,不是针对性的。
# sentinel client-reconfig-script <master-name> <script-path>
 sentinel client-reconfig-script myredis /var/redis/reconfig.sh
0

评论 (0)

取消