学习前提
redis的主从复制
注意:因为主服务器,从服务器和哨兵服务器的名字太长了,而且不好理解,容易搞混,所以下面多次出现这些词语时我会替换成master,slave和sentinel
什么是薪火相传
上一个slave(从服务器)可以是下一个slave的master(主服务器),slave同样可以接受其他的salve的连接和同步请求,那么该slave作为了链条中的下一个master,可以有效减轻master的写压力,去中心化减低风险。但是也产生了另一个风险:一旦某个slave出现意外停止运行后,以这台slave为主的其他slave都无法保存数据
设置
和普通的主从复制一样都是slaveof <ip> <port>
,只不过master不再是只有一个
如果中间切换master
和普通的主从复制一样,都是清除之前的数据,重新建立并且拷贝最新数据
反客为主
- 哪怕这个slave变成了另外一个slave的master,但他的身份仍然是slave,也就是也就无法完成写操作。
- 如果在master没有关闭时这个slave要完成写操作,那可以执行
slaveof no noe
让其不再成为任何服务器的slave,从而成为其他slave的master,这也就是常说的反客为主。 - 当一个master关闭后,后面的slave可以立刻自动升级为master,而后面的salve无需修改,这个就是我们常说的哨兵模式。
哨兵模式(sentinel)
哨兵模式简单来说就是反客为主的主动版,能够后台监控master是否故障,如果发生故障则根据投票数自动将slave转换为master。
哨兵模式的配置
- 因为哨兵是基于主slave的,所以配置的服务器至少是一主二从三哨兵
- 自定义的
/myredis
目录下新建sentinel.conf
文件 - 在这个哨兵服务器的
sentinel.conf
配置文件中填写内容
sentinel monitor 给监视的服务器起个名字 主机ip 主机运行端口 多少个哨兵同意后才允许迁徙
运行哨兵模式
redus-sentinel 哨兵服务器的配置文件(例如:/myredies/sentinel.conf)
开启后会有这么几句话(如下图所示),例如第一句的意思就是6380端口的服务器是6379的slave(@
符号前面的服务器是后面服务器的 slave)
故障恢复窗口显示
如果master出现故障的话,那slave就会在哨兵服务器里面的聊天区里面发出信息,例如下图中,一台服务器说master出问题了,另一台服务器说确实出问题了
然后就会有一条提示说选择了一个新的服务器,例如下图就是说选择了本地的6380端口的redis为主服务器
恢复步骤
- 某台服务器挂掉后,会从其下线的所有从服务器里面挑选一个,将其转换为主服务器
选择的条件依次为:
1.选择靠前的:在redis.conf配置文件中会有一个salve-priority 数字(默认100)
,这个数字就是优先级大小,值越小的越优先考虑。
2.优先偏移量打的:会的原主服务器最多数据的。
3.选择runid最小的:每个redis实例启动后都会随机生成一个runid。 - 挑选出新的主服务器后,sentinel向原来的master的从服务器发送
slaveof
,让其都成为新master的从服务器 - 原本的主服务器恢复正常重启后,会变成新master的从服务器