在说哨兵之前,我们先说下主从复制,Redis 的主从复制模式,一旦主节点出现故障无法提供服务,需要人工介入手工将从节点调整为主节点,同时应用端还需要修改新的主节点地址,这种故障转移的方式对于很多应用场景是不能容忍的。正式由于这个问题,Redis 提供了 Sentinel(哨兵) 架构来解决这个问题。

什么是哨兵?

Redis Sentinel 是一个分布式的架构,它本身也是一个独立的 Redis 节点,只不过它不存储数据,只支持部分命令,它能够自动完成故障发现和故障转移,并通知应用方,从而实现高可用。

Redis Sentinel 包含若干个 Sentinel 节点和 Redis 数据节点,每个 Sentinel 节点会对数据节点和其他 Sentinel 节点进行监控,当发现节点异常时,会对节点做下线标识,如果被标识的是主节点,此时会与其他Sentinel 节点进行协商,当大多数Sentinel 节点都人为主节点不可达时候,会发起选举,选出一个 Sentinel 节点来完成自动故障转移的工作,同时会将这个变化通知给 Redis 的应用方。这个过程是完全自动化的,无需人工干预。

Sentinel 主要提供以下几个功能:监控:定期检测Redis 数据节点、其他 Sentinel 节点是否可达。

通知:将故障转移的结果通知给应用方。

主节点故障转移:实现从节点晋升为主节点,并维护后续正确的主从关系

配置提供者:客户端在初始化的时候连接 Sentinel 节点集合,从中获取主节点信息。

多个 Sentinel 节点来共同判断故障,可以有效防止误判,同时如果个别 Sentinel 节点不可用,整个 Sentinel 节点集合依然是高可用的。

安装和部署

部署说明3 个 Sentinel 节点 、1 个主节点 、2 个从节点。

部署数据节点

redis-6379.conf

port 6379

daemonize yes

logfile "6739.log"

dbfilename "dump-6379.rdb"

dir "/opt/soft/redis/data"

redis-6380.conf

port 6380

daemonize yes

logfile "6780.log"

dbfilename "dump-6380.rdb"

dir "/opt/soft/redis/data"

slaveof 127.0.0.1 6379

redis-6381.conf

port 6381

daemonize yes

logfile "6781.log"

dbfilename "dump-6381.rdb"

dir "/opt/soft/redis/data"

slaveof 127.0.0.1 6379

部署 sentinel 节点sentinel 默认 的端口是 26379,这里我们创建三个 sentinel 节点,端口分别是 26379、26380、26381。

redis-sentinel-26379.conf

port 26379

daemonize yes

logfile "26379.log"

dir /opt/soft/redis/data

sentinel monitor mymaster 127.0.0.1 6379 2

sentinel down-after-milliseconds mymaster 30000

sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster 180000

redis-sentinel-26380.conf

port 26380

daemonize yes

logfile "26380.log"

dir /opt/soft/redis/data

sentinel monitor mymaster 127.0.0.1 6379 2

sentinel down-after-milliseconds mymaster 30000

sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster 180000

redis-sentinel-26381.conf

port 26381

daemonize yes

logfile "26381.log"

dir /opt/soft/redis/data

sentinel monitor mymaster 127.0.0.1 6379 2

sentinel down-after-milliseconds mymaster 30000

sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster 180000

如果要监控多个主节点,则只需要指定多个 msater-name 来区分不同的主节点即可。

sentinel monitor mymaster-1 127.0.0.1 6379 2

sentinel down-after-milliseconds mymaster 30000

sentinel parallel-syncs mymaster-1 1

sentinel failover-timeout mymaster-1 180000

sentinel monitor mymaster-2 127.0.0.1 6379 2

sentinel down-after-milliseconds mymaster 30000

sentinel parallel-syncs mymaster-2 1

sentinel failover-timeout mymaster-2 180000

配置说明:

sentinel monitorport 指定 sentinel 节点的端口

sentinel monitor master-name 是给要监控的节点起一个名字,ip 和 port 表示监控一个主节点,quorum 表示要判断主节点最终不可达所需要的票数。同时这个参数还与选举领导者有关,至少需要max(quorum,num/2+1)个节点参与选举,才能选出领导者 sentinel,从而完成故障转移。比如总共有 5 个 sentinel 节点,quorum =4 ,name 至少需要 4 个sentinel 节点才可以进行领导者的选举。

当所有节点启动时候,配置文件会发生变化,包括:sentinel 自动发信了从节点以及其他 sentinel 节点。

去掉里面默认配置,例如 parallel-sync failover-timeout 参数。

添加了配置 纪元相关参数。

sentinel down-after-milliseconds配置

sentinel down-after-milliseconds

每个 sentinel 节点都要定期发送 ping 命令来判断 redis 数据节点和其他 sentinel 节点是否可达,如果超过了down-after-milliseconds 配置的时间且没有有效回复,则判断节点不可达。times 单位是毫秒。down-after-milliseconds虽然以为参数,但实际上对 Sentinel节点、主节点、从节点的失败判定同时有效。sentinel parallel-syncs配置:

