redis详细教程(7.哨兵)

哨兵机制是Redis数据库提供的一种高可用性解决方案。它由一个或多个特殊的Redis服务器(称为哨兵)组成,这些服务器不执行数据存储功能,而是专注于监控和管理其他Redis服务器(主节点和从节点)。

为什么需要哨兵机制?

  1. 防止数据服务中断

如果Redis的主数据库(主节点)出现问题,比如服务器死机或者网络连接断开,那么客户端就无法从该数据库读取或写入数据了,而哨兵会监控主节点,一旦发现主节点无法访问,它会自动将一个从数据库(从节点)升级为新的主数据库,这样客户端就可以继续读写数据,不会因为主节点的故障而中断服务。

  1. 自动化处理

如果没有哨兵,当主节点出问题时,就需要人工去检查问题,然后手动将一个从节点升级为主节点,这个过程可能很慢,而且容易出错,哨兵可以自动完成这个过程,不需要人工干预,这样可以快速恢复服务,并且减少错误的发生。

  1. 避免单点故障

如果只有一个主节点,那么这个主节点就是一个单点故障点,一旦它出问题,整个服务就会受到影响,而哨兵可以监控多个节点,包括主节点和从节点,即使一个节点出问题,哨兵也可以通过其他节点来恢复服务,这样就不会因为单个节点的故障而导致整个服务瘫痪。

下线判断:

哨兵机制通过主观下线和客观下线,确保了在主节点真正出现问题时能够及时进行故障转移,同时减少了因网络波动或哨兵自身问题导致的误判。这种设计提高了Redis集群的稳定性和可用性,确保了即使在主节点发生故障的情况下,也能快速恢复服务,减少对业务的影响。

主观下线:哨兵实例通过 PING 命令检测到主节点或从节点在规定时间内没有响应时,该哨兵会将其标记为主观下线,但由于网络波动、服务器压力等原因,单个哨兵可能会错误地将一个实际上仍然在线的节点判断为下线,对于从节点,哨兵可以直接将其标记为主观下线,因为从节点的下线通常不会影响整个集群的服务。但对于主节点,则需要更加谨慎。

客观下线:通过引入多个哨兵实例组成哨兵集群,可以减少单个哨兵因网络问题或自身状况不佳导致的误判。多个哨兵共同决策,提高了判断的准确性。它们采用"少数服从多数"的原则,即当有 N 个哨兵实例时,至少需要 N/2 + 1 个实例判断主节点为主观下线,才能将主节点标记为客观下线,一旦主节点被标记为客观下线,哨兵集群将启动故障转移流程,选择新的主节点,并重新配置从节点。

选新主库:

当主节点被标记为"客观下线"后,哨兵集群将开始故障转移过程,哨兵集群中的所有哨兵实例将进行选举,选择一个领头哨兵来执行故障转移操作。首先判断从库的网络状态,如果其网络总是断连,那么其不能成为主库,然后依次按照从库优先级,从库复制进度与从库id号的顺序对剩余从库进行筛选,最优的为新主库。

领头哨兵:

当主节点被多个哨兵节点检测为主观下线后,哨兵节点会向其他哨兵节点询问该主节点的状态,如果足够多的哨兵节点认为主节点客观下线,则触发领头哨兵选举。

每个哨兵节点都可以在检测到主节点客观下线后发起选举。哨兵节点A发起选举时,会做以下事情:

  1. 增加自己的纪元(epoch)值。
  2. 将自己的状态设置为LEADING,表示正在尝试成为领头哨兵。
  3. 向其他哨兵节点发送SENTINEL is-master-down-by-addr命令,请求它们投票。

其他哨兵节点收到投票请求后,会根据以下规则进行投票:

  1. 在每个纪元内,每个哨兵节点只能投一次票。
  2. 如果哨兵节点没有给其他哨兵节点投过票,并且请求中的纪元值大于或等于自己的纪元值,那么它会投赞成票。
  3. 哨兵节点将投票结果发送回发起选举的哨兵节点A。

哨兵节点A收集投票,如果它获得了大多数哨兵节点的支持,则成为领头哨兵,如果没有哨兵节点获得足够的票数,则在一段时间后,哨兵节点可以尝试重新发起选举。而一旦哨兵节点A成为领头哨兵,它会向其他哨兵节点发送通知,告知它们领头哨兵的身份,避免其他哨兵节点再次发起选举。

领头哨兵负责选择新的主节点并执行主从切换,在故障转移期间,如果领头哨兵失败,其他哨兵节点将重新开始选举过程。

相关推荐
毛驴赶鹿6 小时前
【金仓数据库征文】KES V9性能调优实战记录:从慢SQL排查到全链路优化
数据库·sql
码农阿豪7 小时前
【金仓数据库征文】Mac开发环境|SpringBoot3 + MyBatisPlus对接KES V9 Docker实战全指南
数据库·macos·docker
杨云龙UP7 小时前
MySQL 数据库常用备份工具对比:mysqldump、mydumper 与 XtraBackup
linux·运维·服务器·数据库·mysql·dba·备份恢复
ZENERGY-众壹7 小时前
500个工商业电站压垮数据库?海量光伏时序数据存储的架构取舍
数据库·架构·influxdb·光伏·光伏运维
mubei-1238 小时前
SpringDAO的用法
java·开发语言·数据库
星蓝_starblue10 小时前
零服务器、零数据库!开源growth-board,利用GitHub自动管理刷题/学习/求职全流程
服务器·数据库·程序人生·系统架构·node.js·github·改行学it
三84412 小时前
sqli-labs1-10通关笔记
数据库
BullSmall14 小时前
Another Redis Desktop Manager(ARDM)下载指南
数据库·redis·缓存
SelectDB14 小时前
Apache Doris 倒排索引工作原理:全文检索提速 59 倍,点查提速 14 倍
数据库
码农颜14 小时前
5.1.1 原⼦性
数据库·mysql