redis 哨兵模式 cluster模式区别_Redis哨兵(Sentinel)模式快速入门

当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。 所以更多时候,我们优先考虑哨兵(sentinel) 模式。

Redis sentinel是Redis高可用实现方案:故障发现、故障自动转移、配置中心、客户端通知。从Redis的2.6版本开始提供的,但是当时这个版本的模式是不稳定的,直到Redis的2.8版本以后,这个哨兵模式才稳定下来,在生产环境中,如果想要使用Redis的哨兵模式,也会尽量使用Redis的2.8版本之后的版本。

哨兵虽然有一个单独的可执行文件Redis-sentinel ,但实际上它只是一个运行在特殊模式下的 Redis服务器,你可以在启动一个普通Redis服务器时通过给定--sentinel选项来启动哨兵,哨兵的一些设计思路和zookeeper非常类似。

60ad4eab9fd37bf651c8e69f44e7f154.png

sentinel的定时任务

sentinel机制中有三种重要的定时任务。

  1. 每10秒每个sentinel对master和slave执行info

作用:

  • 发现slave节点。

  • 确认主从关系。

  1. 每2秒每个sentinel通过master节点的channel交换信息(pub/sub)

作用:

  • 互相通信掌握节点的信息和自身信息,可以感知新加入的sentinel

通过master节点的__sentinel__:hello频道进行交互,所有sentinel订阅这个频道并每2秒向该频道发布信息

  1. 每1秒每个sentinel对其他sentinel和master,slave进行ping

作用:

  • 心跳检测

主观下线和客观下线

主观下线

主观下线:单个sentinel节点对Redis节点通信失败的“偏见”。

这是一种主观下线。因为在复杂的网络环境下,这个sentinel与这个master不通,但是如果master与其他的sentinel都是通的呢?所以是一种“偏见”。

这是依靠的第三种定时:每秒去ping一下周围的sentinel和Redis。对于slave Redis,可以使用这个主观下线,因为他不需要进行故障转移;但是对于master Redis,必须使用客观下线。

客观下线

客观下线:所有sentinel节点对master Redis节点失败“达成共识”(超过quorum个则统一,quorum可配置)。

这是依靠的第二种定时:每两秒,sentinel之间进行“商量”(一个 sentinel 可以通过向另一个 sentinel 发送 SENTINEL is-master-down-by-addr 命令来询问对方是否认为给定的服务器已下线。)

对于master redis的下线,必须要达成共识才可以,因为涉及故障转移,仅仅依靠一个sentinel判断是不够的

领导者选举

当sentinel集群需要故障转移的时候会在集群中选出Leader执行故障转移操作。sentinel采用了Raft协议实现了sentinel间选举Leader的算法,不过也不完全跟论文描述的步骤一致。sentinel集群运行过程中故障转移完成,所有sentinel又会恢复平等。Leader仅仅是故障转移操作出现的角色。

选举流程

  1. 某个sentinel认定master客观下线的节点后,该sentinel会先看看自己有没有投过票,如果自己已经投过票给其他sentinel了,在2倍故障转移的超时时间自己就不会成为Leader。相当于它是一个Follower。

  2. 如果该sentinel还没投过票,那么它就成为Candidate。

  3. 和Raft协议描述的一样,成为Candidate,sentinel需要完成几件事情
    3.1 更新故障转移状态为start
    3.2 当前epoch加1,相当于进入一个新term,在sentinel中epoch就是Raft协议中的term。
    3.3 更新自己的超时时间为当前时间随机加上一段时间,随机时间为1s内的随机毫秒数。

    3.4 向其他节点发送is-master-down-by-addr命令请求投票。命令会带上自己的epoch。

    3.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发现并确认了master有问题

  2. 接着会选举出一个sentinel作为领导

  3. 再选举出一个slave作为master

  4. 通知其余的slave,新的master是谁

  5. 通知客户端一个主从的变化

  6. 最后,sentinel会等待旧的master复活,然后将新master成为slave

那么,如何选择“合适”的slave节点呢?

  1. 选择slave-priority(slave节点优先级,人为配置)最高的slave节点,如果存在则返回,不存在则继续。

  2. 其次会选择复制偏移量最大的slave节点(复制得最完整),如果存在则返回,不存在则继续

  3. 最后会选择run_id最小的slave节点(启动最早的节点)

