Sentinel(哨兵模式)

经过上期【Redis】主从复制 的学习,

我们知道 主从复制 是为了避免单点故障,将数据保存在多台服务器上的一种机制。

但是主节点只有一个,如果主节点挂掉了,怎么办?于是 哨兵模式 诞生了。

哨兵模式可以不时地监控 redis 是否按照预期良好的运行(至少是保证主节点是存在的),若一台主机出现问题,哨兵会自动将该主机下的某一从机设置为新的主机,并让其他从机和新主机建立主从关系。

《Redis 设计与实现》哨兵模式介绍:

Sentinel(哨兵)是Redis的高可用性解决方案:由一个或多个 Sentinel 实例组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新主服务器,然后由新的主服务器替代已下线的主服务器继续处理命令请求。

Sentinel(哨兵) 本质上只是一个运行在特殊模式下的Redis服务器,但是因为Sentinel(哨兵)并不使用数据库,所以初始化Sentinel(哨兵)时就不会载入RDB文件或者AOF文件。



哨兵模式架构模型

哨兵模式的三个定时任务

  1. 每10秒每个Sentinel(哨兵)向主从节点发送info命令,用来获取最新的主从结构
  2. 每2秒每个Sentinel(哨兵)通过master节点的channel交换信息,channel是发布订阅的频道,可以获取其他哨兵节点的信息。
  3. 每1秒Sentinel(哨兵)向与它创建了命令连接的实例(主、从服务器,其他Sentinel)发送PING命令,用来进行心跳检测,判断是否下线

Sentinel(哨兵)与Sentinel 、主服务器、从服务器之间的连接

Sentinel(哨兵)在连接主服务器 或者 从服务器时,会同时创建命令连接订阅连接,命令连接用来 向 主服务器 和 从服务器发送消息,而订阅连接用来接收来自主服务器和从服务器的信息。

但是在连接其他Sentinel(哨兵)时只会创建命令连接,而不创建订阅连接。这是因为Sentinel(哨兵)需要通过接收主服务器或者从服务器发来的信息发现未知的新Sentinel ,而相互已知的Sentinel只要用命令连接来进行通信就足够了。

检测下线状态

如果只有一个Sentinel(哨兵),那么可能会又出现单点故障的问题,所以一般设置多个Sentinel(哨兵)来监视。此外,这些不同的哨兵节点应部署在不同的物理机上。

在默认情况下Sentinel(哨兵)会以每秒一次的频率向与它创建了命令连接的实例(主、从服务器,其他Sentinel)发送PING命令,并通过回复来判断实例是否在线。

Sentinel(哨兵)将一个主服务器判断为下线后,为主观下线。为了确定这个主服务器是否真的下线了,他会向同样监视这一主服务器的其他Sentinel(哨兵)进行询问,看他们是否也认为主服务器已经进入了下线状态。如果多个哨兵(设置一个阈值)都认为 master 异常了,就会认为master 判定为客观下线,并对主服务器执行故障转移操作。

注意,这里客观下线是主节点才有的概念;如果从节点和哨兵节点发生故障,被哨兵主观下线后,不会再有后续的客观下线和故障转移操作。

选择领头 Sentinel(哨兵)

当主节点被判断客观下线以后,各个哨兵节点会进行协商,选举出一个领导者哨兵节点,并由该领导者节点对其进行故障转移操作。

监视该主节点的所有哨兵都有可能被选为领导者,选举使用的算法是 Raft 算法。选举规则:

  1. 每个哨兵都询问其它哨兵,请求对方为自己投票

  2. 每个哨兵只投票给第一个请求投票的哨兵,且只能投票一次

  3. 首先拿到超过半数投票的哨兵,当选为领导者,发起主从切换

故障转移

选举出的领导者哨兵,开始进行故障转移操作,该操作大体可以分为 3 个步骤:选出新的主服务器修改从服务器的复制目标将旧的主服务器变为从服务器

  • 选出新的主服务器

    选择新的主服务器,领头Sentinel 会将已下线主服务器所有从服务器保存到一个列表里面,按以下规则选出:

    1. 删除列表中所有处于下线或者断线状态的从服务器,保证列表中剩余都是正常在线的。

    2. 删除最近5秒内没有恢复INFO命令的从服务器,保证列表中剩余的都是最近成功进行通信的。

    3. 删除与已下线主服务器断开时长超过 10 * down-after-milliseconds 毫秒的从服务器,保证列表中剩余的从服务器保存的数据都是比较新的。

    4. 之后根据从服务器的优先级,选出优先级最高的从服务器。

    5. 如果有多个相同优先级的从服务器,那么领头Sentinel选出复制偏移量最大的从服务器(偏移量越大保存的数据越新)

    6. 最后,如果有多个优先级最高、复制偏移量最大的从服务器,那么领头Sentinel按照运行ID 排序,选择运行ID 最小的从服务器

  • 修改从服务器的复制目标

    当新主服务器出现后,领头Sentinel下一步会让已下线主服务器属下所有从服务器去复制新的主服务器

  • 将旧的主服务器变为从服务器

    最后要做的是,将旧的主服务器变为从服务器。当其重新上线时变为新的主服务器的从服务器。

缺点

哨兵仍然没有解决写操作无法负载均衡、及存储能力受到单机限制的问题;这些问题的解决需要使用集群