sentinel parallel-syncs

当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,parallel-syncs 就是用来限制在一次故障转移之后,每次向新的主节点发起复制操作的从节点个数。如果这个参数配置的比较大,那么多个从节 点会向新的主节点同时发起复制操作,尽管复制操作通常不会阻塞主节点, 但是同时向主节点发起复制,必然会对主节点所在的机器造成一定的网络和 磁盘IO开销。sentinel failover-timeout配置:

sentinel failover-timeout

failover-timeout通常被解释成故障转移超时时间,但实际上它作用于故障转移的各个阶段:选出合适从节点;

晋升选出的从节点为主节点;

命令其余从节点复制新的主节点;

等待原主节点恢复后命令它去复制新的主节点。

failover-timeout的作用具体体现在四个方面:如果Redis Sentinel对一个主节点故障转移失败,那么下次再对该主 节点做故障转移的起始时间是failover-timeout的2倍;

在晋升选出的从节点为主节点阶段时,如果Sentinel节点向a)阶段选出来的从节点执行slaveof no one一直失败(例如该从节点此时出现故障),当此过程超过 failover-timeout时,则故障转移失败;

在晋升选出的从节点为主节点阶段如果执行成功,Sentinel节点还会执行info命令来确认a) 阶段选出来的节点确实晋升为主节点,如果此过程执行时间超过failover- timeout时,则故障转移失败;

如果命令其余从节点复制新的主节点阶段执行时间超过了failover-timeout(不包含复制时间), 则故障转移失败。注意即使超过了这个时间,Sentinel节点也会最终配置从 节点去同步最新的主节点。

部署注意事项sentinel 节点不应该部署在同一台物理机上;

至少要部署三个以上的奇数 sentinel 节点;

选一套还是多套 sentinel,如果选一套可以一定程度降低维护成本,但是如果 sentinel 节点出现异常,可能会多多个 redis 数据节点造成影响,如果是多套,会造成资源浪费,但是每套 sentinel 都彼此隔离。

客户端连接

客户端连接,以 Java 为例,可使用 jedis 调用 jedisSentinelPool 方法来配置:

public class RedisSentinelClient {

/**

* @param args

*/

public static void main(String[] args) {

Set sentinels = new HashSet();

sentinels.add(new HostAndPort("10.12.37.71", 26379).toString());

sentinels.add(new HostAndPort("10.12.37.72", 26380).toString());

sentinels.add(new HostAndPort("10.12.37.73", 26381).toString());

JedisSentinelPool sentinelPool = new JedisSentinelPool("mymaster", sentinels);

System.out.println("Current master: " + sentinelPool.getCurrentHostMaster().toString());

Jedis master = sentinelPool.getResource();

master.set("username","awen");

sentinelPool.returnResource(master);

Jedis master2 = sentinelPool.getResource();

String value = master2.get("username");

System.out.println("username: " + value);

master2.close();

sentinelPool.destroy();

}

}

实现原理Sentinel 的三个定时监控任务:

每隔 10 秒向主节点和从节点发送 info 命令获取最新的拓扑。

每隔 2 秒,每个 sentinel 节点会向数据节点的sentinel:hello频道发送该 sentinel 节点对于主节点的判断以及当前 sentinel 节点信息,同时每个 sentinel 节点也会订阅该频道,来了解其他 sentinel 节点以及他们对主节点的判断。

每个 1 秒,每个 sentinel 节点会向主节点、从节点、其他 sentinel 节点发送一条 ping 命令做一次心跳检测,判断节点是否存活。

主观下线:

当节点超过 down-after-milliseconds 没有进行有效回复,就会判定该节点失败,这叫主观下线。

客观下线:

当Sentinel主观下线的节点是主节点时,该Sentinel节点会通过sentinel is- master-down-by-addr命令向其他Sentinel节点询问对主节点的判断,当超过个数,Sentinel节点认为主节点确实有问题,这时该Sentinel节点会 做出客观下线的决定 。

领导者选举:选举的过程非常快,基本上谁先完成客观下线,谁就是领导者。

每个在线的Sentinel节点都有资格成为领导者,当它确认主节点主观 下线时候,会向其他Sentinel节点发送sentinel is-master-down-by-addr命令, 要求将自己设置为领导者。

收到命令的Sentinel节点,如果没有同意过其他Sentinel节点的sentinel is-master-down-by-addr命令,将同意该请求,否则拒绝。

如果该Sentinel节点发现自己的票数已经大于等于max(quorum, num(sentinels)/2+1),那么它将成为领导者。

如果此过程没有选举出领导者,将进入下一次选举。

故障转移,在从节点列表中选出一个节点作为新的主节点,选择方法如下:

过滤:“不健康”(主观下线、断线)、5秒内没有回复过Sentinel节 点ping响应、与主节点失联超过down-after-milliseconds*10秒。

选择slave-priority(从节点优先级)最高的从节点列表,如果存在返回,不存在则继续。

选择复制偏移量最大的从节点(复制的最完整),如果存在则返回,不存在则继续。

选择runid最小的从节点。

