Redis 哨兵模式
前景
如果redis主从架构中出现宕机怎么办?
- 从Redis 宕机
a)这个相对而言比较简单,在Redis中从库重新启动后会自动加入到主从架构中,自动完成同步数据;
b)如果从库在断开期间,主库的变化不大,从库有做持久化的前提下,再次启动后,会实现增量复制。
- 主Redis 宕机
i.第一步,在从数据库中执行SLAVEOF NO ONE命令,断开主从关系并且提升为主库继续服务;
ii.第二步,将主库重新启动后,执行SLAVEOF命令,将其设置为其他库的从库,这时数据就能更新回来;
但是这需要手动操作,麻烦不说,还容易出错,那有什么好的办法呢?
哨兵原理
Redis提供了sentinel(哨兵)机制,通过sentinel模式启动redis后,自动监控master/slave的运行状态,基本原理是:心跳机制+投票裁决
每个sentinel会向其它sentinal、master、slave定时发送消息,以确认对方是否“活”着,如果发现对方在指定时间(可配置)内未回应,则暂时认为对方已挂(所谓的“主观认为宕机” Subjective Down,简称SDOWN)。
若"哨兵群"中的多数sentinel,都报告某一master没响应,系统才认为该master"彻底死亡"(即:客观上的真正down机,Objective Down,简称ODOWN),通过一定的vote算法,从剩下的slave节点中,选一台提升为master,然后自动修改相关配置。
哨兵模式配置
先在redis根目录下创建conf子目录,新建配置文件sentinel.conf,或者拷贝解压的redis源文件的根目录下有sentinel.conf,内容如下
port 26379
dir /tmp
sentinel monitor master 192.168.1.103 6379 1
sentinel down-after-milliseconds master 30000
sentinel parallel-syncs master 1
sentinel failover-timeout master 180000
logfile "/var/log/sentinel_log.log"
配置说明:
1、prot 当前Sentinel服务运行的端口
2、dir Sentinel 服务运行时使用的临时文件夹
3、sentinel monitor master 192.168.110.101 6379 2
Sentinel去监视一个名为master的主redis实例,这个主实例的IP地址为本机地址192.168.1.103,端口号为6379,
而将这个主实例判断为失效至少需要1个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行
4、sentinel down-after-milliseconds master 30000
指定了Sentinel认为Redis实例已经失效所需的毫秒数。当实例超过该时间没有返回PING,或者直接返回错误,
那么Sentinel将这个实例标记为主观下线。只有一个 Sentinel进程将实例标记为主观下线并不一定会引起实例的自动故障迁移:只有在足够数量的Sentinel都将一个实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行
5、sentinel parallel-syncs master 1
指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长
6、sentinel failover-timeout master 180000
如果在该时间(ms)内未能完成failover操作,则认为该failover失败
操作步骤
- 配置主从复制
- 修改各个redis服务器中的 Sentinel的配置文件
- 启动redis服务,
- 启动Sentinel
- 启动顺序: 主Redis -> 从Redis -> Sentinel