Redis新旧复制「建议收藏」

Redis新旧复制「建议收藏」在Redis中,用户可以通过执行SALVEOF命令,让一个服务器去复制另一个服务器。 127.0.0.1:12345> SLAVEOF 127.0.0.1 6379 OK 6379的奴隶是123

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设计与实现》

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5815.html

(0)
上一篇 2023-04-23 17:30
下一篇 2023-04-23

相关推荐

  • 使用plsql创建用户并授权(图形化界面)「建议收藏」

    使用plsql创建用户并授权(图形化界面)「建议收藏」使用plsql创建用户并授权(图形化界面) 使用sys用户登录数据库(或者有dba权限的[还不知道具体的区别,但是能用]) 在左边的对象列表中找到USERS,右键点击USERS,选择“新建用户”选项…

    2023-01-29
    141
  • hudi clustering 数据聚集(一)「建议收藏」

    hudi clustering 数据聚集(一)「建议收藏」概要 数据湖的业务场景主要包括对数据库、日志、文件的分析,而管理数据湖有两点比较重要:写入的吞吐量和查询性能,这里主要说明以下问题: 1、为了获得更好的写入吞吐量,通常把数据直接写入文件中,这种情况下

    2023-04-27
    178
  • Python中的regexp_instr函数用法介绍

    Python中的regexp_instr函数用法介绍在编程领域中,处理或者查找字符串已经成为了日常工作的一部分,而正则表达式是处理字符串的最好工具之一。Python作为一个优秀的编程语言,自然也不例外。regexp_instr函数则是Python中正则表达式匹配工具之一。

    2024-08-12
    25
  • Python Tutor: 在线Python编程调试工具

    Python Tutor: 在线Python编程调试工具Python Tutor 是一款非常优秀的在线Python编程调试工具,它可以将Python程序的执行过程可视化,帮助用户更好地理解Python的执行过程。Python Tutor 由Philip Guo 开发,是一款免费开源的工具,广泛应用于教学和学习中。

    2024-03-02
    87
  • 提高学员学习交互性的Python课程平台

    提高学员学习交互性的Python课程平台Python课程平台的界面设计是提高学员学习交互性的重要因素之一。在界面设计过程中,需要考虑学员的视觉和操作体验,如何使学员可以快速、方便地找到所需功能和内容。

    2024-02-24
    103
  • 多项测试第一!腾讯云图数据库TGDB中标中国农行图数据库项目

    多项测试第一!腾讯云图数据库TGDB中标中国农行图数据库项目7月20日,中国农业银行发布图数据库资源配置项目中标公告,腾讯云中标。根据公告,腾讯云将为中国农业银行提供图数据库系统及客户化开发服务。此前腾讯云企业级分布式数据库TDSQL也中标了中国农业银行的分布

    2023-04-19
    180
  • 如何用Python卸载软件

    如何用Python卸载软件
    有时候我们在使用Python时,可能会出现python软件卸载不了的情况。这时,我们可以采用手动卸载。具体步骤如下:

    2024-06-02
    52
  • Mysql 架构分析[亲测有效]

    Mysql 架构分析[亲测有效]1. mysql架构图 1.1 各模块说明 2 .Binlog 日志的使用 3. Redo Log 和 Binlog的区别

    2023-03-20
    153

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注