福哥答案2021-01-25:

答案1:
redis-sentinel故障转移的流程:
1.当多个sentinel发现并确认了master有问题。
2.接着会选举出一个sentinel作为领导。
3.再选举出一个slave作为master。
4.通知其余的slave,新的master是谁。
5.通知客户端一个主从的变化。
6.最后,sentinel会等待旧的master复活,然后将新master成为slave。

答案2:
redis中的纪元(epoch):使用了类似于Raft算法term(任期)的概念称为epoch(纪元),用来给时间增加版本号。主要有两种:
currentEpoch:它的作用在于,当集群的状态发生改变,某个节点为了执行一些动作需要寻求其他节点的统一时,就会增加currentEpoch的值。目前curretnEpoch只用于slabe的故障转移流程。
configEpoch:这是一个集群节点配置相关的概念,每个集群节点都有自己独一无二的configepoch,所谓的节点配置,实际上是指节点所负责的槽位信息。每一个master在向其他节点发送包时,都会附带其configEpoch信息,以及一份表示它负责的slots信息。
1、某个Sentinel认定master客观下线的节点后,该Sentinel会先看看自己有没有投过票,如果自己已经投过票给其他Sentinel了,在2倍故障转移的超时时间自己就不会成为Leader。相当于它是一个Follower。
2、如果该Sentinel还没投过票,那么它就成为Candidate。
3、和Raft协议描述的一样,成为Candidate,Sentinel需要完成几件事情
1)更新故障转移状态为start
2)当前epoch加1,相当于进入一个新term,在Sentinel中epoch就是Raft协议中的term。
3)更新自己的超时时间为当前时间随机加上一段时间,随机时间为1s内的随机毫秒数。
4)向其他节点发送is-master-down-by-addr命令请求投票。命令会带上自己的epoch。
5)给自己投一票,在Sentinel中,投票的方式是把自己master结构体里的leader和leader_epoch改成投给的Sentinel和它的epoch。
4、其他Sentinel会收到Candidate的is-master-down-by-addr命令。如果Sentinel当前epoch和Candidate传给他的epoch一样,说明他已经把自己master结构体里的leader和leader_epoch改成其他Candidate,相当于把票投给了其他Candidate。投过票给别的Sentinel后,在当前epoch内自己就只能成为Follower。
5、Candidate会不断的统计自己的票数,直到他发现认同他成为Leader的票数超过一半而且超过它配置的quorum(quorum可以参考《redis sentinel设计与实现》)。Sentinel比Raft协议增加了quorum,这样一个Sentinel能否当选Leader还取决于它配置的quorum。
6、如果在一个选举时间内,Candidate没有获得超过一半且超过它配置的quorum的票数,自己的这次选举就失败了。
7、如果在一个epoch内,没有一个Candidate获得更多的票数。那么等待超过2倍故障转移的超时时间后,Candidate增加epoch重新投票。
8、如果某个Candidate获得超过一半且超过它配置的quorum的票数,那么它就成为了Leader。
9、与Raft协议不同,Leader并不会把自己成为Leader的消息发给其他Sentinel。其他Sentinel等待Leader从slave选出master后,检测到新的master正常工作后,就会去掉客观下线的标识,从而不需要进入故障转移流程。

大致简单过程
1、每个做主观下线的sentinel节点像其他sentinel节点发送命令,要求将自己设置为领导者。
2、接收到的sentinel可以同意或者拒绝。
3、如果该sentinel节点发现自己的票数已经超过半数并且超过了quorum。
4、如果此过程选举出了多个领导者,那么将等待一段时重新进行选举。

答案3:
sentinel会以每秒一次的频率向主从和其他sentienl发送ping命令,当超过设置的down-after-milliseconds后未收到的有效的响应会认为该master主观下线,接着向其他sentiel进行确认,接收到足够数量的后,sentinel会判定该服务器客观下线。
该sentinel会想其他sentinel发送请求其他sentinel视自己为leader,每个sentinel每次选举会自增配置纪元,每个sentinel只能选择一次,当收到半数以上的票,sentinel会进行slave的选举。
slave的选举.进行不健康的slave排除(主观下线的,大于5秒未回应的,与master节点失联的),对健康节点进行排序(设置的优先级,若相同进行下一步,选择偏移量大的从节点)。
选举出的slave会执行slaveof no one成为主节点,向其他slave发送命令其成为新的master的slave,监视旧的master恢复后成为新的master的slave并进行同步。


评论

