Redis学习笔记三 哨兵(Sentinel)

 Sentinel?

监测:会不断的监测主实例和从实例是否正常工作

通知:可以通过API通知开发者,redis某个实例有问题

自动故障转移:如果master出现问题,Sentinel可以启动自动故障转移,根据一些特定的要求将优先级高的副本提升为master

配置提供者:客户端连接上Sentinel,Sentinel可以拿到客户端的配置信息。

例如:Sentinel拿到master节点的数据,因为mster保存了从节点的配置信息 所以Sentinel也有了从节点的配置信息

 

 Sentinel运行

   Sentinel配置和redis使用配置是一样的只是默认配置文件使用一个自定义的sentinel.conf的配置文件,最小的配置文件如下:

port 26379
logfile "Logs_26379/redis_log.txt"
# 监视redis实例  2 代表至少需要2个 Sentinel 同意 (只要同意 Sentinel 的数量不达标,自动故障迁移就不会执行)。
#因此,例如,如果您有 5 个 Sentinel 进程,并且给定主进程的法定人数设置为 2,则会发生以下情况:
#   如果两个 Sentinel 同时同意 master 不可访问,则两个 Sentinel 中的一个将尝试启动故障转移。
#   如果总共至少有三个 Sentinel 可达,则故障转移将被授权并实际启动。
sentinel monitor mymaster 127.0.0.1 6379 2

# 如果服务器在给定的毫秒数之内, 没有返回 Sentinel 发送的 PING 命令的回复, 或者返回一个错误, 那么 Sentinel 将这个服务器标记为主观下线
sentinel down-after-milliseconds mymaster 30000

# 指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长
sentinel parallel-syncs mymaster 1

# 故障转移超时时间
sentinel failover-timeout mymaster 180000

 

监控实现

  Sentinel如何检查客户端是否正常运行,一般大多数实现监控都是通过有一个health接口通过访问接口是否能返回正常数据来判断,Sentinel也很相似也是通过定时请求的方式实现。

   Sentinel三个定时监控任务

     定时任务1:每隔10s  Sentinel节点会向redis数据节点发送info命令获取最新拓扑信息

     定时任务2:每隔2s   对redis数据节点发送命令获取其他Sentinel对这个节点判断作为客观下线的判断

    定时任务3:每隔1s  Sentinel会向redis数据节点和其他Sentinel节点发送一条ping,由此来确定发送的节点是否正常运行

节点下线判断依据

  主观下线:Sentinel节点每隔1s会向redis数据节点和其他Sentinel节点发送一条ping来检查如果检查节点没能在down-after-milliseconds设置的时间内回应则这个Sentinel主观上判断这个节点以下线

       down-after-milliseconds:在配置Sentinel时Config文件中会有配置

客观下线:当Sentinel判断某个节点主观下线了,这时候他会问其他Sentinel节点对某个节点的判断当超过一半的节点判断此节点下线,则同意此节点下线

    注:因为需要超过一半的节点来判断所以一一般Sentinel部署的台数一般是单数,而且是三台以上,这样就不会出现打平的现象

 

故障转移

     当Sentinl 判断了某个节点为客观下线后,就会进行故障转移

故障转移步骤:

   选择新的从节点

     从节点选择逻辑:

       1.过滤不健康的从节点

       2.选择slave-priority (从节点优先级)最高的从节点列表如果存在则返回,没有则继续判断

       3. 选择复制偏移量最大的从节点(复制最完整的 )如果存在则返回,没有则继续判断

       4.选择runid最小的节点 

   

相关概念:     

不健康的节点包括:主观下线的节点,5s内回复Sentinel的节点,与主节点超过down-after-milliseconds*10s没有回应的节点

slave priority:是Redis 实例文件中的replica-priority配置进行排序,replica-priority默认是没有设置因此默认所有实例拥有相同的默认值,当需要特定的故障转移首选项时,replica-priority必须在所有实例(包括主服务器)上设置,slave priority越低,优先级就越高

 runid:每个redis实例运行时都会生成一个40位字符组成,是一个随机的十六进制字符,master和从节点之间通信来判断是哪个实例的依据

 

测试故障转移

1.强制杀掉对应节点的进程号

2.使用redis的debug sleep命令 浪节点进入睡眠状态,这样可以模拟阻塞的效果

redis-cli -p 6379 DEBUG sleep 30

3.使用Redis的shutdown命令 模拟正常的停掉Redis

 

参考:《Redis开发与运营》

posted on 2022-08-02 10:48  ausions  阅读(60)  评论(0编辑  收藏  举报