【云原生进阶之PaaS中间件】第一章Redis-2.3.2哨兵模式

news2024/11/28 14:42:00

 1 哨兵模式

        由于无法进行主动恢复,因此主从模式衍生出了哨兵模式。哨兵模式基于主从复制模式,只是引入了哨兵来监控与自动处理故障。Redis Sentinel是社区版本推出的原生高可用解决方案,Redis Sentinel部署架构主要包括两部分:Redis Sentinel集群和Redis数据集群,其中Redis Sentinel集群是由若干Sentinel节点组成的分布式集群,可以实现故障发现、故障自动转移、配置中心和客户端通知。Redis Sentinel的节点数量要满足2n+1(n>=1)的奇数个。

1.1 优劣势分析

1.1.1 优点

  1. Redis Sentinel集群部署简单
  2. 能够解决Redis主从模式下的高可用切换问题
  3. 很方便实现Redis数据节点的线形扩展,轻松突破Redis自身单线程瓶颈,可极大满足对Redis大容量或高性能的业务需求。
  4. 可以实现一套Sentinel监控一组Redis数据节点或多组数据节点

1.1.2 缺点

  1. 部署相对Redis 主从模式要复杂一些,原理理解更繁琐
  2. 资源浪费,Redis数据节点中slave节点作为备份节点不提供服务
  3. Redis Sentinel主要是针对Redis数据节点中的主节点的高可用切换,对Redis的数据节点做失败判定分为主观下线和客观下线两种,对于Redis的从节点有对节点做主观下线操作,并不执行故障转移。
  4. 不能解决读写分离问题,实现起来相对复杂

1.2 Sentinel 的三大作用

  • 监控(Monitoring): Sentinel 会不断地检查(ping指令)你的主服务器和从服务器是否运作正常。
  • 提醒(Notification): 当个 Sentinel 监控 Redis服务器的状态,会在多个Sentinel之间进行数据共享
  • 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时,Sentinel会开始一次自动故障转移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器。

        故障转移挑选新master的原则:

  1. 在线的slave节点
  2. 响应快的(与Sentinel响应)
  3. 与原master响应频繁的
  4. 优先原则(offset小的,runid 小的)

        挑选好新的master节点后,Sentinel 向 新master发送 slaveof no one 指令,向其他的slave发送

slaveof [新master的IP] [新master的端口]

2 Sentinel 模式工作原理

2.1 Redis sentinel工作原理

        在哨兵模式架构中,client端在首次访问Redis服务时,实际上访问的是哨兵(sentinel),sentinel会将自己监控的Redis实例的master节点信息返回给client端,client后续就会直接访问Redis的master节点,并不是每次都从哨兵处获取master节点的信息。

        sentinel会实时监控所有的Redis实例是否可用,当监控到Redis的master节点发生故障后,会从剩余的slave节点中选举出一个作为新的master节点提供服务,并将新master节点的地址通知给client端,其他的slave节点会通过slaveof命令重新挂载到新的master节点下。当原来的master节点恢复后,也会作为slave节点挂在新的master节点下。如下图:

         一般情况下,为了保证高可用,sentinel也会进行集群部署,防止单节点sentinel挂掉。当sentinel集群部署时,各sentinel除了监控redis实例外,还会彼此进行监控。如下图:

 2.2 Redis sentinel是如何进行监控的

        要实现Redis节点的监控,sentinel首先要得到所有的Redis节点的信息。sentinel通过在配置文件中配置 sentinel monitor 选项来指定要监控的redis master节点的地址,然后在启动sentinel时,会创建与redis master节点的连接并向master节点发送一个info命令,master节点在收到info命令后,会将自身节点的信息和自己下面所有的slave节点的信息返回给sentinel,sentinel收到反馈后,会与新的slave节点创建连接,接下来就会每隔10秒钟向所有的redis节点发送info命令来获取最新的redis主从结构信息。

        有了redis实例的主从信息后,sentinel就会以每秒钟一次的频率向所有redis实例发送一个PING命令,而且如果sentinel是集群部署的话,每个sentinel还会以同样的频率向其他sentinel实例发送PING命令。当redis实例和sentinel实例收到PING命令后,会向sentinel返回一个有效的回复:+PONG 、-LOADING 或者 -MASTERDOWN,若返回其他的回复,或者在指定时间内(sentinel down-after-milliseconds 选项配置)没有回复,那么sentinel认为实例的回复无效。如果实例在 sentinel down-after-milliseconds 时间内未返回过一次有效的回复,那该实例就会被sentinel标记为主观下线(Subjectively Down,简称 SDOWN,指的是单个 sentinel 实例对服务节点做出的下线判断)。

        当redis master节点被足够数量(sentinel monitor 选项配置,其中的quorum即为指定的sentinel数量,下面会详细介绍相关参数)的sentinel标记为主观下线后,那么master节点就会被标记为客观下线(Objectively Down,简称 ODOWN,指的是多个 sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断。【一个 sentinel 可以通过向另一个 sentinel 发送 SENTINEL is-master-down-by-addr 命令来询问对方是否认为给定的服务器已下线】)。客观下线条件只适用于主服务器: 对于任何其他类型的 Redis 实例,sentinel 在将它们判断为下线前不需要进行协商, 所以slave服务器或者其他 sentinel 永远不会达到客观下线条件。

        当redis master被标记为客观下线时,每个sentinel向其他slave节点发送info命令的频率由之前的10秒钟一次变为1秒钟一次。并且会通过raft算法在sentinel中选出一个leader,由leader节点完成redis的故障转移工作。

