三分钟带你入门:Redis高可用架构之哨兵模式
mhr18 2024-10-26 10:53 26 浏览 0 评论
什么是哨兵?
哨兵(Sentinel)是 redis 的高可用性解决方案,前面我们讲的主从复制它是高可用的基础,但是单纯的主从复制需要人工介入才能完成故障转移,哨兵可以解决这个问题,在主从复制情况下,当主节点发生故障时,哨兵可以自动的发现故障并且完成故障转移,实现真正的 redis 高可用。在哨兵集群中,哨兵会监视所有的 redis 服务器和其他 sentinel 节点状态,及时发现故障完成转移,从而保证 redis 的高可用。
哨兵群集的搭建
哨兵本质也是一个 redis 服务,只是跟普通的 redis 服务提供了不一样的功能。哨兵是一个分布式架构,因为你要保证 redis 高可用,首先需要保证自己高可用,所以如果我们需要搭建哨兵的话,最少需要部署三个实例,最好是奇数个,因为在后续的故障转移中会涉及到投票。
哨兵的配置文件我们可以在 redis 的 GitHub 项目下下载,在项目下有一个叫做 sentinel.conf 的文件,可以使用它作为我们哨兵的配置模板,当然你也可以使用 redis.conf 配置文件,只需要添加哨兵相关配置就好了。
哨兵相关的配置项不多,主要有以下几个配置项:
// 端口号,默认是 redis 实例+20000,所以我们沿用这个规则就好了 port 26379 // 是否守护进程运行 daemonize yes // 日志存放的位置,这个非常重要,通过日志可以查看故障转移的过程 logfile "26379.log" // 监视一个名为 mymaster(自定义) 的 redis 主服务器, 这个主服务器的 IP 地址为 127.0.0.1 , 端口号为 6379 , // 最后面的 2 代表着至少有两个哨兵认为主服务器出现故障才会进行故障转移,否则认定主服务未失效 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
对于每个 Sentinel 实例配置除了 port 和 logfile 不同之外,其他配置项都是一样的。修改好配置后,我们可以使用 ./redis-sentinel sentinel.conf 命令来启动哨兵,命令跟 redis 实例启动差不多,因为哨兵也是 redis 实例,所以我们可以使用 ./redis-cli -p 26379 info sentinel 命令查看当前的哨兵信息,如下图所示:
问题:如何在只配置 master 服务器的情况下,发现从服务器和其他 Sentinel ?
从服务器的发现,Sentinel 可以通过询问主服务器来获取从服务器的信息,对于发现其他 Sentinel 节点,则通过发布与订阅功能实现,通过向频道 sentinel:hello 发送信息来实现的,主要有以下两步:
1、每个 Sentinel 每 2 秒会通过发布与订阅功能向所有的主服务和从服务器的 sentinel:hello 频道发送一条信息, 信息中包含了 Sentinel 的 IP 地址、端口号和运行 ID (runid)
2、每个 Sentinel 都订阅了被它监视的所有主服务器和从服务器的 sentinel:hello 频道, 查找之前未出现过的 sentinel (looking for unknown sentinels)。当一个 Sentinel 发现一个新的 Sentinel 时, 它会将新的 Sentinel 添加到一个列表中, 这个列表保存了 Sentinel 已知的, 监视同一个主服务器的所有其他 Sentinel
哨兵故障转移原理
故障转移是哨兵的主要工作,这背后的实现逻辑也是非常的复杂,具体的实现逻辑还请查看相关书籍,我对哨兵的故障转移总结了以下三点:
1、监听服务器
每个 Sentinel 节点每隔 1 秒对主节点、从节点、其他 Sentinel 节点发送 ping 命令做心跳检测,来判断服务器的状态。
节点也会对 Sentinel 进行相应的回复,在这些回复中,以下三种回复是有效回复:
- 返回 +PONG
- 返回 -LOADING
- 返回 -MASTERDOWN
如果节点在哨兵配置文件设置的 master-down-after-milliseconds 选项的值内,一直没有哪怕一次有效回复,那么 Sentinel 会把该服务器标记为下线状态,我们把这种下线称为主观下线,也就是说只有这个 sentinel 认为该服务器是下线状态。
如果被主观下线的服务器是主服务器时,sentinel 为了确认这个主服务器是否真的下线,该 Sentinel 会向其他的同样监听主服务器的 Sentinel 进行询问,看他们是否也认为主服务器进入下线状态,当有足够多的 Sentinel 都认为主服务器下线时,该 Sentinel 会将主服务器判断为客观下线,这是真正的下线了,并且会对它进行故障转移操作。
2、选举 Sentinel 节点完成转移任务
故障转移并不是所有的 sentinel 共同完成,而是选举出一台 sentinel 节点作为领导者来完成这次故障转移,所以当主服务器被标记为客观下线时,sentinel 之间就会通过 Raft 算法选举出一个领导者来完成故障转移工作。redis 选举领头的 sentinel 的规则和方法大致如下:
- 所有在线的 sentinel 都有资格被选为领导者,也就是说每个 sentinel 都有成为领导者的机会
- 当 sentinel 标记主服务器为主观下线时,会向其他 Sentinel 节点发送 sentinel is-master-down-by-addr 命令, 要求将自己设置为领导者
- 收到命令的 Sentinel 节点,采用先到先得的规则,如果没有同意过其他 Sentinel 节点的 sentinel is-master-down-by-addr 命令,将同意该请求,否则拒绝
- 如果该 Sentinel 节点发现自己的票数已经超过半数,那么它将成为领导者
- 如果在规定时间内,没有选举出 sentinel 领导者,那么将在一段时间后再次选举,知道选出 sentinel 领导者为止。
3、选举新 master 服务器完成故障转移
选举出来的 sentinel 领导者将完成剩下的故障转移工作,故障转移主要有以下三步:
1、挑选出新的主服务器
在已下线的主服务器的所有从服务器中,挑选出一个从服务器,并将其转换为主服务器,选择新的主服务器的规则如下:
- 在失效主服务器属下的从服务器当中, 那些被标记为主观下线、已断线、或者最后一次回复 PING 命令的时间大于五秒钟的从服务器都会被淘汰
- 在失效主服务器属下的从服务器当中, 那些与失效主服务器连接断开的时长超过 down-after 选项指定的时长十倍的从服务器都会被淘汰
- 在经历了以上两轮淘汰之后剩下来的从服务器中, 选出复制偏移量(replication offset)最大的那个从服务器作为新的主服务器;如果复制偏移量不可用, 或者从服务器的复制偏移量相同, 那么带有最小运行 ID 的那个从服务器成为新的主服务器
对挑选出来的从服务器执行 slaveof no one 命令,使其成为主节点。
2、修改其他从服务器的复制目标
当新的主服务器出现后,sentinel 的领导者下一步需要做的就是,让其他从服务器去复制新的主服务器,通过向其他从服务器发送 slaveof new_master port 命令来完成,复制规则和配置文件的 parallel-syncs 参数有关
3、将旧的主服务器变成从服务器故障转移操作最后要做的就是将已下线的主服务器设置为新的主服务的从服务器,并保持对其关注,等它恢复后命令它去复制新的主节点。
以上就是我今天要分享的 redis 哨兵知识,希望看完之后你有所收获。
相关推荐
- 如何检查 Linux 服务器是物理服务器还是虚拟服务器?
-
在企业级运维、故障排查和性能调优过程中,准确了解服务器的运行环境至关重要。无论是物理机还是虚拟机,都存在各自的优势与限制。在很多场景下,尤其是当你继承一台服务器而不清楚底层硬件细节时,如何快速辨识它是...
- 第四节 Windows 系统 Docker 安装全指南
-
一、Docker在Windows上的运行原理(一)架构限制说明Docker本质上依赖Linux内核特性(如Namespaces、Cgroups等),因此在Windows系统上无法直...
- C++ std:shared_ptr自定义allocator引入内存池
-
当C++项目里做了大量的动态内存分配与释放,可能会导致内存碎片,使系统性能降低。当动态内存分配的开销变得不容忽视时,一种解决办法是一次从操作系统分配一块大的静态内存作为内存池进行手动管理,堆对象内存分...
- Activiti 8.0.0 发布,业务流程管理与工作流系统
-
Activiti8.0.0现已发布。Activiti是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员。其核心是超快速、稳定的BPMN2流程引擎。Activiti可以...
- MyBatis动态SQL的5种高级玩法,90%的人只用过3种
-
MyBatis动态SQL在日常开发中频繁使用,但大多数开发者仅掌握基础标签。本文将介绍五种高阶技巧,助你解锁更灵活的SQL控制能力。一、智能修剪(Trim标签)应用场景:动态处理字段更新,替代<...
- Springboot数据访问(整合Mybatis Plus)
-
Springboot整合MybatisPlus1、创建数据表2、引入maven依赖mybatis-plus-boot-starter主要引入这个依赖,其他相关的依赖在这里就不写了。3、项目结构目录h...
- 盘点金州勇士在奥克兰13年的13大球星 满满的全是...
-
见证了两个月前勇士与猛龙那个史诗般的系列赛后,甲骨文球馆正式成为了历史。那个大大的红色标志被一个字母一个字母地移除,在周四,一切都成为了过去式。然而这座,别名为“Roaracle”(译注:Roar怒吼...
- Mybatis入门看这一篇就够了(mybatis快速入门)
-
什么是MyBatisMyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为M...
- Springboot数据访问(整合druid数据源)
-
Springboot整合druid数据源基本概念SpringBoot默认的数据源是:2.0之前:org.apache.tomcat.jdbc.pool.DataSource2.0及之后:com.z...
- Linux 中的 "/etc/profile.d" 目录有什么作用 ?
-
什么是/etc/profile.d/目录?/etc/profile.d/目录是Linux系统不可或缺的一部分保留配置脚本。它与/etc/profile文件相关联,这是一个启动脚本,该脚...
- 企业数据库安全管理规范(企业数据库安全管理规范最新版)
-
1.目的为规范数据库系统安全使用活动,降低因使用不当而带来的安全风险,保障数据库系统及相关应用系统的安全,特制定本数据库安全管理规范。2.适用范围本规范中所定义的数据管理内容,特指存放在信息系统数据库...
- Oracle 伪列!这些隐藏用法你都知道吗?
-
在Oracle数据库中,有几位特殊的“成员”——伪列,它们虽然不是表中真实存在的物理列,但却能在数据查询、处理过程中发挥出意想不到的强大作用。今天给大家分享Oracle伪列的使用技巧,无论...
- Oracle 高效处理数据的隐藏神器:临时表妙用
-
各位数据库搬砖人,在Oracle的代码世界里闯荡,处理复杂业务时,是不是总被数据“搅得头大”?今天给大家安利一个超实用的隐藏神器——临时表!当你需要临时存储中间计算结果,又不想污染正式数据表...
- Oracle 数据库查询:多表查询(oracle多表关联查询)
-
一、多表查询基础1.JOIN操作-INNERJOIN:返回两个表中满足连接条件的匹配行,不保留未匹配数据。SELECTa.emp_id,b.dept_nameFROMempl...
- 一文掌握怎么利用Shell+Python实现多数据源的异地备份程序
-
简介:在信息化时代,数据安全和业务连续性已成为企业和个人用户关注的焦点。无论是网站数据、数据库、日志文件,还是用户上传的文档、图片等,数据一旦丢失,损失难以估量。尤其是当数据分布在多个不同的目录、服务...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 如何检查 Linux 服务器是物理服务器还是虚拟服务器?
- 第四节 Windows 系统 Docker 安装全指南
- C++ std:shared_ptr自定义allocator引入内存池
- Activiti 8.0.0 发布,业务流程管理与工作流系统
- MyBatis动态SQL的5种高级玩法,90%的人只用过3种
- Springboot数据访问(整合Mybatis Plus)
- 盘点金州勇士在奥克兰13年的13大球星 满满的全是...
- Mybatis入门看这一篇就够了(mybatis快速入门)
- Springboot数据访问(整合druid数据源)
- Linux 中的 "/etc/profile.d" 目录有什么作用 ?
- 标签列表
-
- oracle位图索引 (74)
- oracle基目录 (50)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (53)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)