客户端实现高可用的基本原理

故障转移后客户端无法感知将无法保证正常的使用。所以,实现客户端高可用的步骤如下:

  1. 客户端获取sentinel节点集合

0b3370d00f9855fbbd8cf0cb7df3abda.png

  1. 客户端通过sentinel get-master-addr-by-name master-name这个api来获取对应主节点信息

7dc3eb13b1dd5b00fd19ee36fabb479d.png

  1. 客户端验证当前获取的“主节点”是真正的主节点,这样的目的是为了防止故障转移期间主节点的变化

a061e1d7e5ac7f505aecfd15396302c1.png

  1. 客户端保持和sentinel节点集合的联系,即订阅sentinel节点相关频道,时刻获取关于主节点的相关信息

94e4ccc11d88d8364a42462bfc1e2353.png

从上面的模型可以看出,Redis sentinel客户端只有在初始化和切换主节点时需要和sentinel进行通信来获取主节点信息,所以在设计客户端时需要将sentinel节点集合考虑成配置(相关节点信息和变化)发现服务。

需要说明的问题

  • 尽可能在不同物理机上和同一个网络部署Redis sentinel的所有节点

  • Redis sentinel中的sentinel节点个数应该大于等于3且最好是奇数。(节点数多可以保证高可用)

  • Redis sentinel中的数据节点和普通数据节点没有区别。每个sentinel节点在本质上还是一个Redis实例,只不过和Redis数据节点不同的是,其主要作用是监控Redis数据节点

  • 客户端初始化时连接的是sentinel节点集合,不再是具体的Redis节点,但sentinel只是配置中心不是代理。

d876165d1ce3516588ca85e60de9dc54.png

喜欢就点个“在看”呗^_^c1bf8912259ac53aa84534b0908b55d5.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IOS开发入门笔记

IB:IB是指Interface Builder,如IBAction,IBOutlet。IBOutlet和IBAction是什么?IBOutlet:中文翻译应该是:插座,连接点(书上写的是出口)。autorelease相当于Qt中的deleteLa…

【转】RabbitMQ六种队列模式-3.发布订阅模式

前言 RabbitMQ六种队列模式-简单队列RabbitMQ六种队列模式-工作队列RabbitMQ六种队列模式-发布订阅 [本文]RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主题模式 上文的工作队列模式是直接在生产者与消费者里声明好一个队列,这种情况下消息只会对应同类型的…

组建一个局域网一般会用到哪些设备_路由器和交换机的区别是什么?在实际使用中有哪些不同...

电工之家:www.dgzj.com QQ群:2179090关注电工之家官方微信公众号“电工之家”,收获更多经验知识。其实关于路由器和交换机确实有很多人容易混淆,包括猫MOdem,我最初就认为猫就是路由器,现在回想起来真的傻…

【转】RabbitMQ六种队列模式-4.路由模式

前言 RabbitMQ六种队列模式-简单队列RabbitMQ六种队列模式-工作队列RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式 [本文]RabbitMQ六种队列模式-主题模式 本文带大家了解 RabbitMQ 队列模式中的路由模式。 其实只要看过上篇发布模式后,相信路由模式…

百度二年级手工机器人_让父母少弯腰的家务神器——追觅扫拖机器人慧目F9评测...

大家好,我是CC。父母都已过了花甲之年,退休在家本应是享清福的时候,为了照顾双上班族的我,平时承担了接儿子放学和给我蹭晚餐的任务,操劳不少。眼看着他们一点点老去,总想也为他们做点什么,所以…

【转】RabbitMQ六种队列模式-5.主题模式

前言 RabbitMQ六种队列模式-简单队列RabbitMQ六种队列模式-工作队列RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主题模式 [本文] 从前面的几篇我们依次经历了 exchange 模式从 fanout > direct 的转变过程,在 fanout 时&a…

javase哪部分最难_高中物理哪部分最难?这里有答案和方法!一定要收藏

