Redis 的 Sentinel 哨兵是个特殊的 Redis 服务,不提供读写服务,主要用于管理多个 Redis 服务器实例, 执行以下三个任务:

  • 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
  • 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
  • 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

哨兵模式的工作原理

在主从模式下,哨兵是一个独立的进程。其原理是哨兵进程向所有的 redis 机器发送命令,等待 redis 服务器响应,从而监控运行的多个 redis 实例。

哨兵可以有多个,为了便于决策选举,尽量使用奇数个哨兵。多个哨兵构成一个哨兵集群,哨兵直接也会相互通信,检查哨兵是否正常运行,当发现 master 宕机后哨兵之间会进行决策选举新的 master。

为什么要使用哨兵模式

主从模式下,主节点会自动将数据同步到从节点,为了分载 master 的读操作压力,slave 服务器可以为客户端提供只读操作的服务,写服务依然必须由 master 来完成,实现读写分离。

当主节点宕机后,需要手动把一台从节点切换为主节点,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。

在哨兵模式下当 redis 的主节点发生变化,哨兵会第一时间感知到,并且将新的 redis 主节点通知给 client 端(主要是依靠发布/订阅)。

注意:

在哨兵模式下 client 端第一次从哨兵找出 redis 的主节点,后续就直接访问 redis 的主节点,不会每次都通过 sentinel 代理访问 redis 的主节点。

哨兵之间怎么发现的

配置启动哨兵时未曾配置对应的IP,哨兵之间是怎么发现对方的?

因为 Sentinel 可以通过发布与订阅功能来自动发现正在监视相同主服务器的其他 Sentinel , 这一功能是通过向频道 sentinel:hello 发送信息来实现的。

因此就不需要手动列出主服务器属下的所有从服务器, 因为 Sentinel 可以通过询问主服务器来获得所有从服务器的信息。

  • 每个 Sentinel 会以每两秒一次的频率, 通过发布与订阅功能, 向被它监视的所有主服务器和从服务器的 sentinel:hello 频道发送一条信息, 信息中包含了 Sentinel 的 IP 地址、端口号和运行 ID (runid)。
  • 每个 Sentinel 都订阅了被它监视的所有主服务器和从服务器的 sentinel:hello 频道, 查找之前未出现过的 sentinel (looking for unknown sentinels)。 当一个 Sentinel 发现一个新的 Sentinel 时, 它会将新的 Sentinel 添加到一个列表中, 这个列表保存了 Sentinel 已知的, 监视同一个主服务器的所有其他 Sentinel 。
  • Sentinel 发送的信息中还包括完整的主服务器当前配置(configuration)。 如果一个 Sentinel 包含的主服务器配置比另一个 Sentinel 发送的配置要旧, 那么这个 Sentinel 会立即升级到新配置上。
  • 在将一个新 Sentinel 添加到监视主服务器的列表上面之前, Sentinel 会先检查列表中是否已经包含了和要添加的 Sentinel 拥有相同运行 ID 或者相同地址(包括 IP 地址和端口号)的 Sentinel , 如果是的话, Sentinel 会先移除列表中已有的那些拥有相同运行 ID 或者相同地址的 Sentinel , 然后再添加新 Sentinel 。

如果一个哨兵连接到主节点,则会获取主节上所有连接的从节点为,然后通过发布/订阅功能发现其他哨兵。

配置 Sentinel

Redis 源码中包含了一个名为 sentinel.conf 的文件, 这个文件是一个带有详细注释的 Sentinel 配置文件示例。

运行一个 Sentinel 所需的最少配置如下所示:

port 26379
#开启守护线程
daemonize yes # 指定主节点信息
sentinel monitor mymaster 127.0.0.1 6379 2sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000# 选举master时的quorum值
sentinel parallel-syncs mymaster 1

配置指示 Sentinel 去监视一个名为 mymaster 的主服务器, 这个主服务器的 IP 地址为 127.0.0.1 , 端口号为 6379 , 而将这个主服务器判断为失效至少需要 2 个 Sentinel 同意 (只要同意 Sentinel 的数量不达标,自动故障迁移就不会执行)。

不过要注意, 无论你设置要多少个 Sentinel 同意才能判断一个服务器失效, 一个 Sentinel 都需要获得系统中多数(majority) Sentinel 的支持, 才能发起一次自动故障迁移, 并预留一个给定的一个新主服务器配置的版本号。

在只有少数(minority) Sentinel 进程正常运作的情况下, Sentinel 是不能执行自动故障迁移的。其他选项的基本格式如下:

sentinel <选项的名字> <主服务器的名字> <选项的值>

各个选项的功能如下:

  • down-after-milliseconds:选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。

如果服务器在给定的毫秒数之内, 没有返回 Sentinel 发送的 PING 命令的回复, 或者返回一个错误, 那么 Sentinel 将这个服务器标记为主观下线(subjectively down,简称 SDOWN )。

不过只有一个 Sentinel 将服务器标记为主观下线并不一定会引起服务器的自动故障迁移: 只有在足够数量的 Sentinel 都将一个服务器标记为主观下线之后, 服务器才会被标记为客观下线(objectively down, 简称 ODOWN ), 这时自动故障迁移才会执行。

将服务器标记为客观下线所需的 Sentinel 数量由对主服务器的配置决定。

  • parallel-syncs:选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。

