Redis(四):Redis哨兵模式

1、哨兵原理:

哨兵机制的出现是为了解决主从复制的缺点的。

Redis-sentinel本身也是一个独立运行的进程

该进程执行以下三个任务:

  • 监控 Sentinel 会不断地检查你的主服务器和从服务器是否运作正常  (每个sentine哨兵节点每隔1s会向主节点、从节点及其余哨兵节点发送一次ping命令做一次心跳检测,判断节点是否正常),每个sentine哨兵节点每10s会向主节点和从节点发送info,获取主从拓扑结构图,并感知新节点
  • 提醒:当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知 (通过消息publish和subscribe来完成的)
  • 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

1.1判断主节点宕机:

当某sentine节点发现主节点宕机后(主观下线),该sentine节点会通过指令sentinel is-masterdown-by-addr 寻求哨兵集群中的其他节点对主节点的判断,
当超过quorum(选举)个数,此时哨兵节点则认为该主节点确实有问题(大部分哨兵节点都同意下线操作,也叫客观下线)

故障转移的工作只需要一个Sentinel节点来完成即可,所以Sentinel节点之间会做一个领导者选举的工作

1.2 sentine领导者选举Raft算法

  • 每个在线的哨兵节点都可以成为领导者,当它确认(比如哨兵3)主节点下线时,会向其它哨兵发is-master-down-by-addr命令,征求判断并要求将自己设置为领导者,由领导者处理故障转移;
  • 当其它哨兵收到此命令时,可以同意或者拒绝它成为领导者;
  • 如果哨兵3发现自己在选举的票数大于等于num(sentinels)/2+1时,将成为领导者,如果没有超过,继续选举

领导者选举出的Sentinel节点负责故障转移

1.3主节点选举:选举出可以代替主节点的slave从节点

  • 选择健康状态从节点(过滤掉主观下线、断线),排除5秒钟没有心跳的、排除主节点失联超过10*down-after-millisecends
  • 选择slave-priority高的从节点优先级列表
  • 选择偏移量大的
  • 选择runid小的

Redis(四):Redis哨兵模式_第1张图片

2、哨兵配置

  • 在个redis节点下创建sentinel.conf配置文件
  • 哨兵启动命令 redis-server.exe sentinel.conf --sentinel

# 哨兵sentinel实例运行的端口 默认26379
port 26379  
  
# 哨兵sentinel的工作目录  
dir /tmp  
  
# 哨兵sentinel监控的redis主节点的 ip port   
# sentinel monitor      
  sentinel monitor mymaster 127.0.0.1 6379 2  
  
# 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供密码  
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码  
# sentinel auth-pass    
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd  
  
  
# 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒  
# sentinel down-after-milliseconds    
sentinel down-after-milliseconds mymaster 30000  
  

# 执行故障转移时, 最多有1个从服务器同时对新的主服务器进行同步,这个数字越小,完成failover所需的时间就越长,  
# 但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。  
# sentinel parallel-syncs    
sentinel parallel-syncs mymaster 1  
  
  
  
# 故障转移的超时时间 failover-timeout 可以用在以下这些方面:   
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。  
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。  
#3.当想要取消一个正在进行的failover所需要的时间。    
#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了  
# 默认三分钟  
# sentinel failover-timeout    
sentinel failover-timeout mymaster 180000  
  
# SCRIPTS EXECUTION  
  
#配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。  
#对于脚本的运行结果有以下规则:  
#若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10  
#若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。  
#如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。  
#一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。  
  
#通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,  
这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,  
一个是事件的类型,  
一个是事件的描述。  
如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。  
#通知脚本  
# sentinel notification-script    
  sentinel notification-script mymaster /var/redis/notify.sh  
  
# 客户端重新配置主节点参数脚本  
# 当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。  
# 以下参数将会在调用脚本时传给脚本:  
#         
# 目前总是“failover”,  
# 是“leader”或者“observer”中的一个。   
# 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的  
# 这个脚本应该是通用的,能被多次调用,不是针对性的。  
# sentinel client-reconfig-script    
 sentinel client-reconfig-script mymaster /var/redis/reconfig.sh 

 

你可能感兴趣的:(Redis)