redis的主从复制

  1. 成为从服务器的命令: SLAVEOF

复制功能分为 同步 + 命令传播

同步:将从服务器的状态更新到主服务器的状态(只在建立连接的时候)
命令传播:同步完成之后,主服务器接收到命令,导致的主从双方不一致的情况,通过命令的传播来维持主从的一致性

同步功能的实现

  1. SYNC命令(旧版本的复制功能)=完整的重同步
  2. PSYNC命令(新版本的复制功能)=完整重同步+部分重同步
旧版的SYNC操作
  1. 从服务器发送SYNC命令
  2. 主服务器收到SYNC命令后,执行BGSAVE命令,生成RDB文件(这个RDB文件仅记录到执行BGSAVE命令时的数据库状态),并且创建一个缓存区将从现在开始的写命令写进来
  3. 从服务器加载RDB文件,恢复到主服务器开始BGSAVE时的状态
  4. 主服务器将缓冲区的命令发送给从服务器,保证生成RDB文件时的写命令也能被完整执行

旧版SYNC的缺点:只有单纯的完整重同步导致断开连接后重连上来的从服务器也必须要让主服务器重新生成RDB文件。
1.生成RDB文件影响性能
2. 传输RDB文件增加网络负担

所以在新版本的PSYNC命令中增加了部分重同步的操作

新版的PSYNC

从服务器断开连接后重新连接的主服务器如果还是原来的那台,并且中间两者相差的命令查的不多,可以仅对中间相差的命令做部分的重同步

  1. 主从服务器各自维护一个偏移量offset
  2. 主服务器每次向从服务器复制N个字节的数据时,就将自己的offset增加N
  3. 从服务器接收到N个字节的数据时,就将自己的offset增加N
  4. 通过这两个offset就可以知道主从服务器之间相差的偏差了

PSYNC的复制积压缓存区:主服务器维护一个先进先出(FIFO)的固定长度的队列(默认1MB),主服务器在复制给从服务器的时候,也会往这个队列里面存放数据。其中每一个字节都有对应的偏移量offset(和主从服务器维护的offset一个概念)

  1. 当PSYNC命令时,发现主从服务器有偏差,并且从服务器当前的offset还在这个复制积压缓存区的话,就可以使用部分重同步

PSYNC命令 PYSNC <runid> <offset>
runid:本从服务器上次同步的主服务id,用来比较是不是断开前连接的是本主服务器,如果不是,直接完整重同步
offset:从服务器当前的offset,用来判断是否使用部分重同步

复制的实现步骤

  1. 设置需要同步的主服务器
    SLAVEOF ip port
  2. 建立socket
  3. 发送PING命令确认连接是否正常
  4. 身份验证
  5. 发送端口命令 --告诉主服务器自己的监听端口(不知道啥作用)
  6. 同步 PSYNC
  7. 命令传播
  8. 心跳检测
    1. 检查网络连接状态
    2. 检测命令丢失(传递offset)
    3. 辅助实现 min-slaves (还不知道怎么实现)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本篇就一下方面展开分析 如何使用主从复制? 主从复制的原理(重点是全量复制和部分复制、以及心跳机制) 实际应用中需...
    lucode阅读 1,010评论 0 5
  • 通过这篇文章你会知道如下: 如何配置主从关系?如何断开主从关系?如何将从节点变成主节点? 主从复制的拓扑结构以及相...
    打伞的Fish阅读 455评论 0 1
  • 什么是Redis的主从复制 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节...
    莫小鹏阅读 579评论 0 1
  • 1、Units单位 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit 对大小写不敏感 2...
    MPPC阅读 65,211评论 0 15
  • 本文主要介绍Redis集群中主从服务器复制功能的实现。 在Redis中,用户可以通过执行SLAVEOF命令或设置s...
    wenmingxing阅读 984评论 0 5