高中物理最难的部分是什么?对于大多数同学来说,电粒子在电磁场中的运动、动力学分析以及电学实验比较难搞定,看看下面的方法,希望对你有所帮助。从应试而言,应是带电粒子在电磁场中的运动(力,运动轨迹,几何…

【转】分布式websocket服务器

最近在开发一个游戏的客服系统,同一时间咨询问题的玩家多,为了保证服务器高可用,需要利用分布式,另外服务器宕机还需要玩家无感知重连,最关键的一点是如何实现服务器的高扩展性,即性能不足时,如…

【Rational Rose使用笔记】协作图

例题 用例题亲自画一下是最好的。 例题出处:掌握在Rational Rose中绘制协作图(交互图)的操作方法 其他参考文章: UML–协作图详解UML中创建对象的方法:Rational Rose建立对象图 笔记 以下是总结的一些笔记&#x…

【Rational Rose使用笔记】用例图

一 先找例题: 掌握运用Rose工具绘制用例图的基本操作 再学习: UML建模——用例图(Use Case Diagram) 二 下面是笔记: 了解几种关系:依赖、关联、泛化、包含、扩展。 如何区别依赖、关联? 依…

sqlserver获取当前时间_c#获取并显示当前日期时间

主要使用ToLongDateString、ToShortDateString、ToLongTimeString、ToShortTimeString、DayOfWeek等获取日期、时间、星期等数据。MM 两位数月份mm 两位数分钟HH 两位小时,24小时制hh 两位小时,12小时制string br ""; string a1 D…

【考研计算机】AOE关键路径

介绍 数据结构AOE网 计算题专题:关键路径法(CPM) 需要注意的点: 最重要的点,以下图为例: 一个活动有多个入口,这是表示此活动必须在前置的多个入口都完成时,才能开始。 即,开始条件 入口1 &…

【转】.NET程序内存分析工具CLRProfiler的使用

大家都知道.net有一套自己的内存(垃圾)回收机制,除非有一些数据(方法)长期占有内存不随着垃圾回收功能而释放内存,这样就造成了我们经常说的内存泄露、内存持续增长得不到释放等问题导致APS.net网站或者C/S…

sql over函数_SQL 高级函数

今天是高端局,都是超级高大上的内容,惯例上目录今天觉得红黑配色好好看呀今天没有什么具体的栗子合集,大家的应用场景都很不一样,so,到具体知识点,我们再具体举栗子。窗口函数概念: 窗口函数&am…

【转】SVN各种颜色状态

黄色感叹号(有冲突): 这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许你提交,防止你的提交覆盖了别人的…

实现二分归并排序算法_如何实现归并排序?

归并排序归并排序是分而治之的排序算法。划分步骤很简单:将当前数组分成两半(如果N是偶数,则将其完全平等,或者如果N是奇数,则一边稍大于一个元素),然后递归地对这两半进行排序。递归写法归并排序递归写法的思想是&…

【手算】逆序数树形计算方法

计算过程: 给定一列数,从左向右,依次将每个数拿出来,作为一棵树的树根。从剩下的数中,找比此数小的数,作为子节点加入到树中。重复1、2,直到到达最后一个数停止。 数出二级节点,即…

【转】SVN冲突出现场景

如今是一个团结协作的时代,开发一个系统,往往会多人协作共同完成。版本管理是必不可少的,常用的软件有Git,SVN等。今天说一下,SVN管理版本时,如果出现冲突后,如何快速解决冲突。 首先说明一个问…

Qt Creator和Visual Studio双环境开发技能攻略

前言 刚接触Qt开发时,大多数同学的第一行Qt代码是在Qt Creator中写下的。 众所周知,Qt Creator是Qt官方提供的Qt集成开发环境1,提供了对Qt应用开发的全过程支持。也就是说,使用Qt Creator做Qt开发是完全够用的。不管是在Windows…

大疆无人机高程不准_大疆消费级无人机快速倾斜摄影测量实践

摘要:分别用 RTK两种测量模式测定像控点,用大疆消费级无人机 Phantom4PRO 开展倾斜摄影测量,最后进行成果检验。结果表明:RTK 电台模式(不做坐标校正,精度低)、RTK-CORS 网络模式测定像控点都能…