Redis一般以一主多从的形式部署,以实现读写分离,减轻单个Redis实例的负载压力。今天我们来讨论下,在主数据库宕机停止服务的情况下,如何恢复主数据库,保持整个Redis系统的高可用性。
方式一:手工通过从数据库恢复主数据库
手工通过从数据库恢复主数据是一个相对繁琐且危险的过程,操作不当可能导致整个Redis系统数据丢失。因此,手工操作时需要严格按照以下两步进行:
- 从备选从数据库中选择一个作为新的主数据库,即使用 "SLAVEOF NO ONE命令",将其升格为主数据。若存在多个从数据库,则将其他从数据库作为新的主数据库的从数据库,即使用"SLAVEOF 新主数据IP 新主数据PORT "命令。
- 启动旧的主数据,使用"SLAVEOF 新主数据库IP 新主数据PORT"命令将其作为新主数据库的从数据库。
前文提到,手工恢复的过程伴随着一定的风险性,这里的风险指什么?
在一主多从的Redis系统中,为了提高性能,一般会关闭主数据库的持久化功能,而开启从数据库的持久化功能。若使用Supervisor以及类似的进程管理工具使得主数据库崩溃后直接自动重启或直接手动重启,由于主数据库没有开启持久化功能(无RDB和AOF文件),重启后主数据中没有数据,而复制功能使得主数据库的数据向从数据库同步,从而可能导致从数据库的数据也被清空,这是个十分危险的行为。另外,人为介入也给系统恢复带来一定的风险。
无论如何,手工恢复都是相对繁琐且不推荐的。好在Redis提供了一种自动化方案--哨兵来实现这一过程,避免了手工维护的麻烦和容易出错的问题。
方式二:自动化监控方案--哨兵
什么是哨兵?哨兵就是一个独立的进程,其作用就是监控Redis系统的运行状况,它包含以下两个功能:
- 监控主从数据库是否运行正常
- 当主数据异常时,自动将从数据库升格为主数据库
我们通过一个简单的案例来探究哨兵机制的原理:
7、手动重启原主数据库,继续查看输出信息
至此,我们模拟了哨兵的一次完整工作流程,在下一章节中我们将继续讨论哨兵机制的原理。
Ending ...