掌握Redis的Sentinel哨兵原理,助你拿到25k的offer!

[启动]

redis-server redis-7001.conf

redis-server redis-7002.conf

slave-1[配置]

port 7001

daemonize yes

pidfile /var/run/redis-7001.pid

logfile “7001.log”

dir “/opt/soft/redis/data/”

slaveof 127.0.0.1 7000

slave-2[配置]

port 7002

daemonize yes

pidfile /var/run/redis-7002.pid

logfile “7002.log”

dir “/opt/soft/redis/data/”

slaveof 127.0.0.1 7000

Sentinel 主要配置

port $(port)

dir “/opt/soft/redis/data/”

logfile " $(port).log"

sentinel monitor mymaster 127.0.0.1 7000 2

sentinel down-after-milliseconds mymaster 30000

sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster 180000

演示


  • 主节点配置

  • 重定向

  • 打印检查配置文件

  • 启动

4 客户端

====================================================================

  • 客户端实现基本原理-1

  • 客户端实现基本原理-2

  • 客户端实现基本原理-3 验证

  • 客户端实现基本原理-4 通知(发布订阅))

客户端接入流程


  1. Sentinel地址集合

  2. masterName

  3. 不是代理模式

JedisSentinelPool sentinelPool = new JedisSentinelPool(masterName, sentinelSet, poolConfig, timeout);

Jedis jedis = null;

try {

jedis = redisSentinelPool.getResource();

//jedis command

} catch (Exception e) {

logger.error(e.getMessage(), e);

} finally {

if (jedis != null)

jedis.close();

}

5 定时任务

=====================================================================

  1. 每10s 每个 sentinel 对 master 和 replica 执行 INFO 命令
  • 发现 replica 节点

  • 确认主从关系

  1. 每 2s 每个 sentinel 通过 master 节点的channel交换信息(pub/sub)
  • 通过 sentinel :java频道交互

  • 交互对节点的"看法”和自身信息

  1. 每 1s 每个 sentinel 对其他 sentinel 和 redis 执行ping
  • 心跳检测,失败判定依据

6 主观下线和客观下线

==========================================================================

主观下线(Subjectively Down,SDOWN)


单个 Sentinel 节点对服务器做出的下线判断,即单个 Sentinel 认为某个服务下线(有可能是接收不到订阅,之间的网络不通等一系列原因)。

注意主观下线是每个sentinel节点对Redis节点失败的"偏见”。所以还需要客观下线机制。

客观下线(Objectively Down,ODOWN)


多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断,并且通过命令互相交流之后,得出的服务器下线判断,然后开启 failover。

只有在足够数量( 超过quorum个)的 Sentinel 都将一个服务器标记为主观下线之后, 服务器才会被标记为客观下线(ODOWN)。只有当 Master 被认定为客观下线时,才会发生故障迁移。

仲裁


仲裁指配置文件中的 quorum 参数。某个 Sentinel 先将 Master 节点标记为主观下线,然后会将这个判定通过 sentinel is-master-down-by-addr 命令询问其他 Sentinel 节点是否也同样认为该 addr 的 Master 节点要做主观下线。

sentinel monitor < port>

sentinel monitor myMaster 127.0.0.1 6379 2

sentinel down-after-milliseconds < masterName> < timeout>

sentinel down-after-milliseconds mymaster 30000

最后当达成这一共识的 Sentinel 个数达到前面说的 quorum 设置的值时,该 Master 节点会被认定为客观下线并进行故障转移。

quorum 值一般设为 Sentinel 个数的二分之一加 1,例如 3 个 Sentinel 就设为 2。

综上可得

