首页 > 数据库 >Redis-多机数据库-复制

Redis-多机数据库-复制

时间:2023-01-11 18:33:28浏览次数:40  
标签:同步 数据库 Redis 命令 复制 多机 服务器 断线 ID

复制

在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave)。

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

旧版的复制在断线重连后,即使不一致的数据量很少,也需要执行SYNC命令,传输RDB文件,十分耗费资源。

为了解决旧版复制功能在处理断线重复制情况时的低效问题,Redis从2.8版本开始,使用PSYNC命令代替SYNC命令来执行复制时的同步操作。

PSYNC命令具有完整重同步(full resynchronization)和部分重同步(partial resynchronization)两种模式:

  • 其中完整重同步用于处理初次复制情况:完整重同步的执行步骤和SYNC命令的执行步骤基本一样,它们都是通过让主服务器创建并发送RDB文件,以及向从服务器发送保存在缓冲区里面的写命令来进行同步。
  • 而部分重同步则用于处理断线后重复制情况:当从服务器在断线后重新连接主服务器时,如果条件允许,主服务器可以将主从服务器连接断开期间执行的写命令发送给从服务器,从服务器只要接收并执行这些写命令,就可以将数据库更新至主服务器当前所处的状态。

部分重同步的实现

部分重同步功能由以下三个部分构成:

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

复制偏移量

用于定位复制进度

复制积压缓冲区

用于判定进行部分重同步还是完整重同步。

服务器运行ID

运行ID在服务器启动时自动生成,由40个随机的十六进制字符组成,例如53b9b28df8042fdc9ab5e3fcbbbabff1d5dce2b3。

当从服务器对主服务器进行初次复制时,主服务器会将自己的运行ID传送给从服务器,而从服务器则会将这个运行ID保存起来。

当从服务器断线并重新连上一个主服务器时,从服务器将向当前连接的主服务器发送之前保存的运行ID:

  • 如果从服务器保存的运行ID和当前连接的主服务器的运行ID相同,那么说明从服务器断线之前复制的就是当前连接的这个主服务器,主服务器可以继续尝试执行部分重同步操作。
  • 相反地,如果从服务器保存的运行ID和当前连接的主服务器的运行ID并不相同,那么说明从服务器断线之前复制的主服务器并不是当前连接的这个主服务器,主服务器将对从服务器执行完整重同步操作。

PSYNC命令的流程

心跳检测

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

REPLCONF ACK <replication_offset>

其中replication_offset是从服务器当前的复制偏移量。

发送REPLCONF ACK命令对于主从服务器有三个作用:

  • 检测主从服务器的网络连接状态。
  • 辅助实现min-slaves选项。
  • 检测命令丢失。

标签:同步,数据库,Redis,命令,复制,多机,服务器,断线,ID
From: https://www.cnblogs.com/gcr277/p/17044554.html

相关文章

  • 数据库第二天(概述)
    视频笔记这章可能很多都看不太懂,后面学完之后再回来看一眼会更有感悟。......
  • ThinkPHP5 + predis 环境配置
     首先,下载Predis源代码,地址:https://github.com/nrk/predis/tree/master。将代码至于/vendor  目录下,代码结构如下:  2.创建Redis.php文件【方便引用】路径:\thinkphp......
  • redis连接出现问题的解决方案【待完善】
    项目中最近出现多次下列错误:Connectiontimedoutreaderroronconnection可以看出来,上述问题都是因为连接失败或者在失败的连接上操作出错,因此需要增加重试连接的......
  • 【postgresql】创建用户与数据库
    创建用户与数据库--cxlogepostgres--创建用户createusercxlogewithpassword'password';--创建数据库并指定拥有者createdatabasecxlogeownercxloge;--给指......
  • SQLSERVER自动备份数据库
    1.通过操作系统的定时任务执行创建两个文件,auto.bat和auto.sql,使用bat调用sql文件中的代码段auto.bat内容sqlcmd-Slocalhost,2433-Usa-PAa@123456-ddbname-i......
  • redis 中的 字符串
    String是redis中的最基本的类型,为二进制安全 ,意味着String可以表示各种类型 一个字符串value最大为521Msetk1v100setk2v200get命令根据key取值getk1 ......
  • redis本地启动方式
    redis在本地进行启动的方式 第一种使用cmd命令行进行过操作在本地配置好redis之后,启动的话是比较简单的 1-首先打开cmd运行界面 2-定位到本地redis目录 3-运行命......
  • Redis-单机数据库-服务器
    服务器命令请求的执行过程客户端发送命令请求当客户端与服务器之间的连接套接字因为客户端的写入而变得可读时,服务器将调用命令请求处理器来执行以下操作:读取套接字中......
  • Redis基础之常用命令说明(二)
      Redis是Key-Value类型缓存型数据库,Redis为了存储不同类型的数据,提供了五种常用数据类型,如下所示:string(字符串)hash(哈希散列)list(列表)set(集合)zset(sortedset:有......
  • 大学数据库笔记
    这里是原word笔记源文件当时大学的时候,学习数据库基本是班级里的第一名,但是毕业以后就做了前端从此几乎与后端无缘,为了纪念曾经的努力,在整理旧资料时候,特意拿出来,留个痕......