2.2.1 主动下线

        概念:主观下线(Subjectively Down, 简称 SDOWN)指的是单个 Sentinel 实例对服务器做出的下线判断。

        如果一个 redis 服务器没有在 master-down-after-milliseconds 选项所指定的时间内,对向它发送 PING 命令的 Sentinel 返回一个有效回复, 那么Sentinel 就会将这个服务器标记为主观下线。

        单个Sentine判断Redis服务器主观下线之后,会通过提醒(流言传播(Gossip))告知其他的Sentinel服务器,其他的Sentinel就来围观这台Redis服务器,超过半数的Sentinel认为Redis主管下线后,则该Redis服务器的状态变为客观下线。

2.2.2 客观下线

        概念:多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断ODOWN。 (一个Sentinel 可以通过向另一个 Sentinel 发送命令来询问对方是否认为给定的服务器已下线)。

        客观下线条件只适用于主服务器,对于其他类型的 Redis 实例, Sentinel在将它们判断为下线前不不需要进行协商, 所以从服务器或者其他Sentinel 不会达到客观下线条件。 只要一个 Sentinel 发现某个主服务器进入了客观下线状态, 这个Sentinel就可能会被其他 Sentinel 推选出,并对失效的主服务器执行自动故障迁移操作。

2.3 Redis sentinel配置

        在redis安装目录下,除了有redis本身的一个配置文件外,还有一个sentinel.conf,该文件就是sentinel的配置文件。在该文件中,主要有以下几个配置:

  • port:sentinel的端口,默认为26379;
  • daemonize:是否后台启动,yes表示以后台方式启动运行sentinel,默认为no;
  • logfile:sentinel日志文件存放路径;
  • sentinel monitor :sentinel监控的master节点的名称、地址和端口号,最后一个quorums表示至少需要多少个sentinel判定master节点故障才进行故障转移。一般配置为sentinel数量/2+1。
  • sentinel down-after-milliseconds :sentinel向其他实例发送PING命令后到获得响应的超时时间,单位为毫秒;
  • sentinel failover-timeout :sentinel在对master进行故障转移时的超时时间,单位毫秒;
  • sentinel parallel-syncs :在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步,这个数字越小,完成故障转移所需的时间就越长;
  • sentinel auth-pass :如果master节点设置了密码,则需要在这里配置master节点的密码,否则sentinel无法连接master进行监控。

2.4 Master故障恢复

        哨兵认为master客观下线后,故障恢复的操作需要由选举的领头哨兵来执行,选举采用Raft算法:

  • 发现master下线的哨兵节点(我们称他为A)向每个哨兵发送命令,要求对方选自己为领头哨兵。
  • 如果目标哨兵节点没有选过其他人,则会同意选举A为领头哨兵。
  • 如果有超过一半的哨兵同意选举A为领头,则A当选。
  • 如果有多个哨兵节点同时参选领头,此时有可能存在一轮投票无竞选者胜出,此时每个参选的节点等待一个随机时间后再次发起参选请求,进行下一轮投票竞选,直至选举出领头哨兵。

  选出领头哨兵后,领头者开始对系统进行故障恢复,从出现故障的master的从数据库中挑选一个来当选新的master,选择规则如下:

  • 所有在线的slave中选择优先级最高的,优先级可以通过slave-priority配置。
  • 如果有多个最高优先级的slave,则选取复制偏移量最大(即复制越完整)的当选。
  • 如果以上条件都一样,选取id最小的slave。
  • 挑选出需要继任的slave后,领头哨兵向该数据库发送命令使其升格为master,然后再向其他slave发送命令接受新的master,最后更新数据。将已经停止的旧的master更新为新的master的从数据库,使其恢复服务后以slave的身份继续运行。