2021-01-25:redis中,哨兵如何选举?的更多相关文章

  1. Redis 中常见的集群部署方案

    Redis 的高可用集群 前言 几种常用的集群方案 主从集群模式 全量同步 增量同步 哨兵机制 什么是哨兵机制 如何保证选主的准确性 如何选主 选举主节点的规则 哨兵进行主节点切换 切片集群 Redi ...

  2. 【Redis】哨兵初始化和主观下线

    在的redis启动函数main(server.c文件)中,对哨兵模式进行了检查,如果是哨兵模式,将调用initSentinelConfig和initSentinel进行初始化,initServer函数 ...

  3. Redis 中如何保证数据的不丢失,Redis 中的持久化是如何进行

    Redis 中数据的持久化 前言 AOF 持久化 什么是 AOF 持久化 为什么要后记录日志呢 AOF 的潜在风险 AOF 文件的写入和同步 AOF 文件重写机制 AOF 的数据还原 RDB 持久化 ...

  4. redis的哨兵集群,redis-cluster

    #主从同步redis主从优先1.保证数据安全,主从机器两份数据一主多从2.读写分离,缓解主库压力主redis,可读可写slave身份,只读   缺点1.手动主从切换假如主库挂了,得手动切换master ...

  5. Redis进阶:Redis的哨兵模式搭建

    Redis进阶:Redis的哨兵模式搭建 哨兵机制介绍 单机版的Redis存在性能瓶颈,Redis通过提高主从复制实现读写分离,提高了了Redis的可用性,另一方便也能实现数据在多个Redis直接的备 ...

  6. 关于Redis中的serverCron

    1.serverCron简介 在 Redis 中, 常规操作由 redis.c/serverCron 实现, 它主要执行以下操作 /* This is our timer interrupt, cal ...

  7. Redis中的数据结构

    1. 底层数据结构, 与Redis Value Type之间的关系 对于Redis的使用者来说, Redis作为Key-Value型的内存数据库, 其Value有多种类型. String Hash L ...

  8. redis的哨兵模式

    我是在一台服务器上安装了三个redis  一主两从 想安装gcc gcc-c++ make tcl  lrzsz yum -y install gcc gcc-c++ make tcl  lrzsz ...

  9. (转)Redis(四)哨兵_sentinel

    发现一篇文章写的特别的详细,所以在这里转载,记录一下.照着文章中的内容自己动手实践了. 原文地址:http://blog.csdn.net/a67474506/article/details/5043 ...

  10. redis中存储小数

    在做一个活动的需求时,需要往redis中有序的集合中存储一个小数,结果发现取出数据和存储时的数据不一致 zadd test_2017 1.1 tom (integer) zrevrange test_ ...

随机推荐

  1. linux内核离线升级步骤详解【亲测可用】

    由于种种原因,linux的内核版本需要升级,但由于生产原因往往不能在线升级,在此记录笔者本人昨晚的的离线升级步骤,亲测可用. 我们知道,红帽和CentOS同源同宗,内核升级步骤也是一样的. 目录 ■ ...

  2. 高可用mongodb集群(分片+副本):规划及部署

    目录 ■■ 概述 ■ 下图是一个典型的3节点分片副本集群 ■ Mongos Server ■ config server ■ shard server ■ replica set ■ 仲裁者(Arbi ...

  3. 使用 GitHub Action 自动更新 Sealos 集群的应用镜像

    在 IT 领域,自动化无疑已成为提高工作效率和减少人为错误的关键.Sealos 作为一个强大的云操作系统,已经为许多企业和开发者提供了稳定可靠的服务.与此同时,随着技术不断发展,集成更多的功能和服务变 ...

  4. Unity学习笔记--入门

    Unity引擎学习 入门: Unity中的坐标系: 左手坐标系(z轴正方向向里面) x轴:平行屏幕向右正方向 y轴:平行屏幕向上正方向 Z轴:垂直屏幕向内为正方向 [补]openGL是右手坐标系 Di ...

  5. [vue]精宏技术部试用期学习笔记 II

    精宏技术部试用期学习笔记(vue) router : vue的模拟路由 前置准备 安装 vue-router pnpm i vue-router@4 //安装版本4的 vue-router 可以在 p ...

  6. Redis宕机恢复

    AOF(Append Only File) Redis持久化:AOF日志 用 AOF 方法进行故障恢复的时候,需要逐一把操作日志都执行一遍.如果操作日志非常多,Redis 就会恢复得很缓慢,影响到正常 ...

  7. 广度优先搜索— —提高Ⅲ(BFS优化)

    双向广搜 所谓双向广搜,就是初始结点向目标结点和目标结点向初始结点同时扩展,直至在两个扩展方向上出现同一个结点,搜索结束.它适用的问题是,扩展结点较多,而目标结点又处在深沉,如果采用单纯的广搜解题,搜 ...

  8. 为什么FPGA中推荐使用独热码?

    独热码只有一个比特位不同,所以在进行比较的时候: 假如我们要判断状态机是否处于某状态S1,代码如下 格雷码:assign S1 = (STATUS == 2'b01) 二进制码:assign S1 = ...

  9. CF1559D1. Mocha and Diana (Easy Version)

    原题链接:1559D1. Mocha and Diana (Easy Version) 题意: 小明和小红各有一个具有\(n\)个结点的森林,现执行操作: 加一条边,使得两人的森林还是森林 小明加一条 ...

  10. Selenium4+python被单独定义<div>的动态输入框和二级下拉框要怎么定位?

    今天在做练习题的时候,发现几个问题捣鼓了好久,写下这篇来记录 问题一: 有层级的复选框无法定位到二级目录 对于这种拥有二级框的选项无法定位,也不是<select>属性. 我们查看下HTML ...