为什么至少三个哨兵_为什么需要 Redis 哨兵?相关推荐

  1. java 什么是哨兵_Java中的Redis 哨兵高可用性

    让我们探索Redis Sentinel,看看如何在Java上运行它,一起来看看,最近get了很多新知识,分享给大家参考学习.需要详细的java架构思维导图路线也可以评论获取! 什么是Redis哨兵? ...

  2. REDIS哨兵【Sentinel】模式+哨兵的核心知识点+redis哨兵主从切换的数据丢失问题+上一章铺垫的【异步复制数据丢失问题】+【集群脑裂】

    1.redis哨兵模式的前言: 一年一度的问题来了,为啥子要用redis的哨兵模式的呢? 简单粗暴的理解下子,顺带开个玩笑,没有理解好,还望不要见笑: 其实redis的哨兵模式,个人理解:只是说法搞大 ...

  3. java 什么是哨兵_Java中使用redis哨兵模式

    Redis概述 在传统的软件项目中,使用数据库进行数据存储,但是有一些致命的缺陷,这些缺陷反映在性能方面.由于数据库存储数据的介质是磁盘,而磁盘读写的速度比较慢.在不存在大量高并发的应用场景中,这个缺 ...

  4. redis 哨兵_docker里创建redis哨兵

    参考:https://www.jianshu.com/p/ba4667e242f3 https://www.jocat.cn/archives/51908 https://www.runoob.com ...

  5. php配置redis哨兵模式,详解Redis哨兵模式

    下面由Redis教程栏目给大家介绍关于java基于redis有序集合实现排行榜,希望对需要的朋友有所帮助! 哨兵是一个独立的进程. 原理:哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个 ...

  6. Redis面试题-Redis哨兵模式

    本文参考 嗨客网 Redis面试题 Redis哨兵模式 什么是Redis哨兵模式 Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress ...

  7. redis哨兵模式从服务器作用,通过Redis主从复制和哨兵模式进行可行性验证实践...

    一.前言 下面主要从Redis主从复制的工作原理(全量同步.增量同步.Redis主从同步策略).Redis哨兵模式介绍(应用场景.哨兵模式的工作原理).Redis主从复制的可用性验证等及具体分析说明 ...

  8. 为什么至少三个哨兵_入职第一周,组长让我把部门redis服务搞成哨兵模式...慌-龙跃十二...

    少点代码,多点头发 本文已经被GitHub收录,欢迎大家踊跃star 和 issues. 入职第一周,我被坑了 最近刚入职新公司,本来想着这刚来新公司,一般都是熟悉熟悉公司同事,看看组内工程文档,找几 ...

  9. 为什么至少三个哨兵_部队大门为什么要立一块“哨兵神圣,不可侵犯”的牌子?_知道问答...

    当过兵的人都知道,在部队大门,通常都立着一块这样的牌子,上面写着八个字-哨兵神圣,不可侵犯(卫兵神圣,不容侵犯).相信哪怕是没当过兵的人,当你经过部队大门时,也一定看到过这样的牌子. 很多人不禁要问了 ...

最新文章

  1. 获取长度length_lab、labE、la、laE、ll、llE 钢筋锚固搭接长度6项参数的相互关系...
  2. 粗糙集(Rough sets)、模糊逻辑(Fuzzy Logic)
  3. 【多线程】Java线程面试题 Top 50(转载)
  4. 从零开始学习jQuery (十) jQueryUI常用功能实战
  5. 巴克莱:对冲基金AI和大数据工作指南
  6. 给字母保密的c语言,C语言练习题
  7. 大创中期报告怎么写_课题研究中期报告怎么写?这篇范文很说的很详细
  8. IIS的Windows集成身份验证总结
  9. java 计数器越界,[总结]-第二章 Java内存区域与内存溢出异常
  10. azure夜校培训第6场 3月22日 18:00---MYSQL
  11. Map转成JSON对象
  12. 那个超级浏览器好(跨境浏览器哪个好)
  13. 简单使用触发器(详细) SQL触发器的使用及语法
  14. matlab中算术平方根,改进的平方根法matlab
  15. 柚鸥ASO优化:aso搜索优化怎么做
  16. linux中引号的作用是什么意思,Linux中的双引号的作用
  17. Java+Axis WebService接口开发实例
  18. js之dom操作练习 ---- js篇
  19. https 以及内网如何使用
  20. 正则“^[a-zA-Z]” 和 “[^a-zA-Z]”的区别

热门文章

  1. 关于SAP Spartacus重载(override)UserAuthenticationTokenService的问题
  2. SAP Spartacus user role页面的checkbox设计明细介绍
  3. 使用SAP C4C的OData服务的deep insert操作创建Lead
  4. SAP BSP, Java Web Project,Android和微信小程序的初始页面设置
  5. Pricing in SAP CRM and Cloud for Customer
  6. how to replace the note reuse project into my own one
  7. react native命令行全局安装
  8. Angular:where does watchers in scope come from
  9. UI5 metadata usage in the runtime
  10. SAP CRM One Order scheduline buffer handling