3 Sentinel部署使用

3.1 哨兵部署

3.1.1 sentinel.conf文件配置

  哨兵模式基于前面的主从复制模式。哨兵的配置文件为Redis安装目录下的sentinel.conf文件,在文件中配置如下配置文件:

port 26379      # 哨兵端口

# mymaster定义一个master数据库的名称,后面是master的ip, port,1表示至少需要一个Sentinel进程同意才能将master判断为失效,如果不满足这个条件,则自动故障转移(failover)不会执行
sentinel monitor mymaster 127.0.0.1 6379 1 
sentinel auth-pass mymaster 123456      # master的密码

sentinel down-after-milliseconds mymaster 5000      #5s未回复PING,则认为master主观下线,默认为30s
# 指定在执行故障转移时,最多可以有多少个slave实例在同步新的master实例,在slave实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长
sentinel parallel-syncs mymaster 2  
# 如果在该时间(ms)内未能完成故障转移操作,则认为故障转移失败,生产环境需要根据数据量设置该值
sentinel failover-timeout mymaster 300000 

daemonize yes   #用来指定redis是否要用守护线程的方式启动,默认为no
#保护模式如果开启只接受回环地址的ipv4和ipv6地址链接,拒绝外部链接,而且正常应该配置多个哨兵,避免一个哨兵出现独裁情况
#如果配置多个哨兵那如果开启也会拒绝其他sentinel的连接。导致哨兵配置无法生效
protected-mode no   
logfile "/data/redis/logs/sentinel.log"      #指明日志文件

  其中daemonize的值yes和no的区别为:

  • yes: redis采用的是单进程多线程的模式。当redis.conf中选项daemonize设置成yes时,代表开启守护进程模式。在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项pidfile设置的文件中,此时redis将一直运行,除非手动kill该进程。
  • no: 当daemonize选项设置成no时,当前界面将进入redis的命令行界面,exit强制退出或者关闭连接工具(putty,xshell等)都会导致redis进程退出。

3.1.2 启动哨兵

 然后就是启动哨兵,启动方式有两种,先进入Redis安装根目录下的bin目录,然后执行:

/server-sentinel ../sentinel.conf &
# 或者
redis-server sentinel.conf --sentinel

  执行后可以看到有哨兵进程已启动,如下:

192:bin houjing$ ps -ef |grep redis
  501 41115     1   0 11:37下午 ??         0:12.00 ./redis-server 127.0.0.1:6379 
  501 41121     1   0 11:38下午 ??         0:11.88 ./redis-server 127.0.0.1:6380    
  501 41621     1   0  3:53上午 ??         0:00.04 ./redis-server *:26379 [sentinel]

  可以多个哨兵监控一个master数据库,只需按上述配置添加多套sentinel.conf配置文件,比如分别为sentinel1.conf、sentinel2.conf、sentinel3.conf,分别以26379,36379,46379端口启动三个sentinel,此时就成功配置多个哨兵,成功部署了一套3个哨兵、一个master、2个slave的Redis集群。

3.1.3 master节点宕机测试

  我们通过手动杀掉master节点进行测试,然后看slave节点是否会自动晋升为master节点:

192:bin houjing$ kill -9 41115
192:bin houjing$ ps -ef |grep redis
  501 41121     1   0 11:38下午 ??         0:12.33 ./redis-server 127.0.0.1:6380    
  501 41621     1   0  3:53上午 ??         0:00.68 ./redis-server *:26379 [sentinel]  

127.0.0.1:6379> info replication
Could not connect to Redis at 127.0.0.1:6379: Connection refused

127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:14604
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:85362a9182cf9a48d1f93b0633e1963b583c30f7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14604
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14604
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_replid:36bf84c3cb3f2b7969040fdcce9a962025be3605
master_replid2:85362a9182cf9a48d1f93b0633e1963b583c30f7
master_repl_offset:16916
second_repl_offset:15963
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:16916

  可以看到验证成功,然后我们重启原先宕机的master节点,可以看到原先的节点成功启动,并由master变成了slave节点,如下所示:

-cli -p 6380
192:bin houjing$ ./redis-server ../redis.conf &
[1] 41640
192:bin houjing$ 41640:C 07 Apr 2020 03:59:05.475 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
41640:C 07 Apr 2020 03:59:05.475 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=41640, just started
41640:C 07 Apr 2020 03:59:05.475 # Configuration loaded