哨兵工作原理


  1. 每个 Sentinel 以 1次/s 向它所知的 Master,Slave 以及其他 Sentinel 节点发送一个 PING

  2. 若一个实例距离最后一次有效回复 PING 的时间超过配置文件 down-after-milliseconds,则该实例会被 Sentinel 标记为 主观下线

  3. 若一个 Master 被标记为主观下线,则正在监视该 Master 的所有 Sentinel 会 1次/s 确认 Master 是否真的进入主观下线状态

  4. 当有足够数量 Sentinel(大于等于配置文件指定的值)在指定时间范围内确认 Master 的确进入主观下线状态,则 Master 会被标记为 客观下线

  5. 若 Master 处于 ODOWN 状态,则投票自动选出新Master。将剩余从节点指向新Master继续数据复制

  6. 在正常情况下,每个 Sentinel 会以每 10 秒一次的频率向它已知的所有 Master,Slave 发送 INFO 命令;当 Master 被 Sentinel 标记为客观下线时,Sentinel 向已下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次(因为原来是稳定的,10s 一次info就是为了看看有没有新加入的 sentinel,但现在故障了,所以要尽快将环境稳定好,快速确认完主从关系)

  7. 若没有足够数量 Sentinel 同意 Master 已经下线,Master 的客观下线状态会被移除。若 Master 重新向 Sentinel 的 PING 命令返回有效回复,Master 的主观下线状态就会被移除。

7 领导者选举

======================================================================

原因:只有一个sentinel节点完成故障转移。

选举:通过sentinel is-master-down-by-addr命令都希望成为领导者:

  1. 每个做主观下线的Sentinel节点向其他Sentinel节点发送命令,要求将它设置为领导者

  2. 收到命令的Sentinel节点如果没有同意通过其他Sentinel节点发送的命令,那么将同意该请求,否则拒绝

  3. 如果该Sentinel节点发现自己的票数已经超过Sentinel集合半数且超过quorum,则将成为领导者

  4. 如果此过程有多个Sentinel节点成为了领导者,那么将等待一段时间重新选举

  • 选举实例

8 故障转移

=====================================================================

领导者节点完成

  1. 从slave节点中选出一个“合适的"节点作为新的master节点

  2. 对上面的slave节点执行slaveof no one命令让其成为master节点

  3. 向剩余slave节点发送命令,让它们成为新master节点的slave节点,复制规则和parallel-syncs参数有关

  4. 更新对原来master节点配置为slave,并保持着对其关注,当其恢复后命令它去复制新的master节点。

选择合适的slave节点

  1. 选择slave priority(slave节点优先级)最高的slave节点,如果存在划返同,不存在则继续。

  2. 选择复制偏移量最大的slave节点(复制的最完整),若存在则返回,不存在则

继续。

  1. 选择runId最小的slave节点。

常见开发运维问题

=======================================================================

节点运维


  • 机器下线:例如过保等情况

  • 机器性能不足:例如CPU、内存、硬盘、网络等

  • 节点自身故障:例如服务不稳定等

主节点

sentinel failover <masterName>

节点下线

  • 从节点:临时下线还是永久下线,例如是否做一些清理工作。但是要考虑读写分离的情况。

  • Sentinel节点: 同上。

节点上线

  • 主节点: sentinel failover进行替换

  • 从节点: slaveof即可, sentinel节点可以感知

  • sentinel节点:参考其他sentinel节点启动即可。

从节点的作用

  1. 副本:高可用基础

  2. 拓展读能力

由于Redis Sentinel只会对主节点进行故障转移,对从节点采取主观的下线,所以需要自定义一个客户端来监控对应的事件

三个消息

  • +switch-master :切换主节点(从节点晋升主节点)

  • +convert-to-slave :切换从节点(原主节点降为从节点)

最后

光给面试题不给答案不是我的风格。这里面的面试题也只是凤毛麟角,还有答案的话会极大的增加文章的篇幅,减少文章的可读性

Java面试宝典2021版

最常见Java面试题解析(2021最新版)

2021企业Java面试题精选

找小编(vip1024c)领取

  • +convert-to-slave :切换从节点(原主节点降为从节点)

最后

光给面试题不给答案不是我的风格。这里面的面试题也只是凤毛麟角,还有答案的话会极大的增加文章的篇幅,减少文章的可读性

Java面试宝典2021版

[外链图片转存中…(img-kMRqlrHK-1721728114262)]

[外链图片转存中…(img-9bcSMd2t-1721728114262)]

最常见Java面试题解析(2021最新版)

[外链图片转存中…(img-94hy0Jhq-1721728114262)]

[外链图片转存中…(img-54hd9Xcr-1721728114263)]

2021企业Java面试题精选

[外链图片转存中…(img-gvcuCQ72-1721728114263)]

[外链图片转存中…(img-Pot2gp24-1721728114263)]

找小编(vip1024c)领取

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值