文章目录
多机数据库
主从架构(复制)
在redis中,用户可以在服务器上执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制另一个服务器,我们称呼被复制的服务器为主服务器,进行复制的服务器为从服务器。
slaveof ip port
redis的复制功能分为同步和命令传播
- 同步就是把主服务器的状态更新至从服务器
- 命令传播就是在主服务器状态被修改时,把修改的指令传播给从服务器
同步
- 从服务器向主服务器发送sync命令
- 主服务器执行bgsave命令,生成rdb文件,并且使用一个缓冲区记录从现在开始的所有写命令
- 完成bgsave后,将rdb文件发送给从服务器,从服务器接受并且载入
- 主服务器把缓冲区的命令发送给从服务器,从服务器执行这些命令,实现状态更新
命令传播
把让主服务器发生状态改变的命令发送给从服务器
断线重连的问题
如果发生断线然后再进行状态同步的话,完整的rdb太臃肿了
新版的复制功能(部分同步)
- 复制偏移量:主服务器每次向从服务器传播N个字节的数据时,就将自己的复制偏移量的值加上N;从服务器每次收到主服务器传播来的N个字节的数据时,就将自己的复制偏移量加上N
- 复制积压缓冲区主服务器维护一个固定长度先进先出队列,默认大小为1MB,因此主服务器会保存着一部分最近传播的写命令
因此部分同步的实现是:
- 如果从服务器复制偏移量之后的数据仍然保存于主服务器中,那么使用复制偏移量进行同步
- 如果从服务器复制偏移量之后的数据不保存于主服务器中,那么使用完整同步
心跳检查
在命令传播节点,从服务器默认会以每秒1次的频率,向主服务器发送命令
replconf ack <replication_offset>
其中replication_offset是从服务器当前的复制偏移量
发送replconf ack命令有三个作用
-
检测主从服务器的网络连接状态,主服务器由此检验主从服务器的连接是否存在问题
-
辅助实现min-slaves选项,主服务器可能存在以下配置
min-slaves-to-write 3 min-slaves-max-lag 10
如果从服务器的数量少于3个,或者三个从服务器的延迟值都大于等于10秒时,主服务器将拒绝执行写命令
-
检测命令丢失,主服务器可以通过发送来的偏移量检测是否有命令丢失,如果存在丢失,那么就从复制积压缓冲区找到从服务器缺少的数据,并且重新发送给从服务器
sentinel
sentinel是redis高可用性的解决方案:由一个或者多个sentinel实例组成的sentinel系统可以监视任意多个主服务器,以及这些服务器属下的所有从服务器,并在被监视的主服务器进入下线状态的时候,自动将主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。下线的主服务器重新上线后,变成新的主服务器的从服务器。
实际中至少会部署3个以上哨兵并且哨兵数量最好是奇数,哨兵是Redis的高可用机制,保证了Redis服务不出现单点故障。如果哨兵只部署一个,哨兵本身就成为了一个单点。当Redis的Master发生故障时,如果2个哨兵同时执行切换操作肯定不行,哨兵之间必须先约定好由谁来执行此次切换操作,此时就涉及了哨兵之间选leader的操作。假设2个哨兵各自投自己一票,根本选举不出leader。所以哨兵个数最好是奇数。
sentinel的启动
- 初始化服务器
- 将普通redis服务器使用的代码替换成sentinel专用的代码
- 初始化sentinel状态
- 根据给定的配置文件初始化sentinel的监视主服务器列表
- 创建连向主服务器的网络连接
获取主服务器信息
sentinel会以每十秒一次的频率,向被监视的主机发送INFO命令,并且通过分析INFO命令的回复来获取主服务器的当前信息。
- 主服务器本身的信息,包括服务器运行id和服务器角色
- 从服务器的ip和端口
获取从服务器信息
sentinel从主服务器获取了从服务器后,每十秒一次的频率,向被监视的从服务器发送INFO命令
向主服务器和从服务器发送信息
默认情况下sentinel会以每秒一次的频率,通过命令连接向所有被监视的主服务器和从服务器发送以下格式的命令:
PUBLISH __sentinel__:hello "<s_ip>,<s_port>,<s_runid>,<s_epoch>,<m_name>,<m_ip>,<m_port>,<m_epoch>"
主观下线状态
sentinel向各实例(主服务器,从服务器,其他sentinel)发送ping命令,在约定的时间内没有答复,则被判断为主观下线状态
客观下线状态
向同样监视这个实例的sentinel进行询问,如果也是下线状态,那么判断为客观下线状态,进行故障转移操作
选举领头sentinel
当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个sentinel会进行协商,选举出一个领头sentinel,由领头sentinel对下线的主服务器执行故障转移操作
故障转移
- 在所有从服务器里,挑选出一个从服务器,并将其转换成主服务器
- 让其余从服务器改为复制新的主服务器
- 让已下线的主服务器改成新主服务器的从服务器