一、旧版本主从复制
通过同步和命令传播来实现
同步操作用于将从服务器的数据库更新至主服务器当前所处的数据库状态
命令传播操作用于主服器的数据库状态被修改,导致主从服务器的数据库状态不一致时,让主服务器的数据库重新回到一致状态。
旧版本主从复制非常低效,断线后再次连接又会重新执行RDB文件,但是从服务器只是想要断开连接时的键值,没必要复制全部过来。生成RDB文件会耗费大量的带宽和流量。
二、新版本的改进
用psync代替原来的sync,psync有完整重同步和部分重同步
完整重同步:的执行步骤和SYNC命令的执行步骤基本一样,它们都是通过让主服务器创建并发送RDB文件,以及向从服务器发送保存在缓冲区里面的写命令来进行同步
部分重同步:用于处理断线后重复制情况
部分重同步的实现
1、主服务器的复制偏移量和从服务器的复制偏移量
2、主服务器的复制积压缓冲区
3、服务器的运行ID
三、哨兵
可以监视多个嘱咐其或者其下的从服务器,可以在被监视的主服务器下线,自动将下线主服务器属下的某个从服务器升级为新的主服务器,代替旧的主服务器。
本质:运行 在特殊模式下的Redis服务器,包着狼皮的羊
使用和普通redis服务器不同的命令
选举领头Sentinel
当一个主服务器被判定为客观下线时,监视这个下线主服务器的各个Sentinel会协商,选举出一个领头Sentinel,由领头Sentinel对下线主服务器执行故障转移操作。
每个Sentinel都有机会参加竞选
竞选方式:
并且先来先到,且每个Sentinel只能选一次,超过半数后备确认为新老大,否则重选。
Sentinel与Sentinel只会产生命令连接,而Sentinel与主服务器和从服务器会产生命令连接和订阅连接
Sentinel会为每个监视的主服务器直接创建相应的实例结构,其他结构的(从服务器或者其他Sentinel)创建都是间接创建要通过相关的手段。
Sentinel通过主服务器发送INFO命令来获得主服务器属下所有从服务器的地址信息,并未这些从服务器创建相应的实例结构,Sentinel以每十秒一次的频率向被监视的主服务器和从服务器发送Info命令,当主服务器处于下线状态,或者Sentinel正在对主服务器进行故障扫描室,频率会改为一秒一次。