15.1 旧版复制功能的实现

同步

命令传播

旧版复制功能的缺陷

15.3 新版复制功能的实现

Redis2.8开始,使用PSYNC命令替代SYNC命令来执行复制时的同步操作

PSYNC命令具有完整重同步和部分重同步两种模式:

  • 完整重同步与SYNC执行步骤基本相同
  • 部分重同步用于处理断线后重复制情况,当从服务器在断线后重新连接服务器时,如果条件允许,主服务器可以将主从服务器连接断开期间执行的写命令发送给从服务器,从服务器只要接收执行这些命令,实现同步

15.4 部分重同步的实现

  • 主服务器的复制偏移量和从服务器的复制偏移量
  • 主服务器的复制积压缓冲区
  • 服务器的运行ID

复制偏移量

执行复制的双方——主服务器和从服务器会分别维护一直复制偏移量:

  • 主服务器每次向从服务器传播N个字节的数据时,就将自己的复制偏移量的值上+N
  • 从服务器每次收到主服务器传播来的N个字节的数据时,就将自己的复制偏移量的值+N

复制积压缓冲区

一个向从服务器发送数据的队列,如果发送过程中连接中断,重新连接就可以将队列的内容发送出去,实现重同步,它的大小可以参考每次断开时间*服务器每秒处理的写入请求数

服务器运行ID

从服务器可以通过对主服务器的运行ID进行验证,确认连接的服务器是否为原来的服务器

15.5 PSYNC命令的实现

15.6 复制的实现

步骤1:设置主服务器的地址和端口

从服务器的服务器状态中设置:

struct redisServer{
//... // 主服务器的地址
char *masterhost; // 主服务器的端口
int masterport; //...
};

步骤2:建立套接字连接

步骤3:发送PING命令

  • 检查套接字的读写状态
  • 通过发送PING命令可以检查主服务器能否正常处理命令请求
  • 如果主服务器返回一个错误,那么表示主服务器暂时没办法处理从服务器的命令请求,不能继续执行复制工作的后续步骤
  • 如果从服务器读取到“PONG”回复,标识主服务器可以正常处理从服务器发送的命令请求

步骤4:身份验证

如果从服务器设置了masterauth选项,则进行身份验证

步骤5:发送端口信息

从服务器向执行命令REPLCONF listening-port <port-number>主服务器发送端口号

主服务器在客户端状态

struct redisClient{
//... // 从服务器的监听端口号
int slave_listening_port; //...
};

步骤6:同步

在同步操作执行之后,主从服务器双方都是对方的客户端,它们可以互相向对方发送命令请求,或者返回回复

正因为主服务器成为了从服务器的客户端,所以主服务器才可以通过发送写命令来改变从服务器的数据库状态,不仅同步操作需要用到这一点,这也是主服务器对从服务器执行命令传播操作的基础

步骤7:命令传播

15.7 心跳检测

在命令传播阶段,从服务器默认会以每秒一次的频率,向主服务器发送命令:

REPLCONF ACK<replication_offset>

对于主服务器有三个作用:

  • 检测主从服务器的网络连接状态
  • 付诸实现min-slaves选项
  • 检测命令失效

检测主从服务器的网络连接状态

INFO replication

lag值显示了从服务器响应的时间,一般这个值在0-1之间

辅助实现min-slaves配置选项

Redis的min-slaces-to-write 和 min-slaces-max-lag 两个选项可以繁殖主服务器在不安全的情况下执行写命令

检测命令丢失

