Redis 的主从复制

news/2024/9/23 7:22:25/

Redis 的主从复制

       本文讲解的Redis 主从复制机制,是基于 2.8及以后的版本而言,2.8以前的版本主从复制机制与此有所不同,请知悉。

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

 

1、主从复制的实现

 

  • 设置主服务器的地址和端口

    # 查看redis服务在集群中的主从角色
    info replication
    # 设置主从关系:设从不设主
    # 在Redis5.0之前的版本中,配置主从复制通常使用SLAVEOF命令。从Redis5.0开始,推荐使用REPLICAOF命令来代替SLAVEOF
    ## 在从服务器上设置
    slaveof <主服务器ip> <主服务端口>
    
  • ② 建立套接字连接

  • ③ 发送 PING 命令

  • ④ 身份验证

  • ⑤ 发送端口信息

  • 同步

    • PSYNC 执行完整重同步部分重同步
  • 命令传播

    • 完成同步后,主从服务器就进入命令传播阶段。当主服务器的数据库状态被修改(例如,执行了写命令如SET、DEL等)时,主从服务器的数据库状态可能会出现不一致。为了解决这个问题,主服务器会将导致不一致的写命令(即主服务器接收到的新写命令)发送给从服务器,从服务器在接收到这些命令后会执行它们,从而使其数据库状态与主服务器保持一致。

 

2、主从复制的同步功能(PSYNC)

 

      2.8及以后的版本主从复制主要是基于 PSYNC 命令,PSYNC命令具有完整重同步(full resynchronization) 和部分重同步(partial resynchronization)两种模式。

  • 完整重同步:用于处理初次主从复制的情况。通过让主服务器创建并发送 RDB 文件,以及向从服务器发送保存在缓冲区里面的写命令来进行同步。
  • 部分重同步:用于处理断线(网络抖动等)后主从复制情况。当从服务器在断线后重新连接主服务器时,如果条件允许(如从服务器提供的复制偏移量在复制缓冲区内),主服务器将主从服务器连接断开期间执行的写命令发送给从服务器,从服务器接收并执行这些写命令。

 
在这里插入图片描述

使用 PSYNC 命令来进行断线后重复制时间流程图:

时间线主服务器从服务器
T0主从服务器完成同步主从服务器完成同步
T1执行并传播 SET k11 v11执行主服务器传来的 SET k11 v11
T2执行并传播 SET k22 v22执行主服务器传来的 SET k22 v22
T180执行并传播 SET k99 v99执行主服务器传来的 SET k99 v99
T181执行并传播 SET k100 v100执行主服务器传来的 SET k100 v100
T182主从服务器连接断开主从服务器连接断开
T183执行 SET k101 v101断线中,尝试重新连接主服务器
T184执行 SET k102 v102断线中,尝试重新连接主服务器
T185执行 SET k103 v103断线中,尝试重新连接主服务器
T186主从服务器重新连接主从服务器重新连接
T187向主服务器发送 PSYNC 命令
T188向从服务返回 +CONTINUE 回复,表示执行部分重同步
T189接收 +CONTINUE 回复,准备执行部分重同步
T190向从服务器发送 SET k101 v101、SET k102 v102、SET k103 v103 三个命令
T191接收并执行主服务器传来的三个 SET 命令
T192主从服务器再次完成同步主从服务器再次完成同步

2.1、部分重同步

 
部分重同步主要有以下三个部分构成:

  • ① 主服务器的复制偏移量(replication offset) 和从服务器的复制偏移量。
  • ② 主服务器的复制积压缓冲区(replication backlog)
  • ③ 服务器的运行ID(runid)

 

       重点说一下主服务器的复制积压缓冲区:当主服务器进行命令传播时,它不仅将写命令发送给所有从服务器,还会将写命令入队到复制积压缓冲区。主服务器的复制积压缓冲区会保存一部分最近传播的写命令,并且复制积压缓冲区会为队列中的每个字节记录相应的复制偏移量。复制积压缓冲区设置的默认大小为 1MB.

 
 
 
 
 
 
 
.


http://www.ppmy.cn/news/1460204.html

相关文章

云服务器配置mysql允许被远程连接从而使用图形化界面

介绍 在云服务器上搭建和配置数据库是进行网站和应用开发的关键步骤之一。本文将介绍如何在云服务器上设置 MySQL 8 和 MySQL 5&#xff0c;以允许远程连接&#xff0c;从而让你的数据库能够被远程用户访问。这样你的本机就可以访问linux服务器上的mysql能&#xff0c;就可以使…

3D 生成重建009-DreamGaussian使用gaussian splatting在两分钟内生成3d

3D 生成重建009-DreamGaussian使用gaussian splatting在两分钟内生成3d 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 DreamGaussian是第一个使用gaussian splatting方法进行3d生成的工作。论文最先使用gaussian splatting替代原来用nerf表示3d。整体架构依然保留了原来的…

重写muduo之TcpServer

目录 1、Callbacks.h 2、TcpServer.h 3、TcpServer.cc 1、Callbacks.h 回调操作 #pragma once#include <memory> #include <functional>class Buffer; class TcpConnection;using TcpConnectionPtrstd::shared_ptr<TcpConnection>; using ConnectionCall…

深度学习--DCGAN

代码之后的注释和GAN的一样&#xff0c;大家如果已经掌握GAN&#xff0c;可以忽略掉哦&#xff01;&#xff01;&#xff01; 在学习DCGAN之前&#xff0c;我们要先掌握GAN&#xff0c;深度学习--生成对抗网络GAN-CSDN博客 这篇博客讲的就是GAN的相关知识&#xff0c;还是很详…

手机App防沉迷系统-算法

import java.util.*; public class Main{public static void main(String[] args){Scanner innew Scanner(System.in);int nInteger.parseInt(in.nextLine());//已注册app列表List<Log> listnew ArrayList<>();for(int k0;k<n;k){String[] strin.nextLine().spl…

springboot 设置response和request的默认格式 驼峰或者SNAKE_CASE

springboot 设置response和request的默认格式 驼峰或者SNAKE_CASE。 我们使用默认配置的情况下&#xff0c;response和request是由jackson jason序列化和解析的&#xff0c;因此&#xff0c;我们只需要配置好jackson json的默认格式就可以。 要设置 jackson json默认的更多格式…

Linux程序依赖动态链接库目录管理和案例分析

Linux程序运行时查找依赖的动态链接库路径 编译时指定的-rpath&#xff1a;如果程序在编译时使用了-Wl,-rpath,链接器选项&#xff0c;那么程序在运行时也会在这些指定的目录中搜索库。环境变量LD_LIBRARY_PATH指定的目录&#xff1a;这是一个环境变量&#xff0c;可以包含一系…

SqlException 口令已经失效

Orcle密码过期了 //查看过期时间 SELECT * FROM dba_profiles s WHERE s.profileDEFAULT AND resource_namePASSWORD_LIFE_TIME;//修改过期时间 alter PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;