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. uniapp 自定义弹窗组件

    先上效果: 组件源码:slot-modal.vue <template> <view class="modal-container" v-if="sho ...

  2. mysql一张表到底能存多少数据?

    前言 程序员平时和mysql打交道一定不少,可以说每天都有接触到,但是mysql一张表到底能存多少数据呢?计算根据是什么呢?接下来咱们逐一探讨 知识准备 数据页 在操作系统中,我们知道为了跟磁盘交互, ...

  3. AttributeError: 'function' object has no attribute 'as_view'

    我的描述:当我启用jwt_required来进行token验证的时候,我提示错误; 解决方案: 修改前代码: 修改后代码: 多看书.多多了解.多看看世界...

  4. SQL Server中DELETE和TRUNCATE的区别

    ​DELETE和TRUNCATE语句之间的区别是求职面试中最常见的问题之一.这两条语句都可以从表中删除数据.然而,也有不同之处. 本文将重点讨论这些差异,并通过实例加以说明. TRUNCATE DEL ...

  5. Spring-02 第一个Spring程序

    Spring-02 第一个Spring程序 第一个Spring程序 1.导入依赖 <dependency> <groupId>org.springframework</g ...

  6. vscode好用插件总结

    做个记录:https://blog.csdn.net/xishining/article/details/90819481 1.Auto Rename Tag --自动重命名成对的HTML标记.假如你 ...

  7. web前端学习笔记(二)---Django

    [前言]前面(一)学习了web的基础知识,介绍到了MVC,项目使用一个Django框架. Django book:https://code.ziqiangxuetang.com/django/djan ...

  8. Kafka SASL ACL配置踩坑总结

    源起:工程现阶段中间件采用的是kafka.满足了大数据的高吞吐,项目间的解耦合,也增强了工程的容错率与扩展性.但是在安全这一块还有漏洞,kafka集群中,只要网站内的任何人知道kafka集群的ip与t ...

  9. const修饰符相关

    const修饰符相关 const修饰符表明一个变量是常量,大致分为三类:常量数组(等同于常量指针),常量指针,指向常量的指针. 常量数组中数据都是不可修改的,任何试图修改常量数组中的数据的操作都会报错 ...

  10. JS的this指向深入

    this指向深入 this的绑定规则 默认绑定 this默认指向了window 全局环境下this指向了window 函数独立调用,函数内部的this也指向了window <script> ...