【笔记】《Redis设计与实现》chapter15 复制的更多相关文章

  1. 《Redis设计与实现》- 复制

    在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡灯需求.Redis提供了复制功能,实现了相同数据多个副本,复制功能作是高可用Redis的基础,深入理解复制 ...

  2. 《Redis设计与实现》读书笔记

    <Redis设计与实现>读书笔记 很喜欢这本书的创作过程,以开源的方式,托管到Git上进行创作: 作者通读了Redis源码,并分享了详细的带注释的源码,让学习Redis的朋友轻松不少: 阅 ...

  3. 《Redis设计与实现》阅读笔记(一)--Redis学习

    Redis学习资料与过程记录 在实习中经常会用到很多Redis,对Redis有了一些模糊的了解,总觉得隔靴搔痒的不痛快,所以决定开始深入的了解Redis,也作为我实习期间的目标. 这篇只是为了占个位置 ...

  4. Redis | 第11章 服务器的复制《Redis设计与实现》

    目录 前言 1. 旧版复制功能的实现 1.1 同步与命令传播 1.2 旧版复制功能的缺陷 2. 新版复制功能的实现 2.1 部分重同步的实现原理 3. PSYNC 命令的实现 4. 复制的详细步骤 4 ...

  5. Redis | 第一部分:数据结构与对象 上篇《Redis设计与实现》

    目录 前言 1. 简单动态字符串 1.1 SDS的定义 1.2 空间预分配与惰性空间释放 1.3 SDS的API 2. 链表 2.1 链表与节点的定义 2.2 链表的API 3. 字典 3.1 哈希表 ...

  6. Redis设计与实现2.1:数据库和事件

    数据库和事件 这是<Redis设计与实现>系列的文章,系列导航:Redis设计与实现笔记 数据库 数据库的结构定义在 redis.h/redisServer 这个结构体中,这个结构体有许多 ...

  7. Redis设计与实现3.3:集群

    集群 这是<Redis设计与实现>系列的文章,系列导航:Redis设计与实现笔记 集群中的节点 创建集群 通过 CLUSTER NODE 命令可以查看当前集群中的节点.刚启动时,默认每一台 ...

  8. Redis设计与实现3.2:Sentinel

    Sentinel哨兵 这是<Redis设计与实现>系列的文章,系列导航:Redis设计与实现笔记 哨兵:监视.通知.自动故障恢复 启动与初始化 Sentinel 的本质只是一个运行在特殊模 ...

  9. Redis设计与实现3.1:主从复制

    主从复制 这是<Redis设计与实现>系列的文章,系列导航:Redis设计与实现笔记 SLAVEOF 新旧复制功能 旧版复制功能 旧版复制功能的实现为 同步 和 命令传播: 当刚连上Mas ...

  10. Redis设计与实现(一~五整合版)【搬运】

    Redis设计与实现(一~五整合版) by @飘过的小牛 一 前言 项目中用到了redis,但用到的都是最最基本的功能,比如简单的slave机制,数据结构只使用了字符串.但是一直听说redis是一个很 ...

随机推荐

  1. 两年Java,去字节跳动写Python和Go

    前言 2019年5月,在收到offer邮件的那一刻,我仍然不敢相信自己这一番际遇.经历了七场面试,终于得偿所望,拿到了字节跳动的offer. 做加入大厂的决定并不是巧合.在多年的职业生涯里,我曾多次对 ...

  2. synchronized语法

    synchronized( ){ } synchronized 关键字是加锁的意思,用它来修饰方法就表示给该方法加了锁,从而达到线程同步的效果;用它来修饰代码块就表示给该代码块加了锁,从而达到线程同步 ...

  3. this指针、引用、顶层和底层const关系

    1.首先顶层const和底层const是围绕指针*p的说法.底层:const int *p,const不是修饰指针p,指针所指的值不能改变:顶层:int *const p,const修饰指针p,指针本 ...

  4. wxWidgets源码分析(5) - 窗口管理

    窗口管理 所有的窗口均继承自wxTopLevelWindows: WXDLLIMPEXP_DATA_CORE(wxWindowList) wxTopLevelWindows; wxTopLevelWi ...

  5. wxWidgets源码分析(4) - 消息处理过程

    目录 消息处理过程 消息如何到达wxWidgets Win32消息与wxWidgets消息的转换 菜单消息处理 消息处理链(基于wxEvtHandler) 消息处理链(基于wxWindow) 总结 消 ...

  6. 华硕主板开机无法进入BIOS

    先说下本人情况,自己组装的台式机,华硕TUF B550M-Plus (wifi)的主板,CPU是锐龙 4650G(带核显),其他配件不涉及问题就不提了. 原来用独显的时候,没啥问题,开机有品牌logo ...

  7. CSS相关知识(持续更新中)

    1. 弹性布局 一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式.引入弹性布局模型的目的是提供一种更加有效的方式来对一个容器中的子元素进行排列.对齐和分配空白空间. 2. ...

  8. 剑指 Offer 33. 二叉搜索树的后序遍历序列 + 根据二叉树的后序遍历序列判断对应的二叉树是否存在

    剑指 Offer 33. 二叉搜索树的后序遍历序列 Offer_33 题目详情 题解分析 本题需要注意的是,这是基于一颗二叉排序树的题目,根据排序二叉树的定义,中序遍历序列就是数据从小到大的排序序列. ...

  9. 太上老君的炼丹炉之分布式 Quorum NWR

    分布式系列文章: 1.用三国杀讲分布式算法,舒适了吧? 2.用太极拳讲分布式理论,真舒服! 3.诸葛亮 VS 庞统,拿下 Paxos 共识算法 4.用动图讲解分布式 Raft 5.韩信大招:一致性哈希 ...

  10. WooYun-2016-199433 -phpmyadmin-反序列化-getshell

    文章参考 http://www.mottoin.com/detail/521.html https://www.cnblogs.com/xhds/p/12579425.html 虽然是很老的漏洞,但在 ...