【Redis学习笔记】redis哨兵模式选举机制_夏付国的博客-程序员秘密_redis哨兵选举机制

技术标签: 学习  # Redis  数据库  redis  


当redis集群的主节点故障时,Sentinel集群将从剩余的从节点中选举一个新的主节点,有以下步骤:

故障节点主观下线
故障节点客观下线
Sentinel集群选举Leader
Sentinel Leader决定新主节点

1. 选举过程

1.1. 主观下线

Sentinel集群的每一个Sentinel节点会定时对redis集群的所有节点发心跳包检测节点是否正常。如果一个节点在down-after-milliseconds时间内没有回复Sentinel节点的心跳包,则该redis节点被该Sentinel节点主观下线。

1.2. 客观下线

当节点被一个Sentinel节点记为主观下线时,并不意味着该节点肯定故障了,还需要Sentinel集群的其他Sentinel节点共同判断为主观下线才行。

该Sentinel节点会询问其他Sentinel节点,如果Sentinel集群中超过quorum数量的Sentinel节点认为该redis节点主观下线,则该redis客观下线。

如果客观下线的redis节点是从节点或者是Sentinel节点,则操作到此为止,没有后续的操作了;如果客观下线的redis节点为主节点,则开始故障转移,从从节点中选举一个节点升级为主节点。

1.3. Sentinel集群选举Leader

如果需要从redis集群选举一个节点为主节点,首先需要从Sentinel集群中选举一个Sentinel节点作为Leader。

每一个Sentinel节点都可以成为Leader,当一个Sentinel节点确认redis集群的主节点主观下线后,会请求其他Sentinel节点要求将自己选举为Leader。被请求的Sentinel节点如果没有同意过其他Sentinel节点的选举请求,则同意该请求(选举票数+1),否则不同意。

如果一个Sentinel节点获得的选举票数达到Leader最低票数(quorum和Sentinel节点数/2+1的最大值),则该Sentinel节点选举为Leader;否则重新进行选举。

在这里插入图片描述

1.4. Sentinel Leader决定新主节点

当Sentinel集群选举出Sentinel Leader后,由Sentinel Leader从redis从节点中选择一个redis节点作为主节点:

  1. 过滤故障的节点
  2. 选择优先级slave-priority最大的从节点作为主节点,如不存在则继续
  3. 选择复制偏移量(数据写入量的字节,记录写了多少数据。主服务器会把偏移量同步给从服务器,当主从的偏移量一致,则数据是完全同步)最大的从节点作为主节点,如不存在则继续
  4. 选择runid(redis每次启动的时候生成随机的runid作为redis的标识)最小的从节点作为主节点

2. 为什么Sentinel集群至少3节点

一个Sentinel节选举成为Leader的最低票数为quorum和Sentinel节点数/2+1的最大值,如果Sentinel集群只有2个Sentinel节点,则

Sentinel节点数/2 + 1
= 2/2 + 1
= 2

即Leader最低票数至少为2,当该Sentinel集群中由一个Sentinel节点故障后,仅剩的一个Sentinel节点是永远无法成为Leader。

也可以由此公式可以推导出,Sentinel集群允许1个Sentinel节点故障则需要3个节点的集群;允许2个节点故障则需要5个节点集群。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_32708605/article/details/123489880

智能推荐

Shell脚本调试技术_Augusdi的博客-程序员秘密

Shell脚本调试技术      本文全面系统地介绍了shell脚本调试技术,包括使用echo, tee, trap等命令输出关键信息,跟踪变量的值,在脚本中植入调试钩子,使用“-n”选项进行shell脚本的语法检查, 使用“-x”选项实现shell脚本逐条语句的跟踪,巧妙地利用shell的内置变量增强“-x”选项的输出信息等。一. 前言shell编程在unix/linux世界中使用得非常广泛,熟

《快学Scala》第三章习题解答_rongyongfeikai2的博客-程序员秘密

RT。package com.scalalearn.scala.main//java中的List转为scala buffer至关重要的引入import scala.collection.JavaConversions.asScalaBufferimport java.awt.datatransfer.{DataFlavor, SystemFlavorMap}import scala.c

基于RGB-D相机的机械臂无序抓取系统_3D视觉工坊的博客-程序员秘密

点击上方“3D视觉工坊”,选择“星标”干货第一时间送达引导语:本文为“3D视觉创新应用(三维重建)竞赛”作品集系列之一,该作品由来自深圳大学团队完成,团队成员:赵晨昊、张曼英、周制黔、郭...