如果从服务器被设置为允许使用过期数据集(参见对 redis.conf 文件中对 slave-serve-stale-data 选项的说明), 那么你可能不希望所有从服务器都在同一时间向新的主服务器发送同步请求, 因为尽管复制过程的绝大部分步骤都不会阻塞从服务器, 但从服务器在载入主服务器发来的 RDB 文件时, 仍然会造成从服务器在一段时间内不能处理命令请求: 如果全部从服务器一起对新的主服务器进行同步, 那么就可能会造成所有从服务器在短时间内全部不可用的情况出现。

你可以通过将这个值设为 1 来保证每次只有一个从服务器处于不能处理命令请求的状态。

Redis集群系列三 —— 哨兵集群原理相关推荐

  1. 网赚项目之站群第三课 站群上线以及注意事项

    网赚项目之站群 第三课 站群上线以及注意事项 空间域名和程序都做好后,我们的站群就可以上线了.上线前,我们要运筹帷幄,做好以下几件事情. 第一,做好网站分类 如果做100个站的话,我们最好给站群分为5 ...

  2. Redis集群模式之哨兵模式工作原理

    文章目录 前言 - 单机Redis的风险与问题 2. 哨兵模式 2.1 哨兵简介 2.2 哨兵工作原理 2.2.1 阶段一: 监控阶段 2.2.2 阶段二: 通知阶段 2.2.3 阶段三: 故障转移阶 ...

  3. Dubbo源码学习总结系列三 dubbo-cluster集群模块

    Dubbo集群模块的目的是将集群Invokers构造一个透明的Invoker对象,其中包含了容错机制.负载均衡.目录服务(服务地址集合).路由机制等,为RPC层提供高可用.高并发.自动发现.可治理的S ...

  4. Linux服务器集群系统(三)——LVS集群中的IP负载均衡技术

     原文地址:http://www.linuxvirtualserver.org/zh/lvs3.html 本文在分析服务器集群实现虚拟网络服务的相关技术上,详细描述了LVS集群中实现的三种IP负载 ...

  5. redis深度系统学习三:主从复制的原理与注意事项

    前言 在前面的两篇文章中,分别介绍了Redis的内存模型和Redis的持久化. 在Redis的持久化中曾提到,Redis高可用的方案包括持久化.主从复制(及读写分离).哨兵和集群.其中持久化侧重解决的 ...

  6. 【深度相机系列三】深度相机原理揭秘--双目立体视觉

    本文已经首发在个人微信公共号:计算机视觉life(微信号CV_life),欢迎关注! 导读 为什么非得用双目相机才能得到深度? 双目立体视觉深度相机的工作流程 双目立体视觉深度相机详细工作原理 理想双 ...

  7. 网络安全系列-三十三: 网络情报原理及情报侦察的技术、工具及资源

    1. 什么是网络情报 1.1. 情报定义 Intelligence 情报:一种有用的信息,通常需要被搜集.处理.分析.协助决策者做出正确行动 CI: Cyber Intelligence 网络空间情报 ...

  8. Redis单机模式主从模式哨兵模式集群模式搭建

    文章目录 一.Redis下载及安装 1.1.下载 1.2.环境安装 1.3.编译安装 1.4.修改配置 1.5.启动Redis 1.6.验证Redis是否启动 1.7.进入到Redis客户端 1.8. ...

  9. redis主从读写分离replication复制数据+sentienl哨兵集群主备切换

    说明:最近公司在自己搭建了一套redis主从读写分离+sentinel哨兵集群主备切换,通过手工去搭建replication复制+主从架构+读写分离+哨兵集群+高可用redis集群架构 公司的已经搭建 ...

最新文章

  1. 40+场面试,100%通过率,我想分享的 14 条经验
  2. 反编译sencha toucha打包的apk文件,修改应用名称支持中文以及去除应用标题栏
  3. 博客美化20150418
  4. PHP中var_dump
  5. Java程序设计----Java编程基础
  6. 如何通过Fiori后台调试的方式找到gateway系统的ID
  7. mysql出现can t_php运行提示Can't connect to MySQL server on 'localhost'的解决方法
  8. Java 调用 Caffe_解决 free(): invalid pointer: 0x00000000019ff700 运行时报错(caffe)(libtool使用)...
  9. php class行为,PHP CLASS
  10. 多线程篇三:线程同步
  11. Android APK XML解析与反编译方法
  12. 高可用分布式非关系型数据库-Cassandra
  13. 软件安装 | SolidWorks2016软件安装,SW2010-2016.Activator.GUI.SSQ激活闪退解决办法
  14. matlab中转置矩阵的特征值,矩阵乘以矩阵的转置运算的解析
  15. 全志A64和瑞芯微RK3288参数对比介绍
  16. Sqlite3实现脏读
  17. 青春(2010-05-28 04:30:39)韩寒
  18. C语言+EasyX库实现--绘制彩虹
  19. 如何修改图片的dpi?图片怎么调dpi?
  20. 查询跟踪多家快递单号,筛选某一时间发货的单号

热门文章

  1. 陈一佳担任BCF理事
  2. JavaScript 文件上传详解
  3. 被投资人坑的大学生创业者
  4. Altium Designer、EAGLE、OrCAD、Proteus、KiCAD、LTspice、NI Multisim这些软件各有什么优缺点...
  5. 牛客P19836 裴蜀定理+莫比乌斯反演+杜教筛
  6. [抽象代数]英语词汇
  7. 正方形螺旋线python,python绘制正方形螺旋线
  8. 微信小程序实现websocket及单人聊天功能
  9. epsxe安卓最新版下载_安卓版索尼ps模拟器(ePSXe)
  10. MATLAB矩阵运算函数