本文首发于公众号:程序员周先森。本平台不定期更新,喜欢我的文章,请关注我的微信公众号。Redis主从复制其实就是将Redis主节点的数据复制到其他Redis从节点进行存储。当主节点异常宕机时,如何将从节点切换为主节点继续提供服务?Redis主从切换主要分为以下两种方式:手动切换和哨兵模式。今天,我们就来看看Redis是如何进行主从切换,在出现故障时继续提供服务的。题外话首先,在开始讲主从切换之前,先补充一个昨天遗漏的知识点:启动主节点和启动不同的从节点之间的间隔不能太短,因为主节点需要同步数据到不同的从节点。很多资源。主从手动切换当主节点宕机时,此时最简单的方法就是使用主从手动切换的方法,手动将一个从节点切换为主节点,所以我们需要手动干预和手动设置。最重要的是手动切换过程中,Redis服务会不可用。所以主从手动切换方案并不是一个合适的主从切换方案,不过我们也来看看主从手动切换是如何实现的。当主节点宕机时,我们需要手动设置从节点为主节点。命令:redis-cli-h<从节点ip>-p<从节点端口号>slaveofnoone通过以上命令,可以将从节点临时设置为主节点。Redis重启后,主从切换设置将失效。然后按照上一篇主从复制的配置,将其他从节点的master配置修改为当前的master节点。当原主节点宕机恢复后,保存临时主节点的数据,复制AOF文件和RDB文件,替换原主节点下的AOF文件和RDB文件。然后重启原主节点的Redis服务和临时主节点的Redis服务,恢复原来的主从关系。但是毕竟主从手动切换的方案存在问题,不太适用,所以一般的主从切换都会采用sentinel模式。哨兵模式在Redis中,哨兵是一个独立运行的独立进程。由一个或多个Sentinel实例组成,可以监控多个主节点和主节点下的从节点。当被监控的主节点发生故障宕机时,Sentinel实例可以自动将主节点下的其中一个从节点升级为新的主节点,新的主节点将继续处理写请求。其实Sentinel可以理解为一个运行在特殊模式下的Redis服务器。Sentinel服务器初始化后,Sentinel服务器会保存所有与Sentinel功能相关的状态记录。Sentinel其实有3个任务:Monitoring、Notification和Automaticfailover。监控:Sentinel实例会不断检测主从节点是否正常运行。提醒:当节点异常宕机时,Sentinel实例会向管理员或其他应用发送提醒。故障自动迁移:当主节点宕机时,Sentinel实例会将主节点下的其中一个从节点升级为新的主节点,原来的其他从节点重新发起socket请求成为新的从节点主节点。配置中心:将新主节点的地址返回给客户端,即可使用新主节点正常处理请求。通过上面的简单介绍可以发现,哨兵模式其实可以将主从的手动切换变为自动切换。哨兵会定时发送命令,让被监控的主从节点恢复到运行状态。machine,它会自动在master节点下选择一个slave节点,并切换到新的master节点。然后通知其他从节点切换到新的主节点的从节点,这样就可以顺利进行主从切换,处理新的请求。但是,如果我们只使用一个Sentinel,即只启用一个Sentinel实例进行监控,就很容易出现问题。一般会启用多个Sentinel实例进行监控。通常,至少需要3个Sentinel实例。节点的两种宕机状态Sentinel检测到主节点宕机,一般有两种状态:sdown(主观宕机)和odown(客观宕机)。如果只有一个sentinel认为master节点宕机了,就变成了主观宕机。如果一定数量的节点认为主节点宕机,就变成客观宕机。哨兵如何判断主观宕机和客观宕机?当sentinelpingmaster节点,经过is-master-down-after-milliseconds配置的timeout毫秒后没有返回任何信息时,sentinel认为master节点宕机。这时候就变成了主观宕机,也就是sdown。当sentinel在指定时间内收到指定数量的sentinel,也认为master节点宕机了,那么这就是客观宕机,即odown。当一定时间内有足够数量的哨兵同意主节点宕机时,主节点的客观宕机状态将被移除。当认为主观宕机的sentinel再次被ping并得到有效回复时,主节点的主观宕机也会被移除。为什么至少需要3个Sentinel实例?刚才说了,当指定时间段内指定数量的sentinel认为master节点宕机了,我们称之为客观宕机。指定数量是多少?这个指定的数量其实等于哨兵数量/2+1。也就是说如果哨兵数量等于2,一个哨兵宕机了,当需要主从切换的时候,考虑的哨兵数量被master节点down掉的是2.,所以master节点down掉时不能进行主从切换。因此,部署Sentinel至少需要3个Sentinel实例来保证健壮性。Sentinel模式导致数据丢失问题Sentinel模式+Redis主从复制部署结构不能保证数据不丢失。哨兵模式数据丢失主要有两种情况:由于主从复制是异步操作,主从复制可能不成功,主节点宕机。这时候没有复制成功的数据就会丢失。如果主节点无法与其他从节点连接,但实际上仍在运行。这时候Sentinel会将一个slave节点切换到一个新的master节点,但是在这个过程中,master节点实际上还在运行,所以继续写入master节点的数据就会丢失。解决数据丢失方案,使用命令:min-slaves-to-write1min-slaves-max-lag10使用这组命令设置至少一个slave节点数据复制延迟不能超过10S,也就是说,如果直接点击所有从节点如果节点数据复制延迟超过10S,则停止主节点,继续接收和处理新的请求。这样可以保证数据丢失最多只会丢失10S以内的数据。欢迎关注公众号:程序员周先森。本文由博客多发平台OpenWrite发布!