Week03-Java学习笔记第三次作业_weixin_30387339的博客-程序员秘密

Week03-面向对象入门1.本周学习总结初学面向对象,会学习到很多碎片化的概念与知识。尝试学会使用思维导图将这些碎片化的概念、知识点组织起来。请使用工具画出本周学习到的知识点及知识点之间的联系。步骤如下:1.1 写出你认为本周学习中比较重要的知识点关键词答:本周学习的知识点:类管理机制-包、完全限定名、类路径、类与对象、封装性修饰符(public、private、无修饰符)学习如何在...

计算机等级考试如何评改试题,全国计算机考试上机考试是如何改卷的_明明如灼的博客-程序员秘密

等级考试的上机考试是分批进行的,在相邻两批考生之间,有监考人员做“收分”工作,即改分。也就是说,当你考完机试后,你的上机成绩就已经出来了,只是我们不知道结果罢了。当然,监考人员也不知道,因为最后分数是加密的。另外,改分程序在评改你的上机成绩后,将你的考试目录中的所有内容全部删除!现在,我们就“计算机改分”这个问题做如下讨论:1、计算机改分实质上就是评分软件改你上机时所设计的软件--------软件...

Flutter 初识 MediaQuery_我的大小姐的博客-程序员秘密

当信息发生变化,例如屏幕旋转等时,屏幕中 Widget 会重新构建,以保持最新状态;我们可以通过 MediaQuery 构造函数和提供的静态方法手动设置对应的相关信息MediaQuery.removePadding() 删除内边距MediaQuery.removeViewInsets() 删除视图内边距viewInsets 为键盘弹出时等遮挡屏幕边距,其中 viewInsets.bottom 为键盘高度;systemGestureInsets 为手势边距,如 Android Q 之后添加的向左滑动关

随便推点

fork bomb 介绍 以及防范措施_weixin_33957648的博客-程序员秘密

文章来自 http://blog.csdn.net/gray13/article/details/7308771#comments下面就是一个最简单的 bash fork ×××:: () { : | : & } ; :上面几个符号看上去很复杂,其实如果写成下面这个样子就好懂了,: 是函数名,执行一个调用自己的递归并且 pipe 到自己,&...

JWT & HMAC-SHA256_weixin_30824599的博客-程序员秘密

JWTJSON Web Tokenshttps://jwt.io/https://en.wikipedia.org/wiki/JSON_Web_Token#StructureHMACSHA256https://en.wikipedia.org/wiki/HMACkeyed-hash message authentication code or hash-based ...

java 基础知识巩固(一)_自由的刺猬的博客-程序员秘密

1. &与&&区别?    &和&&都是逻辑运算符,都是判断两边同时真则为真,否则为假;但是&&当第一个条件不成立之后,后面的条件都不执行了,而&则还是继续执行,直到整个条件语句执行完为止。2. 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?    使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。3. 静

SocketIO介绍及用法_Gua_guagua的博客-程序员秘密_socketio

SocketIO是在客户端和服务端之间建立的双向通信数据交换技术,底层使用EngineIO。SocketIO的的客户端使用Engine.IO-Client,服务端使用http://Engine.IO实现。SocketIO如何工作当一个浏览器尝试建立SocketIO时,SocketIO首先使用xhr-polling创建一个长轮询。长轮询一旦建立,它将升级为WebSocket连接。SocketIO底层是使用EngineIO库实现的,这个库使用WebSocket和XMLHttprequest封装了一套自己的

BERT fine-tune,loss不下降,训不动,固定分类到一类_TechOnly1988的博客-程序员秘密

语料应该没问题,不restore任何东西的话,都有效果。模型换成google官方bert,分类器代码不变,没问题。解决方案把bert_output = bert_model.get_pooled_output()改为bert_output = tf.reduce_mean(bert_model.get_sequence_output()[:,1:,:],1)...

基于python的2048游戏设计_用python写一个2048游戏_聪明小千的博客-程序员秘密

self.randomGenerateNumberself.randomGenerateNumber然后,当玩家按下方向键(↑↓←→)时,这个二维列表要根据玩家的操作指令进行更新,主要分为两个部分:移动所有的数字块并进行必要的合并和记分;随机地在一个还没有数字的位置上生成一个数字。具体而言,代码实现如下:'''更新游戏状态'''defupdate( self):game_matrix_before...