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

相关推荐

  • 使用Python的vstack实现数组的垂直堆叠

    使用Python的vstack实现数组的垂直堆叠a href=”https://beian.miit.gov.cn/”苏ICP备2023018380号-1/a Copyright www.python100.com .Some Rights Reserved.

    2024-05-26
    56
  • Python Dictionary 长度计算方法

    Python Dictionary 长度计算方法strongPython/strong是一个强大且易于学习的编程语言,它提供了多个重要的数据类型,其中之一就是字典(Dictionary)。在Python中,字典是一种无序的、可变的数据类型,其存储方式为键-值对。字典中的键必须是不可变的数据类型,如字符串、数字或元组。而值则可以是任何类型的Python对象。在这篇文章中,我们将会详细介绍如何用Python计算字典的长度。

    2024-02-22
    107
  • Python中的无穷大

    Python中的无穷大随着计算机科学的不断进步,越来越多的应用程序需要处理非常大或者非常小的数字。Python作为一种强大的编程语言,在数字计算方面具有丰富的类型和功能。其中一种非常重要的类型就是无穷大。

    2024-05-09
    62
  • MySQL触发器了解一下「终于解决」

    MySQL触发器了解一下「终于解决」简介 触发器是与表有关的数据库对象,当表发生INSERT/UPDATE/DELETE操作时,对应操作的触发器会被触发,将在这些操作之前或之后执行触发器中定义的SQL语句集合。 触发器的使用 创建触发器

    2023-04-12
    146
  • Python函数嵌套学习

    Python函数嵌套学习在Python中,函数可以嵌套定义在另一个函数中,被嵌套的函数称为内部函数,而包含内部函数的函数称为外部函数。以下是一个简单的例子:

    2024-08-18
    25
  • oracle数据库连接池_oracle数据库连接池

    oracle数据库连接池_oracle数据库连接池 Oraclejdbc.properties driverClassName=oracle.jdbc.driver.OracleDriver url=jdbc:oracle:thin:@127…

    2023-03-23
    141
  • 初中英语“定语从句的讲解与练习”

    初中英语“定语从句的讲解与练习”定语从句(Attributive Clauses)在句中做定语,修饰一个名词或代词,被修饰的名词,词组或代词即先行词。定语从句通常出现在先行词之后,由关系词(关系代词或关系副词)引出。 关系代词有:…

    2022-12-25
    149
  • Python字典基础教程

    Python字典基础教程Python是一门十分强大的编程语言,它拥有丰富的数据结构种类,其中字典(dictionary)也是其中一种常用的数据结构之一。字典是Python中用于存储键值对的数据类型,它常用于实现非常复杂的数据处理,比如数据库的访问等。本篇文章将会对Python字典的基础知识进行详细介绍,帮助读者在日常编程中更好地理解和使用字典。

    2024-04-16
    77

发表回复

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