哨兵机制的原理

如果我们不用哨兵,如何实现主从故障的转移呢?这事儿得手动来实现:

1、在从节点slave-1执行 slaveof no one ,将从节点变为主节点;

2、其它的节点,执行 slaveof slave-1的ip port,变为slave-1的从节点,并从新节点复制数据;

当然,有了哨兵机制我们就不用这么费事儿了,它的原理就是用raft算法实现选举机制,选出一个哨兵节点(哨兵也有主节点)来完成转移和通知;

哨兵有三个定时监控任务完成对各节点的发现和监控:

任务1,每个哨兵节点每10秒会向主节点和从节点发送info命令获取最新拓扑结构图,哨兵配置时只要配置对主节点的监控即可(sentinel monitor mymaster 192.168.1.3 26379 2),通过向主节点发送info,获取从节点的信息,并当有新的从节点加入时可以马上感知到

任务2,每个哨兵节点每隔2秒会向redis数据节点的指定频道上发送该哨兵节点对于主节点的判断以及当前哨兵节点的信息,同时每个哨兵节点也会订阅该频道,来了解其它哨兵节点的信息及对主节点的判断,其实就是通过消息publish和subscribe来完成的;

任务3,每隔1秒每个哨兵会向主节点、从节点及其余哨兵节点发送一次ping命令做一次心跳检测,这个也是哨兵用来判断节点是否正常的重要依据

主观下线和客观下线:

主观下线:刚我知道知道哨兵节点每隔1秒对主节点和从节点、其它哨兵节点发送ping做心跳检测,当这些心跳检测时间超过down-after-milliseconds时,哨兵节点则认为该节点错误或下线,这叫主观下线;这可能会存在错误的判断。

客观下线:当主观下线的节点是主节点时,此时该哨兵3节点会通过指令sentinel is-masterdown-by-addr寻求其它哨兵节点对主节点的判断,当超过quorum(法定人数)个数,此时哨兵节点则认为该主节点确实有问题,这样就客观下线了,大部分哨兵节点都同意下线操作,也就说是客观下线

领导者哨兵选举流程

a、每个在线的哨兵节点都可以成为领导者,当它确认(比如哨兵3)主节点下线时,会向其它哨兵发is-master-down-by-addr命令,征求判断并要求将自己设置为领导者,由领导者处理故障转移;

b、当其它哨兵收到此命令时,可以同意或者拒绝它成为领导者;

c、如果哨兵3发现自己在选举的票数大于等于num(sentinels)/2+1时,将成为领导者,如果没有超过,继续选举…………

故障转移机制

A,由Sentinel节点定期监控发现主节点是否出现了故障,sentinel会向master发送心跳PING来确认master是否存活,如果master在“一定时间范围”内不回应PONG 或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了,会要求其他sentinel确认该节点是否丢失,如果确认,则认为是客观下线,的确不可用了,开始进行故障转移;

B,当主节点出现故障,此时3个Sentinel节点共同选举了Sentinel3节点为领导,负载处理主节点的故障转移,

C,由Sentinel3领导者节点执行故障转移,过程和主从复制一样,但是自动执行

流程: 1,将slave-1脱离原从节点,升级主节点,

2,将从节点slave-2指向新的主节点

3,通知客户端主节点已更换

4,将原主节点(oldMaster)变成从节点,指向新的主节点

D,故障转移后的redis sentinel的拓扑结构图

哨兵机制-故障转移详细流程

A,过滤掉不健康的(下线或断线),没有回复过哨兵ping响应的从节点

B,选择salve-priority从节点优先级最高(redis.conf)

C,选择复制偏移量最大,指复制最完整的从节点

哨兵部分,over

原文地址:https://www.cnblogs.com/nevermorewang/p/8594927.html

时间: 2024-10-12 06:11:00

哨兵机制的原理的相关文章

Redis(5)-----初识Redis-----主从复制.读写分离,主从切换(哨兵机制)

当数据量变得庞大的时候,读写分离还是很有必要的.同时避免一个redis服务宕机,导致应用宕机的情况,我们启用sentinel(哨兵)服务,实现主从切换的功能. https://www.cnblogs.com/jaycekon/p/6237562.html 一,主从分离(读写分离,主从复制) 首先我们默认已经安装了redis,然后复制master,slave1,slave2三个redis的文件.并把redis.conf拷贝到多个redis文件夹中来.不干扰原来的redis服务,我们master使用

