1、为什么要做Redis主从架构?
Redis在单机模式下,如果服务器宕机,将会导致难以挽回的损失。为了提升可靠性,一般都会至少做主从,当master节点宕机会后,将从库切换过来,减少对业务的影响。
2、主从架构的问题有哪些?
- 一旦主节点失效,需要人工运维;
- 系统受到主节点存储容量、处理能力的限制;不满足大数据量、高并发的场景;
- 主从延迟带来的数据一致性问题;
其中,问题一是Redis的高可用问题,使用Sentinel来解决,问题二可以使用Redis集群化方案去解决,问题三是由于主从架构只能满足CAP理论中的AP所决定的,不能避免,基于保持最终一致性的前提下,结合业务场景(忽略、强制读主、选择性读主)去规避数据不一致带来的问题;
在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制另一个服务器,我们称呼被复制的服务器为主服务器,而对主服务器进行的服务器则被称为从服务器。
1. 旧版复制功能的实现
Redis的复制功能分为同步(sync)和命令传播(command propagate)两个操作:
同步操作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态;
命令传播操作则用于在主服务器的数据库状态被修改,导致主服务器的数据库状态出现不一致时,让主从服务器的数据库重新回到一致状态。
- 处于一致状态的主从服务器
- 处于不一致状态的主从服务器
- 主服务器向从服务器发送命令
旧版复制功能的缺陷:在Redis2.8以前,从服务器对主服务器的复制可以分为以下两种情况,
- 初次复制:从服务器以前没有复制过任何主服务器,或者从服务器当前要复制的主服务器和之前复制的主服务器和上一次复制的主服务器不同;
- 断线重连:处于命令传播阶段的主从服务器因为网络原因而中断了复制,但从服务器通过自动重连上了主服务器,并继续复制主服务器;(效率低下)
SYNC命令是一个非常耗费性能的操作
2. 新版复制功能的实现
为了解决旧版复制功能在处理断线重复制情况时的低效问题,Redis2.8版本开始,使用PSYNC命令替代SYNC命令
来执行复制时的同步操作。
PSYNC命令具有完整重同步
和部分重同步
两种模式:
- 其中完整重同步用于处理初次复制情况:完整重同步的执行步骤和SYNC命令的执行步骤基本是一样,它们都是通过让主服务器创建并发送RDB文件,以及向从服务器发送保存在缓存区里面的写命令来进行同步。
- 而部分重同步则用于处理断线后重复值情况:当从服务器在断线后重新连接主服务器时,如果条件允许,主服务器可以将主服务器连接断开期间执行的写命令发送给从服务器,从服务器只要接受并执行这些写命令,就可以将数据库更新至主服务器当前所处的状态;
PSYNC
命令的部分重同步模式解决了旧版复制功能在处理断线后重复复制时出现的低效情况。
具体来说:执行SYNC
所需要生成、传送、载入整个的RDB文件,但是部分重同步只需要将从服务器缺少的写命令发送到从服务器去执行就可以了。
3. 部分重同步的实现
部分重同步由以下三个命令组成:
主服务器的复制偏移量和从服务器的复制偏移量
主服务器的复制积压缓冲区
主服务器维护的一个固定长度的、先进先出的队列,默认大小为1MB;
服务器的运行ID
服务器启动时自动生成,由40个随机的十六进制字符组成;