一.出现的背景:
Redis 主从复制模式下一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址,对于很多应用这种场景的这种故障处理方式是非常浪费人力的。为了提供Redis主从的高可用性,Redis从2.8版本开始提供Redis Sential(哨兵)架构来解决问题。
 
二.架构图:
 
三.Redis Sentinel的高可用方案主要介绍:
由上图可以看到Redis Sentinel是一个分布式架构,包含若干个Sentinel节点和Redis数据节点,每个Sentinel节点会对数据节点和其余Sentinel节点进行监控,当它发现节点不可达时,会对节点做下线标识,如果被标识的是主节点,它还会和其他Sentinel节点进行“协商”,当大多数Sentinel节点都认为主节点不可达时他们会选举出一个Sentinel节点来完成自动故障转移的工作,选举出新的主节点,将老的主节点降级为从节点,同时会将这个变化实时通知给Redis应用方。
 
四.基本实现原理:
1.执行三个定时任务用于获取及同步各端(主节点、从节点、Sentinel节点)信息:
   A.每隔10秒获得主从节点信息;(通过info命令)
   B.每隔2秒同步主节点及当前sentinel节点信息; (通过redis的订阅功能)
   C.每隔1秒各个Sentinel节点实现同其他端之间的心跳检测;(通过ping命令)
 
2.下线有问题的节点:
   主观下线:每个Sentinel节点会每隔1秒对主从节点及其他Sentinel节点发送ping命令做心跳检测,当这些节点超过down-after-milliseconds没有进行有效回复时Sentinel节点会对该节点做失败判定,这个行为即主观下线。(该主观下线的判定是当前一个Sentinel的判定所以也存在误判的可能,比如刚好那时的网络问题)
    客观下线:当Sentinel接待主观下线的是主节点时,该Sentinel会通过sentinel is-master-down-by-addr命令其他Sentinel节点询问对主节点的判断,当超过quorum(判定主节点最终不可达所需的票数)个数时,Sentinel节点会认为该主节点确实有问题,这时Sentinel节点会做出客观下线的决定。
 
3.领导者Sentinel节点选举(Raft算法)用于去做故障转移的leader(即选谁去领导这次故障转移,现实中一般是谁先发现了这个故障谁就成为leader的可能性最大,而且这个选举的过程很快)。
   该选举过程主要包含:
    (1)每个在线的Sentinel节点都有资格成为领导者,当它确认主观下线时会向其他Sentinel节点发送sentinel is-master-down-by-addr命令,要求将自己设置为领导着。
    (2)收到命令的Sentinel节点如果没同意过其他Sentinel节点的sentinel is-master-down-by-addr命令,则将统一改请求,否则拒绝。
    (3)如果该Sentinel节点发现自己的票数已经大于等于max(quorum,num(sentinels)/2+1),那么它将成为领导者。(现实中一旦一个Sentinel节点获得了max(quorum,num(sentinels)/2+1) 的票数,其他Sentinel节点再去确认已经没有意义因为每个Sentinel节点只有一票)
    (4)如果此过程没有选举出领导者,则将进入下一次类似这样的选举。
 
4.故障转移:
   (1).Sentine领导者节点从从节点列表中选出一个节点作为新的主节点,选择过程如下图:
           
   (2).Sentinel领导者节点会对第一步选出来的从节点执行slaveof no one命令让其成为主节点。
   (3).Sentinel领导者节点会向剩余的从节点发送命令,并让他们成为新主节点的从节点。
   (4)Sentinel节点集合将原来的主节点更新为从节点,并保持对其关注,当其回复后命令它去复制新的主节点数据。 

