百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

为什么需要 Redis 哨兵?(为什么要用redis)

mhr18 2024-10-23 11:32 17 浏览 0 评论

作者 | 阿文

责编 | 郭芮

出品 | CSDN(ID:CSDNnews)

在说哨兵之前,我们先说下主从复制,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 monitor

  • port 指定 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 <master-name> <times>

每个 sentinel 节点都要定期发送 ping 命令来判断 redis 数据节点和其他 sentinel 节点是否可达,如果超过了down-after-milliseconds 配置的时间且没有有效回复,则判断节点不可达。times 单位是毫秒。

down-after-milliseconds虽然以

sentinel parallel-syncs

配置:

sentinel parallel-syncs <master-name> <nums>

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

sentinel failover-timeout

配置:

sentinel failover-timeout <master-name> <times>

failover-timeout通常被解释成故障转移超时时间,但实际上它作用于故障转移的各个阶段:

  • 选出合适从节点;

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

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

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

failover-timeout的作用具体体现在四个方面:

  • 如果Redis Sentinel对一个主节点故障转移失败,那么下次再对该主 节点做故障转移的起始时间是failover-timeout的2倍;

  • 在晋升选出的从节点为主节点阶段如果执行成功,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 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最小的从节点。

【End】

相关推荐

Redis合集-使用benchmark性能测试

采用开源Redis的redis-benchmark工具进行压测,它是Redis官方的性能测试工具,可以有效地测试Redis服务的性能。本次测试使用Redis官方最新的代码进行编译,详情请参见Redis...

Java简历总被已读不回?面试挂到怀疑人生?这几点你可能真没做好

最近看了几十份简历,发现大部分人不是技术差,而是不会“卖自己”——一、简历死穴:你写的不是经验,是岗位说明书!反面教材:ד使用SpringBoot开发项目”ד负责用户模块功能实现”救命写法:...

redission YYDS(redission官网)

每天分享一个架构知识Redission是一个基于Redis的分布式Java锁框架,它提供了各种锁实现,包括可重入锁、公平锁、读写锁等。使用Redission可以方便地实现分布式锁。red...

从数据库行锁到分布式事务:电商库存防超卖的九重劫难与破局之道

2023年6月18日我们维护的电商平台在零点刚过3秒就遭遇了严重事故。监控大屏显示某爆款手机SKU_IPHONE13_PRO_MAX在库存仅剩500台时,订单系统却产生了1200笔有效订单。事故复盘发...

SpringBoot系列——实战11:接口幂等性的形而上思...

欢迎关注、点赞、收藏。幂等性不仅是一种技术需求,更是数字文明对确定性追求的体现。在充满不确定性的网络世界中,它为我们建立起可依赖的存在秩序,这或许正是技术哲学最深刻的价值所在。幂等性的本质困境在支付系...

如何优化系统架构设计缓解流量压力提升并发性能?Java实战分享

如何优化系统架构设计缓解流量压力提升并发性能?Java实战分享在高流量场景下。首先,我需要回忆一下常见的优化策略,比如负载均衡、缓存、数据库优化、微服务拆分这些。不过,可能还需要考虑用户的具体情况,比...

Java面试题: 项目开发中的有哪些成长?该如何回答

在Java面试中,当被问到“项目中的成长点”时,面试官不仅想了解你的技术能力,更希望看到你的问题解决能力、学习迭代意识以及对项目的深度思考。以下是回答的策略和示例,帮助你清晰、有说服力地展示成长点:一...

互联网大厂后端必看!Spring Boot 如何实现高并发抢券逻辑?

你有没有遇到过这样的情况?在电商大促时,系统上线了抢券活动,结果活动刚一开始,服务器就不堪重负,出现超卖、系统崩溃等问题。又或者用户疯狂点击抢券按钮,最后却被告知无券可抢,体验极差。作为互联网大厂的后...

每日一题 |10W QPS高并发限流方案设计(含真实代码)

面试场景还原面试官:“如果系统要承载10WQPS的高并发流量,你会如何设计限流方案?”你:“(稳住,我要从限流算法到分布式架构全盘分析)…”一、为什么需要限流?核心矛盾:系统资源(CPU/内存/数据...

Java面试题:服务雪崩如何解决?90%人栽了

服务雪崩是指微服务架构中,由于某个服务出现故障,导致故障在服务之间不断传递和扩散,最终造成整个系统崩溃的现象。以下是一些解决服务雪崩问题的常见方法:限流限制请求速率:通过限流算法(如令牌桶算法、漏桶算...

面试题官:高并发经验有吗,并发量多少,如何回复?

一、有实际高并发经验(建议结构)直接量化"在XX项目中,系统日活用户约XX万,核心接口峰值QPS达到XX,TPS处理能力为XX/秒。通过压力测试验证过XX并发线程下的稳定性。"技术方案...

瞬时流量高并发“保命指南”:这样做系统稳如泰山,老板跪求加薪

“系统崩了,用户骂了,年终奖飞了!”——这是多少程序员在瞬时大流量下的真实噩梦?双11秒杀、春运抢票、直播带货……每秒百万请求的冲击,你的代码扛得住吗?2025年了,为什么你的系统一遇高并发就“躺平”...

其实很多Java工程师不是能力不够,是没找到展示自己的正确姿势。

其实很多Java工程师不是能力不够,是没找到展示自己的正确姿势。比如上周有个小伙伴找我,五年经验但简历全是'参与系统设计''优化接口性能'这种空话。我就问他:你做的秒杀...

PHP技能评测(php等级考试)

公司出了一些自我评测的PHP题目,现将题目和答案记录于此,以方便记忆。1.魔术函数有哪些,分别在什么时候调用?__construct(),类的构造函数__destruct(),类的析构函数__cal...

你的简历在HR眼里是青铜还是王者?

你的简历在HR眼里是青铜还是王者?兄弟,简历投了100份没反应?面试总在第三轮被刷?别急着怀疑人生,你可能只是踩了这些"隐形求职雷"。帮3630+程序员改简历+面试指导和处理空窗期时间...

取消回复欢迎 发表评论: