Redis 主从复制
一、主从复制简介
- 主从复制目的:实现高可用
- 主从复制作用:
- 读写分离:提高服务器的读写负载能力
- 负载均衡:基于主从结构,配合读写分离,由slave分担master负载,提高Redis服务器并发量与数据吞吐量
- 故障恢复:当master出现问题时,由slave提供服务,实现快速的故障恢复
- 数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式
- 高可用基石:基于主从复制,构建哨兵模式和集群,实现Redis的高可用方案
二、主从复制的工作流程
- 建立连接阶段
- 数据同步阶段
- 命令传播阶段
1、建立连接阶段
- 主从连接配置:slave 配置文件 -> slaveof <masterip> <masterport>
- 主从断开连接:slave 客户端 -> slaveof no one
2、数据同步阶段
- 全量复制
- 增量复制
全量复制
- slave 连接 master,发送指令
psync2
- master 执行 bgsave
- master 创建复制缓冲区(存储 bgsave 阶段新增的)
- master 将生成的 RDB 文件通过 socket 发送给 slave
- slave 接收 RDB,清空数据,执行 RDB 文件恢复数据
增量复制
- slave 发送命令告知 master RDB 恢复完成
- master 发送复制缓冲区信息(AOF)
- slave 执行 bgrewriteaof 恢复数据
3、命令传播阶段
当 master 数据库被修改后,导致主从服务器数据库数据不一致,此时需要让主从数据同步到一致的状态,同步的动作称为命令传播。
命令传播阶段的增量复制
- 三个核心要素
- 服务器的运行 id (runid)
- 主服务器的复制积压缓冲区
- 主从服务器的复制偏移量
- 服务器的运行 id (runid)
- 每一台服务器每次运行的身份识别码
- 由40位字符组成,是一个随机的十六进制字符
- master 首次连接 slave 时,会将自己的运行ID发送给 slave
- 复制积压缓冲区
- 本质是一个FIFO的队列,用于存储服务器执行过的命令(AOF)
- 默认存储空间是1M,当入队元素数量大于队列长度时,队首元素会被弹出
- 每台服务器启动时,如果开启了AOF或被连接称为 master 节点,即创建复制积压缓冲区
- 主从复制器复制偏移量(offset)
- 描述复制积压缓冲区中的指令字节位置
- 比对 master 和 slave 的 offset 进行同步数据