Redis设计与实现3.1:主从复制
主从复制
这是《Redis设计与实现》系列的文章,系列导航:Redis设计与实现笔记
SLAVEOF
新旧复制功能
旧版复制功能
旧版复制功能的实现为 同步 和 命令传播:
当刚连上Master时,要做一次全同步:
participant Slave
participant Master
Slave->>Master: SYNC
Master->>Master: BGSAVE
Master->>Master: 记录此时的命令到缓冲区中
Master->>Slave: 发送RDB
Master->>Slave: 发送命令缓冲区中的命令
之所以要用到缓冲区是因为,在主节点进行 BGSAVE 的过程中如果有命令执行,那么我们要把这些命令也记录下来。
之后,主从节点之间只用 命令传播 就可以做到同步了,也就是说主节点执行什么命令,从节点跟着执行。(当然,一些随机、时间类的函数会直接转换成定值)
旧版复制的缺陷
如果从节点断线后重新连接,旧版复制功能的效率很低,因为为了让从服务器补足一小部分的确实却要进行一次 SYNC 命令。
为什么低效:
- 主节点 BGSAVE 要消耗大量的CPU、内存、IO资源
- 主节点发送需要消耗网络资源
- 从节点需要载入,且载入期间处于阻塞状态
新版复制功能
用 PSYNC 命令代替 SYNC。
PSYNC 具有 完整重同步 和 部分重同步 两种模式,分别针对初次同步和重新同步两种场景。
复制功能的实现
复制的实现
复制的一些具体的细节,当进行复制时:
从服务器设置主服务器的地址和端口
struct redisServer{
//...
char *masterhost;
int masterport;
//...
}
建立套接字连接,并关联一个专门处理复制工作的文件事件处理器
发送 PING 命令,检查套接字和主服务器的状态是否正常

身份验证,主从必须配置一致且密码正确(如果有)才能通过验证
发送端口信息:主节点也得知道给从节点的哪个端口发消息,不是么
同步:干正事儿喽
这里书上说:
- 在同步操作执行之前,只有从服务器是主服务器的客户端,但是在执行同步操作之后,主服务器也会成为从服务器的客户端。
- 正是因为主服务成为了从服务器的客户端,所以主服务器才能通过发送写命令来改变从服务器的数据库状态。
我想了想,似乎一般确实都是客户端改变服务端的数据的,所以这么说倒也在理,但是服务端不是也可以给客户端发送数据么?所以这里可能和 Redis 的具体实现有关?
命令传播:进入了第二个阶段
如何部分重同步
要关注的三个部分:
复制偏移量:主从服务器都有复制偏移量,通过这个值判断主从是否处于一致状态
主服务器的复制积压缓冲区:保存执行命令的历史记录
一个固定长度(默认1MB)的 FIFO 的队列,当主从不一致时可以计算并从中获取缺少的命令。
由于固定长度,所以如果缺的多了就只能进行完整重同步了。
大小一般设为 断连平均时间 * 每秒的命令数,安全起见再乘以2。
服务器的运行 ID
毕竟只有 ID 一致同步才有意义,否则说明换主人了,那还是全同步吧
PSYNC的逻辑
S(接收到SLAVEOF命令) --> A{第一次复制?}
A --Y--> A1[发送PSYNC ? -1] --> E1(返回+FULLRESYNC <runid> <offset>)
A --N--> A2[发送PSYNC <runid> <offset>] --> B{主服务器返回 +CONTINUE}
B --N--> E1
B --Y--> E2[执行部分重同步]
主要是判断 是否是第一次复制 、 是否是同一个主服务器,从而决定是部分重同步还是全同步。
上图没有展示的是,如果主服务器不支持 PSYNC,则返回 -ERR
心跳检测
心跳检测:在命令传播阶段,从服务器默认每秒发送一次心跳:REPLCONF ACK <replication_offset>。
作用有三:
检测主从服务器的网络状态
辅助实现 min-slaves 配置选项
min-slaves-to-write、min-slaves-max-lag 可以防止发生脑裂现象
通过 offset 检测命令是否丢失
Redis设计与实现3.1:主从复制的更多相关文章
- 探索Redis设计与实现12:浅析Redis主从复制
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- Redis如何实现高可用【主从复制+哨兵机制+keepalived】
实现redis高可用机制的一些方法: 保证redis高可用机制需要redis主从复制.redis持久化机制.哨兵机制.keepalived等的支持. 主从复制的作用:数据备份.读写分离.分布式集群.实 ...
- 探索Redis设计与实现15:Redis分布式锁进化史
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- 探索Redis设计与实现14:Redis事务浅析与ACID特性介绍
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- 探索Redis设计与实现13:Redis集群机制及一个Redis架构演进实例
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- 探索Redis设计与实现11:使用快照和AOF将Redis数据持久化到硬盘中
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- 探索Redis设计与实现10:Redis的事件驱动模型与命令执行过程
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- 探索Redis设计与实现9:数据库redisDb与键过期删除策略
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- 探索Redis设计与实现8:连接底层与表面的数据结构robj
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
随机推荐
- Linux文件管理 | Liunx 常用命令
文件与目录基本操作 目录: 一.显示文件内容 cat 命令 more 命令 less 命令 head 命令 tail 命令 二.文件内容查询(grep) 三.文件查找命令 find 命令 locate ...
- 使用Javascript获取剪贴板图片的DataURL
最近写博客需要插入一些截图,想着用DataURL会方便点,于是需要一个把图片转成DataURL的工具.搜索一番后发现这个功能用HTML就能实现,通过paste事件. 先尝试在Chrome上实现,Chr ...
- 项目需求与分析--NABCD模型
合作项目特点NABCD分析结果: 特点:便捷 N(Need 需求):在大学期间内,我们通常会有许多不用的课本或书籍或者其他东西,堆积起来又没有地方放,想卖出去就要建一个群,十分麻烦,开发该软件用户可直 ...
- 界面跳转+Android Studio Button事件的三种方式
今天学习界面跳转 java类总是不能新建成功 看了网上教程 (20条消息) 关于android studio无法创建类或者接口问题的解决方法_qq_39916160的博客-CSDN博客 可以新建了 但 ...
- EMS批量为用户分配邮箱
组织单位"Office"下有10个域用户,可以通过PowerShell命令一次为该组织单位中的没有分配邮箱的域用户分配邮箱. 以Exchange管理员身份打开EMS控制台.在Pow ...
- css过渡效果和盒子缩放大小的结合
给盒子一个鼠标经过时放大里面的图片效果在css中使用过渡效果transition结合 <html lang="en"> <head> <meta ch ...
- CTFHUB之gopher协议实现SSRF
介绍 解题思路: 利用302协议(重定向)的跳转ssrf.可以访问与服务器相连的内网 ①什么是gopher协议 Gopher是Internet上一个信息查找系统,它将Internet上的文件组织成某种 ...
- JdGrid排序问题
JdGrid排序问题 js代码 function gridList() { var $gridList = $("#gridList"); $gridList.dataGrid({ ...
- FSB—QPI—DMI总线的发展
intel CPU有的是前端总线(FSB),有的是QPI总线,有的又是DMI总线 FSB总线(由于cpu的发展,fsb总线制约了cpu的发展,所以该总线已经渐渐淡出历史舞台) FSB即Front Si ...
- oracle查看当前用户表结构、主键、索引
1.查询表的所有列及其属性 select t.*,c.COMMENTS from user_tab_columns t,user_col_comments c where t.table_name = ...