Redis Sentinel基本实现原理的更多相关文章

  1. Redis Sentinel中的机制与原理详解

    序言 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案.实际上这意味着你可以使用Sentinel模式创建一个可以不用人为干预而应对各种故障的Redis部署. 它的主要功能有以 ...

  2. Redis Sentinel实现的机制与原理详解

    序言 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案.实际上这意味着你可以使用Sentinel模式创建一个可以不用人为干预而应对各种故障的Redis部署. 它的主要功能有以 ...

  3. Redis Sentinel 高可用实现说明

    背景:      前面介绍了Redis 复制.Sentinel的搭建和原理说明,通过这篇文章大致能了解Sentinel的原理和实现方法以及相关的搭建.这篇文章就针对Redis Sentinel的搭建做 ...

  4. Redis Sentinel:集群Failover解决方案(转载)

    本文转载自:http://shift-alt-ctrl.iteye.com/blog/1884370 文中的配置例子,还有failover过程中触发的订阅事件具有很好的参考价值. Redis sent ...

  5. redis高可用之REDIS SENTINEL

    1. Redis主从配置 1.1. 设置主从复制 Master <= Salve 10.24.6.5:6379 <= 10.24.6.7:6379 1.2.   取消主从复制 1.3.   ...

  6. Redis Sentinel哨兵集群

    Redis Sentinel(哨兵集群)是一种高可用的redis部署方案.在集群中的redis-master服务挂掉时,无需人为干预,即可通过哨兵集群的自我调整,实现redis服务的持续可用. 哨兵集 ...

  7. (转)基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案

    转载自:http://warm-breeze.iteye.com/blog/2020413 本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedi ...

  8. 基于Redis Sentinel的Redis集群(主从Sharding)高可用方案(转)

    本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上版本(可选,Sentinel最早出现在 ...

  9. Redis Sentinel主从高可用方案

    Redis Sentinel主从高可用方案 本文介绍一种通过Jed和Sentinel实现Redis集群(主从)的高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上 ...

随机推荐

  1. composer简述

    1.composer是一个php依赖管理工具,而不是一个包管理器.怎么来理解呢?就像在是在电脑中安装了个电脑管家,在电脑管家的软件管理中下载和更新软件,其实这个电脑管家只是一个管理工具,而真正的软件可 ...

  2. 记一次基于Cloudflare服务的爬虫

    前言 前几天有个朋友托我帮忙爬一个网站,第一次打开那个网站时,我去,它竟然就要验证码,不过当时是想加几个header应该就能解决,不过事实证明我还是错了.接下来将记录下爬虫中遇到的一些坑以及解决办法. ...

  3. kubernetes实战篇之docker镜像的打包与加载

    系列目录 前面我们讲到了使用nexus搭建docker镜像仓库,操作还是有点复杂的,可能有的童鞋仅仅是想尝试kubernetes功能,并不想在搭建仓库上花费过多时间,但是又想在不同的主机之间传递镜像. ...

  4. Python基础-组织列表

    1.字符串的几个常用方法 name = ''adb lovelace '' name.title() 首字母大写 name.upper() 全部大写 name.lower() 全部小写 2.组织列表操 ...

  5. PAT L3-002: 堆栈(线段树)

    https://www.patest.cn/contests/gplt/L3-002 题意:中文题意. 思路:因为所有数<=1e5,权值线段树维护每个数出现多少次,然后每次出栈入栈都更新权值就好 ...

  6. MyBatis从入门到精通(九):MyBatis高级结果映射之一对一映射

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解MyBatis中实现查 ...

  7. 网络虚拟化基础协议·Geneve

    [分层] 要实现网络虚拟化,最基础的技术肯定是分层(OverLay & UnderLay). ·UnderLay 中文释义中,老房子漏雨,在房子里面撑一把大雨伞,这把大雨伞就是UnderLay ...

  8. 在django中用MySQL为数据库 新建一个项目的流程

    创建mysql数据库 在cmd输入 mysql -uroot -p 启动mysql客户端并连接服务器 创建一个db_orm的数据库 mysql>CREATE DATABASE db_orm ch ...

  9. Drools规则引擎-判断集合(List)是否包含集合

    问题场景 在使用Drools规则引擎时,有朋友会遇到这样的问题,就是在when部分判断的两个参数都是集合类型,比如两个List,此时要判断一个集合是否包含另外一个集合的内容. 拿一个具体的例子来说明, ...

  10. mongon库加上权限认证后,java程序连接异常

    现象: linux库中mongo库,用超级管理员添加了一个超级管理员,并加了认证. 通过spring等相关的配置文件获取Mongo数据库连接,抛出异常,如下: Caused by: org.sprin ...