Redis复制功能简述

目录 (Table of Contents)

[TOCM]

介绍

在Redis中,用户可以通过执行SLAVEOF命令或者设置salveof选线,让一个从服务器去复制主服务器。进行复制中的主从服务器双方的数据将保存相同的数据。
主服务器和从服务器

流程

Created with Raphaël 2.1.0 客户端 客户端 从服务器 从服务器 主服务器 主服务器 发送SLAVEOF命令,复制指定服务器 创建套接字连接 发送ping命令 如果ping失败了 从服务器断开重连 身份验证 只有主从服务器设置了相同的密码 以及主服务器没有设置权限的情况下 才能验证通过 发送端口信息 发送PSYNC命令 命令传播

旧版功能实现

Redis的复制功能分为同步和命令传播两个操作。

同步

同步就是从服务器根据获得的主服务其的RDB文件文件,将数据库状态跟新到和主服务器一致。

Created with Raphaël 2.1.0 从服务器 从服务器 主服务器 主服务器 SYNC命令 执行BGSAVE,后台生成一个RDB文件 创建一个缓冲区记录从现在开始执行的所有命令 发送RDB文件 载入RDB文件 数据更新至主服务器执行BGSAVE时的状态 发送缓冲区保存的所有指令 执行主服务器指令 更新至主服务器当前状态

命令传播

在同步流程之后,主服务器讲自己执行的写命令发送给从服务器执行。

功能缺陷

旧版本能很好完成初次复制工作,但是对于短线后重复制来说,效率很低,因为每次都要重新导入RDB文件

新版本功能实现

新版本的PSYNC命令具有完整重同步和部分重同步两种模式。
完整重同步:用于初次处理复制情况,和SYNC命令执行步骤基本一致
部分重同步:在SYNC命令的基础上,当服务器断线重连之后,如果条件允许,主服务器可以将从服务器连接断开期间的执行的写命令发送给从服务器
PSYNC实现

重同步的实现

复制偏移量

主从服务器维护一个偏移量,偏移量用来记录主服务器发送给从服务器的命令的字节数。这样通过判断偏移量就知道主从服务器是否一致。

复制积压缓冲区

由主服务器维护的一个固定长度,先进先出的队列(结构是list),默认大小1M(可配置)。保存了一部分最近传播的写命令,并为每个字节记录相应的复制偏移量。
当服务器重新连上时,从服务器会通过PSYNC命令将自己的偏移量发送给主服务,如果两者偏移量不一致,主服务器就会检查积压缓冲区中是否还保存的丢失的那些命令。如果有就向从服务器发送+CONTINUE回复,表示数据同步将以部分重同步模式来进行,然后把哪些命令发送给从服务器。

服务器运行ID

每个服务器有一个自己的运行ID,重连之后,从服务器会给主服务器发送之前保存的主服务器的运行ID,这样主服务就知道之前的ID是不是自己的,如果是的话就执行部分重同步。如果不是的话执行完整重同步。

心跳检测

主服务器通过发送和接收REPLCONF ACK命令来检查两者之间的网络是否正常:如果主服务器超过一秒钟没有收到从服务器发送的REPLCONF ACK命令,那么主服务器就知道出问题了。
当我们想了解连接状态时,可以向主服务器发送INFO replication命令,会显示出从服务器信息,lag字段表明了距离从服务器最后一次向主服务器发送REPLCONF ACK命令距离现在多少秒。超过1秒说明出现连接故障。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值