哨兵模式
Redis 2.8引入,Rentinel哨兵模式
哨兵模式是一种特殊的模式,它是一个独立的进程
,其原理是:哨兵通过发送命令,等待redis服务器响应,从而监控运行的多个redis实例。
哨兵模式的作用:
- 通过发送命令,让redis服务器返回监控的运行状态(包括主从所有节点)
- 当哨兵检测到master宕机,会在自动将slave切换为master,然后通过
发布订阅模式
通知其他的从服务器,修改配置文件,让他们切换主服务器节点
一般情况下使用多个哨兵进行监控,且哨兵之间互相监督:
当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
如果之前端口为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)