第六课补充01——主从复制原理,哨兵机制

[主从复制] 一. redis的复制 ## redis2.8版本后的复制机制,是采用增量复制的 ##复制过程:同步(全量or增量)——命令传播 1.同步流程: 2.全量同步过程: 3.增量同步过程: [哨兵机制] 简介 sentinel是redis高可用的解决方案,sentinel系统(N个sentinel实例,N >= 1)可以监视一个或者多个redis master服务,以及这些master服务的所有从服务:当某个master服务下线时,自动将该master下的某个从服务升级为master服

Redis集群,备份,哨兵机制

原文:https://blog.csdn.net/zy345293721/article/details/87536144 1.集群        先来简单了解下redis中提供的集群策略, 虽然redis有持久化功能能够保障redis服务器宕机也能恢复并且只有少量的数据损失,但是由于所有数据在一台服务器上,如果这台服务器出现硬盘故障,那就算是有备份也仍然不可避免数据丢失的问题.       在实际生产环境中,我们不可能只使用一台redis服务器作为我们的缓存服务器,必须要多台实现集群,避免出现

Redis——主从和哨兵机制

一.主从和哨兵机制: 1)主从:配置多态主从服务器,解决高可用问题:一台主服务器对应多台从服务器,从服务器自动拷贝主服务器的数据: 2)哨兵:配置哨兵模式,用于解决主服务器挂掉,需要再次手动配置从服务器作为主服务的操作: 哨兵会自动选择一台数据偏移量最大的从服务器,作为新得主服务器: 二.主从服务器配置: 1)创建两文件夹:分别存放两个服务器得数据卷和配置文件: 2)在配置文件中配置主服务器得密码: masterauth 123456 3)使用docker启动两个容器:分别映射两个端口: doc

Redis的主从复制与Redis Sentinel哨兵机制

1    Redis的主从复制 1.1   什么是主从复制 持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,不过通过redis的主从复制机制就可以避免这种单点故障,如下图: 说明: n  主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器宕机其它两台redis服务也可以继续提供服务. n  主redis中的数据和从re

redis如何实现高可用【主从复制、哨兵机制】

原创itcats_cn 最后发布于2018-09-05 21:07:27 阅读数 5135 收藏展开实现redis高可用机制的一些方法:保证redis高可用机制需要redis主从复制.redis持久化机制.哨兵机制.keepalived等的支持. 主从复制的作用:数据备份.读写分离.分布式集群.实现高可用.宕机容错机制等. redis主从复制原理首先主从复制需要分为两个角色:master(主) 和 slave(从) ,注意:redis里面只支持一个主,不像Mysql.Nginx主从复制可以多主多

Redis数据持久化机制AOF原理分析二

Redis数据持久化机制AOF原理分析二 分类: Redis 2014-01-12 15:36  737人阅读  评论(0)  收藏  举报 redis AOF rewrite 目录(?)[+] 本文所引用的源码全部来自Redis2.8.2版本. Redis AOF数据持久化机制的实现相关代码是redis.c, redis.h, aof.c, bio.c, rio.c, config.c 在阅读本文之前请先阅读Redis数据持久化机制AOF原理分析之配置详解文章,了解AOF相关参数的解析,文章链

Java序列化与反序列化学习(三):序列化机制与原理

Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的 过程.Java序列化API提供一种处理对象序列化的标准机制.在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算法,我们用 一个实例来示范序列化以后的字节是如何描述一个对象的信息的. 序列化的必要性 Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端.这就需要有一种

为什么要有handler机制?handler机制的原理

为什么要有handler机制? 在Android的UI开发中,我们经常会使用Handler来控制主UI程序的界面变化.有关Handler的作用,我们总结为:与其他线程协同工作,接收其他线程的消息并通过接收到的消息更新主UI线程的内容. 我们假设在一个UI界面上面,有一个按钮,当点击这个按钮的时候,会进行网络连接,并把网络上的一个字符串拿下来显示到界面上的一个 TextView上面,这时就出现了一个问题,如果这个网络连接的延迟过大,可能是10秒钟甚至更长,那我们的界面将处于一直假死状态,而如果这段