本文没有详细说明 Sentinel 的初始化过程,详细请看《Redis 设计与实现》第16章。

参考:

《Redis 设计与实现》

如何从0到1构建一个稳定、高性能的Redis集群?(附16张图解) (qq.com)

redis哨兵模式讲解_xingsilong的博客-CSDN博客_redis 哨兵模式

【Redis】Sentinel 哨兵模式的更多相关文章

  1. Redis sentinel 哨兵模式集群方案配置

    第一个方案是创建 redis cluster,第二种方案就是用哨兵模式来进行主从替换以及故障恢复.兵模式集群方案配置 一.sentinel介绍 Sentinel作用: 1):Master状态检测 2) ...

  2. Redis sentinel 哨兵模式

    一.sentinel介绍 Sentinel作用: 1):Master状态检测 2):如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Maste ...

  3. redis sentinel哨兵模式集群搭建教程

    1.环境说明 我们将使用192.168.220.128.192.168.220.129两台机器搭建sentinel交叉主从为例 当前我们已在192.168.220.128上按redis安装教程安装了r ...

  4. 【Redis】Redis Sentinel 哨兵模式搭建

    Redis Sentinel介绍 Redis Sentinel是Redis的官方高可用性解决方案 Redis Sentinel为Redis提供高可用性.实际上,这意味着使用Sentinel可以创建一个 ...

  5. Redis 5 配置 Redis sentinel(哨兵模式)

    先了解一下哨兵都 做了什么工作:Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: * 监控(Monitoring): Sentin ...

  6. Redis笔记-Sentinel哨兵模式

    Redis以主从的模式搭建集群后,如果主节点Master挂掉,虽然可以实现将备用节点Slave切换成主节点,但是Redis本身并没有自动监控机制,需要借助Sentinel哨兵模式,实现监控并实现自动切 ...

  7. (六) Docker 部署 Redis 高可用集群 (sentinel 哨兵模式)

    参考并感谢 官方文档 https://hub.docker.com/_/redis GitHub https://github.com/antirez/redis happyJared https:/ ...

  8. Redis-Sentinel Redis的哨兵模式

    Redis-Sentinel Redis的哨兵模式Redis Sentinel 模式简介Redis-Sentinel是官方推荐的高可用解决方案,当redis在做master-slave的高可用方案时, ...

  9. redis的哨兵模式

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

  10. Redis Sentinel哨兵配置

    概述 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都 ...

随机推荐

  1. numpy中的nan和常用方法

    1.数组的拼接 import numpy as np t1 = np.array([[0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11]]) t2 = np.array([ ...

  2. 种类并查集(维护敌人的敌人是朋友)、并行-poj1182-食物链 笔记

    题意 输入若干组数据,代表着不同动物在食物链的位置(A,B,C),要求出在输入的过程中有多少组数据会与之前矛盾. 思路(借鉴挑战程序设计竞赛) 这题是学并查集时的题,所以用了并查集. 一开始我想的是, ...

  3. sql server 如何跟更新拼接的数据(cast用法)

    我们在实际中会做如下图的连接 执行以后这个连接就会报错了,如下图所示   然后我们用cast将数字转换为字符串在连接,如下图所示     这次连接的结果就没问题了,如下图所示     最后如果两个数字 ...

  4. vim 常用操作技巧

    记录常用的vim操作技巧,基本满足90%的日常编辑使用. 文档操作 vim test.txt 打开当前目录下的test.txt文档,若不存在则创建该文件 :w 保存当前修改到文件 :w bak.txt ...

  5. 全志Tina_dolphin播放音视频裸流(h264,pcm)验证

    最近在验证tina对裸流音视频的支持,主要指h264视频裸流及pcm音频裸流. 在原始sdk中有针对很多video和audio类型的parser,但就是没有找到pcm和h264的parser,所以需要 ...

  6. cf 11D A Simple Task(状压DP)

    题意: N个点构成的无向图,M条边描述这个无向图. 问这个无向图中共有多少个环. (1 ≤ n ≤ 19, 0 ≤ m) 思路: 例子: 4 6 1 2 1 3 1 4 2 3 2 4 3 4 答案: ...

  7. linux 内核源代码情景分析——地址映射的全过程

    linux 内核采用页式存储管理.虚拟地址空间划分成固定大小的"页面",由MMU在运行时将虚拟地址映射成某个物理内存页面中的地址.页式内存管理比段式内存管理有很多好处,但是由于In ...

  8. 2016西邮Linux兴趣小组大事记

    2016年还有半个小时就结束了,前面把自己9月做的规划拿出来完善了下,觉得真的是不容易的一年,所有的事情只有自己经历过才会有不一样的感受,世上无难事,只怕有心人. 这是我九月份制定的计划: 下面是20 ...

  9. aardio 开发桌面应用,这几点必须要掌握!

    1. 前言 大家好,我是安果! 上一篇文章写到可以通过 aardio 结合 Python 开发桌面应用,有些小伙伴后台给我留言,说 Aardio 资料太少,希望我能补充一些实用的功能 实用 | 利用 ...

  10. 解决IntelliJ IDEA的Plugins无法访问Marketplace去下载插件

    本文图文讲解如何解决IntelliJ IDEA的Plugins无法访问Marketplace去下载插件. 默认打开IDEA的Plugins会加载很久,最后什么也没加载出来. 这时我们可以给插件市场设置 ...