[1]+  Done                    ./redis-server ../redis.conf
192:bin houjing$ ps -ef |grep redis
  501 41121     1   0 11:38下午 ??         0:12.82 ./redis-server 127.0.0.1:6380    
  501 41621     1   0  3:53上午 ??         0:01.49 ./redis-server *:26379 [sentinel]  
  501 41641     1   0  3:59上午 ??         0:00.02 ./redis-server 127.0.0.1:6379 

127.0.0.1:6379> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:29056
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:36bf84c3cb3f2b7969040fdcce9a962025be3605
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:29056
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:28488
repl_backlog_histlen:569

  以上就完成了对哨兵部署方式的测试。

 

 参考链接

运维:终于不用再背着数万实例的Redis集群了!_Cluster

Redis学习之4种模式实践及机制解析(单机、主从、哨兵、集群)

redis架构_剑八-的博客-CSDN博客

Redis高可用方案—主从(masterslave)架构

Redis高可用架构—哨兵(sentinel)机制详细介绍

Redis高可用架构—Redis集群(Redis Cluster)详细介绍

Redis学习之Redis集群模式缺陷及其处理

  • Redis学习之4种模式实践及机制解析(单机、主从、哨兵、集群)
  • Redis学习之API学习及Jedis源码原理分析
  • Redis学习之Jedis源码原理分析探究(BIO手写Jedis客户端)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/533082.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenAI是什么?

OpenAI是一家人工智能技术公司,成立于2015年,总部位于美国旧金山。它的创始人包括埃隆马斯克等多名知名人士,公司的目标是推进人工智能技术的发展,同时确保人工智能的发展不会对人类造成负面影响。 OpenAI在研究和开发各种人工智能…

Python爬虫进阶(1),Django+Selenium+Mysql+SimpleUI从零搭建自己的爬虫后台,实现可视化监控爬虫内容信息

如果爬虫做完的话都会发现每个文件要么保存到csv或者是其他格式的文件中,这样做多少会有些麻烦,所以需要将这些内容保存起来方便自己管理和查看内容。 相对于flask而言Django有着相对成熟的一个后台管理系统配合上其他一些插件就可以做到即插即用的效果…

MongoDB 查询文档中使用正则选择器($regex)

之前我们介绍过使用文本选择器($text)查询文档,如果您需要进一步了解,可以参考: MongoDB 查询文档中使用文本选择器($text)https://blog.csdn.net/m1729339749/article/details/130605491 本篇…

【计算机组成原理】第六章 总线系统

系列文章目录 第一章 计算系统概论 第二章 运算方法和运算器 第三章 多层次的存储器 第四章 指令系统 第五章 中央处理器 第六章 总线系统 第七章 外围设备 第八章 输入输出系统 文章目录 系列文章目录第六章 总线系统6.1 总线的概念和结构形态6.1.1 总线的基本概念6.1.2 总线…

1335. 工作计划的最低难度(DP,leetcode)-------------------c++实现

1335. 工作计划的最低难度&#xff08;DP,leetcode&#xff09;-------------------c实现 题目表述 你需要制定一份 d 天的工作计划表。工作之间存在依赖&#xff0c;要想执行第 i 项工作&#xff0c;你必须完成全部 j 项工作&#xff08; 0 < j < i&#xff09;。 你…

10-01 单元化架构基础

扩展性&#xff08;Scalability&#xff09; 高伸缩性 添加资源就可以应对处理能力需求的增长用户、流量、数据增长&#xff0c;性能指标不下降 度量增加系统处理能力的指标系统性能 延迟&#xff1a;系统处理单词请求所需的时间吞吐量&#xff1a;单位时间内系统处理次数 伸缩…

前端架构师-week6- ejs源码讲解

ejs 源码详解——彻底搞懂模版动态渲染原理 ejs 执行流程 源码实现思路非常有趣&#xff0c;实现难度实现流程不如前几章源码复杂。但是思路完全不同&#xff0c;用了一套新的思路来实现 ejs 模版渲染。重要的是通过这种思路开阔自己的眼界。ejs 的思路在 vue 中也有用到。 核…

分类预测 | Matlab实现CNN-GSSVM卷积神经网络结合网格搜索算法优化支持向量机多特征分类预测

