ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Redis新旧复制

2021-09-29 23:04:24  阅读:153  来源: 互联网

标签:同步 Redis 命令 复制 新旧 缓冲区 服务器 主从


在Redis中,用户可以通过执行SALVEOF命令,让一个服务器去复制另一个服务器。

127.0.0.1:12345> SLAVEOF 127.0.0.1 6379
OK
  • 6379的奴隶是12345。

旧版复制功能实现

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

  • 同步:将从服务器更新为主服务器的状态。
  • 命令传播:在主服务器状态被修改,导致主从状态不一致,让主从回到一致状态。

同步

客户端向服务器发送SYNC命令,SYNC步骤:

  1. 从 -> 主 发送SYNC。
  2. 主 执行BGSAVE命令,后台生成RDB,并且使用缓冲区记录 从 现在开始执行的所有写命令。
  3. RDB生成完毕时,发送给 从,从 载入这个RDB,更新至 主 执行BGSAVE时的数据库状态。
  4. 主 将缓冲区的写命令发给 从,从 更新至 主 当前的状态。

命令传播

在同步执行完毕之后,主从达到一致状态,但是当 主 执行客户端的命令时,主从再次不一致。

为了让主从再次回到一致状态,主 需要对 从 执行命令传播操作:主 会将自己执行的写命令发送给 从 ,这样就回

到主从一致了(迫真)。

旧版复制的缺陷

对于第一次复制来说旧版是可以的,但是对于断线后重连效率是很低的,因为,断线重连的服务器保存的数据大部

分是相同的,发送SYNC命令传送RDB文件并不是非做不可的!

SYNC命令是一个非常耗费资源的操作。

新版复制功能的实现

为了解决旧版的问题,Redis从2.8开始,使用PSYNC代替SYNC。

PSYNC有完整重同步和部分重同步2个命令:

  • 完整重同步:与同步命令是一样的。

  • 部分重同步:如果条件允许,主 可以将主从服务器连接断开期间执行的写命令发送给 从。

部分重同步的实现

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

  • 主服务器的复制偏移量(replication offset)和从服务器的复制偏移量。

  • 主服务器的复制积压缓冲区(replication backlog)。

  • 服务器的运行ID(run ID)。

复制偏移量

image

A断线后,从服务器向主服务器发送PSYNC,报告A的offset为10086。

复制积压缓冲区

缓冲区由主服务区维护的固定长度先进先出(fixed-size FIFO)队列,默认大小为1MB。

当主服务器进行命令传播时,不仅会将命令发送给从服务器,还会将写命令入队到缓冲区中。

因此,主服务器的缓冲区保存着最近传播的写命令,并且记录了每个字节的偏移量

当从服务器重新连上主服务器,从服务器发送自己的offset,主服务器根据这个offset决定执行何种操作:

  • 如果offset之后的数据仍然存在于缓冲区里,那么主服务器将对从服务器执行部分重同步。
  • 相反如果不存在于缓冲区里,那么执行完整重同步。

根据需要调整复制积压缓冲区大小

最小大小计算公式:second * write_size_per_second

second为从服务器重新连上主服务器的平均时间。

write_size_per_second是主服务器平均每秒产生的写命令数据量。

服务器运行ID

每个服务器运行后会自动生成40个随机十六进制字符的ID。

  1. 主 和 从 初次复制时,主 会将自己的ID给 从。

  2. 当从服务器断线并重新连上主服务器时,从服务器会发送之前保存的ID给 主,如果一致就可以部分重同步。

复制的实现

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

  2. 建立套接字连接

  3. 发送PING

  4. 身份验证

  5. 发送端口信息

  6. 同步

值得一提的是,在同步之前,只有 从 是 主 的客户端,同步之后,主 也是 从 的客户端。主从服务器双方都是对方

的客户端,他们才可以互相发送命令,主 才可以发送写命令改变 从 的数据库状态。

  1. 命令传播

Reference

《Redis设计与实现》

标签:同步,Redis,命令,复制,新旧,缓冲区,服务器,主从
来源: https://www.cnblogs.com/bllbl/p/15354792.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有