总线 控制器 缓存 主频 指令集 寄存器
主页 正文

Redis哨兵模式深度解析:架构解析与故障应对策略

Redis 哨兵模式详解:设计架构、读写分离、选举与脑裂解析

Redis Sentinel模式是高可用解决方案的关键组成部分。
基于主从复制,引入自动故障转移和系统监控,保证数据可靠性和性能。
本文将深入分析哨兵模式的设计架构,包括其主要组成部分:哨兵节点,以及如何实现读写分离、选举机制以及处理裂脑问题。
通过主从复制实现读写分离即使主节点出现故障,从节点也可以继续提供读服务,从而提高并发性和系统可用性。
当Sentinel发现主节点宕机时,会启动选择流程,通过一系列步骤确定新的主节点,以保证服务快速恢复。
Sentinel模式通过监控和预防措施来避免脑裂问题,即网络分区导致的多个主节点的出现,以保持数据的一致性。
了解并优化Redis哨兵模式有助于提高系统稳定性,降低数据不一致的风险。
在实际应用中,正确配置和使用这些机制可以显着提高系统可用性和性能。
同时,对于新手或希望提高专业技能的读者,我们推荐一系列有关测试开发、自动化测试、性能监控等的资源。
帮助您开始并深化学习。
推荐阅读: - 进阶教程:【霍格沃茨测试开发】软件测试快速入门,涵盖自动化测试实战 - 面试技巧:【霍格沃茨测试开发】软件测试工程师职业发展路径与面试技巧 - 技术分享:【霍格沃茨测试开发】自动化测试框架和实践教程 - 职业提升:[霍格沃茨测试开发] 霍格沃茨】如何在测试角色中不断发展和提高 借助这些资源,您可以进一步加深对Redis Sentinel模式以及软件测试行业所需的最新趋势和技能的了解。

脑裂以及Redis主从同步中的坑

所谓脑裂是指一个主/从集群中同时存在两个主节点,并且两个节点都可以接收写请求。
脑裂最直接的影响是客户端不知道将数据写入哪个主节点。
因此,不同的客户端将数据写入不同的主节点。
此外,在严重的情况下,裂脑可能会导致进一步的数据丢失。

主库由于某种原因无法处理请求,没有响应Sentinel的心跳,被Sentinel错误判定为客观离线。
结果,原来的主库被判定离线后,又恢复处理请求。
此时Sentinel还没有完成主从切换,写操作已经提交。
客户端将数据写回主库。
下图展示了脑裂是如何发生的。

Redis提供了两个配置项来限制主库的请求处理:min-slaves-to-write和min-slaves-max-lag。

将这两个配置项结合起来后,要求是至少有N个从库连接到主库,并且在主库上复制数据时的ACK消息延迟不应该超过T秒。
主库将不再接收客户端请求。

假设您将 min-slaves-to-write 设置为 1,将 min-slaves-max-lag 设置为 12 秒,将哨兵 down-after-milliseconds 设置为 10 秒。
原因如下: 主库失败。
卡住15秒后,Sentinel判断主库客观离线,发起主备切换。
同时原主库宕机15秒,因此12秒内所有从库都无法与原主库复制数据,原主库无法接收客户端请求。
这样,一旦主从切换完成,只有新的主库能够接收请求,不会出现脑裂,也不会丢失数据。

主从数据不匹配是指客户端从从库读取的值与主库中最新的值不匹配。
例如,假设主从数据库之前存储的用户年龄值为19。
然而master数据库收到了变更命令,将数据更新为20。
但是从库上的值仍然是19。
如果客户端随后从从库读取用户的年龄值,则会读取旧值。

主从数据不匹配的主要原因是主从数据库之间命令的复制是异步的。
从库执行数据同步命令出现延迟的主要原因有两个。

处理主从数据不匹配的解决方案:

开发监控程序,首先使用INFOreplication命令监控主从库的进度,并减去slave_repl_offset。
master_repl_offset 获取从库和主库之间复制进度的差异。
如果从库的进度差异大于预设阈值,可以停止客户端连接从库读取数据,这样可以减少读取不一致数据的情况。
但为了避免出现客户端与所有从库无法连接的情况,应将复制进度差异阈值设置得较高。
您可以定期运行此过程来监控主库和从库之间的差异。

Redis使用两种策略删除过期数据:延迟删除策略和定时删除策略。
移除策略请参见https://www.jianshu.com/p/183e310d182d。

如果您使用的Redis版本低于3.2,以下情况从库将不会处理读请求: 判断数据是否过期,但返回过期数据。
从 3.2 版本开始,Redis 进行了改进。
当读取的数据过期时,从库不会删除数据,而是返回一个空值,这样可以防止客户端读取过期的数据。
因此,如果应用主从集群,请务必使用Redis3.2及以上版本。

设置数据过期日期的命令有四个,可以分为两类:

如果主/从库完全同步,如果主库收到 EXPIRE。
当你运行一个命令时,主库会直接执行这个命令。
该命令在全量同步完成后发送到从库执行。
当从数据库运行时,它将数据的生命周期添加到当前时间。
因此,从库的数据过期时间晚于主库的数据过期时间。

假设当前时间为2021年5月5日晚上9点,主从库正在同步,主库收到命令。
: EXPIREtestkey60。
这意味着testkey在5日晚上9:01过期,主库直接执行了这个命令。

但是,完整的主从数据库同步需要2分钟才能完成。
当从库开始执行这条命令的时候,时间已经是9点02分了。
已经成为了。
EXPIRE 命令将 testkey 的过期时间设置为从当前时间 (9:03) 起 60 秒。
如果客户端在9:02:30从从库读取testkey,仍然能够读取到testkey的值。
然而,测试密钥实际上已经过期。

为避免这种情况,请在业务应用程序中使用 EXPIREAT/PEXPIREAT 命令将数据过期时间设置为特定时间点,并避免读取过期数据。

热门资讯
固态硬盘+机械硬盘双盘设置指南
汇编语言编译器64位
固态硬盘是否分区更佳?
1tb是多少g内存
笔记本内存不足,这些影响你了解吗?
探索拓扑思维形状与空间的本质奥秘
C语言运算符与表达式精讲:语法第二课学习指南
苹果手机缓存垃圾清理指南