分类预测 | Matlab实现CNN-GSSVM卷积神经网络结合网格搜索算法优化支持向量机多特征分类预测 目录 分类预测 | Matlab实现CNN-GSSVM卷积神经网络结合网格搜索算法优化支持向量机多特征分类预测预测效果基本介绍模型描述程序设计学习总结 预测效果 基本介绍 分类预测 | Matlab实…

如何在多个服务器上安装WordPress分布式部署

许多网络主机现在保证其服务的正常运行时间为 99.9%&#xff0c;但这仍然每年最多有 8.7 小时的停机时间。 许多公司不能够承担这种风险。例如。在超级碗比赛中失败的体育新闻网站可能会失去忠实的追随者。 我们通过设置维护高可用性 WordPress分布式部署配置来帮助 WordPres…

shell脚本之免交互

目录 一 . Here Document 免交互1.1 Here Document概述示例&#xff1a;支持变量替换 二. Expect基本命令: expect直接执行&#xff0c;需要使用 expect 命令去执行脚本嵌入执行模式&#xff0c;将 expect 过程融入 Shell 当中&#xff0c;方便执行和处理。 一 . Here Document…

camunda子流程(Subprocess)如何使用

在 Camunda 中&#xff0c;子流程&#xff08;Subprocess&#xff09;是一种可嵌入到主流程中的小型流程&#xff0c;可以用于处理复杂的业务逻辑&#xff0c;以提高流程的可读性和可维护性。使用子流程的好处包括&#xff1a; 1、分离复杂的业务逻辑&#xff1a;通过将复杂的…

一条查询语句在MySQL的处理过程

例如查询语句&#xff1a; select user_id、username from t_user where username "张三" and sex 1; 其在MySQL的执行流程如下&#xff1a; 客户端发起查询请求&#xff0c;与SQL 接口建立连接&#xff0c;SQL 接口确定用户是否有查询权限&#xff0c;没有权限…

TensorFlow详解4-RNN+LSTM(1)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、背景和知识点深度学习三大模型&#xff1a;RNN的优势&#xff1a; 二、RNN的局限性三、LSTMLSTM三重门机制&#xff1a;LSTM解决梯度消失的主要原理&#x…

Linux--进程信号(pending, block, Handler)集

信号在产生之后&#xff0c;到未被处理的这段时间内&#xff0c;是保存在进程的PCB结构体内的一张位图中的&#xff0c;位图的每个比特位的编号就代表着改信号是否产生&#xff0c;比特位为1表示该信号产生&#xff0c;0表示不存在。 本篇文章就来详细的解答信号在内核中具体的…

数字革命下的产品:百数十年变迁的启示与思考。

随着数字化时代的到来&#xff0c;软件开发成为各行各业不可或缺的一部分。然而&#xff0c;传统的软件开发方法需要长时间的开发周期&#xff0c;高昂的成本和大量的人力资源。因此&#xff0c;低代码开发平台应运而生。低代码开发平台通过简化开发人员的工作和加速软件开发流…

故障分析 | 一条本该记录到慢日志的 SQL 是如何被漏掉的

背景 生产环境中 select count(*) from table 语句执行很慢&#xff0c;已经远超 long_query_time 参数定义的慢查询时间值&#xff0c;但是却没有记录到慢日志中。在测试环境也很容易复现出该问题&#xff0c;慢查询日志确实没有记录 select count(*) 语句。 慢查询相关参数…

数据结构入门-排序

排序的概念及其英语 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的顺序排列起来的操作。稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&a…

【网络】计算机中的网络

目录 &#x1f341;计算机网络 &#x1f341;计算机网络模型 &#x1f341;布线工程 &#x1f341;布线系统 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;专栏地址&#xff1a;网络专栏 计算机网络 计算机网络的功能 数据通信、资源共享、增加可靠性、提…

Dubbo——SpringBoot集成Dubbo(@Autowired和@Reference的区别、Dubbo的服务治理)

Dubbo——原生API实现远程调用_Strine的博客-CSDN博客 在上一篇文章中我们讲了如何使用原生API发起远程调用&#xff0c;显然这种方式肯定是非常麻烦的&#xff0c;因此我们这里就讲如何使用SpringBoot去集成Dubbo将这些配置简化。 生产者服务 添加配置文件 dubbo:applicat…

如何安装Maven并在IDEA配置

下载 1.进入官网完成下载&#xff0c;下载好后解压到你喜欢的目录中去即可&#xff01; Maven – Download Apache Maven 2.解压出来就能看到以下目录结构&#xff0c;我们关注conf目录即可 3.配置Maven的本地仓库&#xff0c;进入conf目录并打开settings.xml&#xff0c;往下…