我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Redis设计与实现2.1:主从复制

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Redis设计与实现2.1:主从复制

Redis设计与实现2.1:主从复制

主从复制

这是《Redis设计与实现》系列的文章,系列导航:Redis设计与实现笔记

SLAVEOF

新旧复制功能

旧版复制功能

旧版复制功能的实现为 同步命令传播

当刚连上Master时,要做一次全同步:

sequenceDiagram participant Slave participant Master Slave->>Master: SYNC Master->>Master: BGSAVE Master->>Master: 记录此时的命令到缓冲区中 Master->>Slave: 发送RDB Master->>Slave: 发送命令缓冲区中的命令

之所以要用到缓冲区是因为,在主节点进行 BGSAVE 的过程中如果有命令执行,那么我们要把这些命令也记录下来。

之后,主从节点之间只用 命令传播 就可以做到同步了,也就是说主节点执行什么命令,从节点跟着执行。(当然,一些随机、时间类的函数会直接转换成定值)

旧版复制的缺陷

如果从节点断线后重新连接,旧版复制功能的效率很低,因为为了让从服务器补足一小部分的确实却要进行一次 SYNC 命令

为什么低效:

  1. 主节点 BGSAVE 要消耗大量的CPU、内存、IO资源
  2. 主节点发送需要消耗网络资源
  3. 从节点需要载入,且载入期间处于阻塞状态

新版复制功能

PSYNC 命令代替 SYNC。

PSYNC 具有 完整重同步部分重同步 两种模式,分别针对初次同步和重新同步两种场景。

复制功能的实现

复制的实现

复制的一些具体的细节,当进行复制时:

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

    struct redisServer{
    //...
    char *masterhost;
    int masterport;
    //...
    }
    
  2. 建立套接字连接,并关联一个专门处理复制工作的文件事件处理器

  3. 发送 PING 命令,检查套接字和主服务器的状态是否正常
    image_lymtics

  4. 身份验证,主从必须配置一致且密码正确(如果有)才能通过验证

  5. 发送端口信息:主节点也得知道给从节点的哪个端口发消息,不是么

  6. 同步:干正事儿喽

    这里书上说:

    • 在同步操作执行之前,只有从服务器是主服务器的客户端,但是在执行同步操作之后,主服务器也会成为从服务器的客户端。
    • 正是因为主服务成为了从服务器的客户端,所以主服务器才能通过发送写命令来改变从服务器的数据库状态。

    我想了想,似乎一般确实都是客户端改变服务端的数据的,所以这么说倒也在理,但是服务端不是也可以给客户端发送数据么?所以这里可能和 Redis 的具体实现有关?

  7. 命令传播:进入了第二个阶段

如何部分重同步

要关注的三个部分:

  1. 复制偏移量:主从服务器都有复制偏移量,通过这个值判断主从是否处于一致状态

  2. 主服务器的复制积压缓冲区:保存执行命令的历史记录

    一个固定长度(默认1MB)的 FIFO 的队列,当主从不一致时可以计算并从中获取缺少的命令。

    由于固定长度,所以如果缺的多了就只能进行完整重同步了。

    大小一般设为 断连平均时间 * 每秒的命令数,安全起见再乘以2。

  3. 服务器的运行 ID

    毕竟只有 ID 一致同步才有意义,否则说明换主人了,那还是全同步吧

PSYNC的逻辑

graph LR; S(接收到SLAVEOF命令) --> A{第一次复制?} A --Y--> A1[发送PSYNC ? -1] --> E1(返回+FULLRESYNC <runid> <offset>) A --N--> A2[发送PSYNC <runid> <offset>] --> B{主服务器返回 +CONTINUE} B --N--> E1 B --Y--> E2[执行部分重同步]

主要是判断 是否是第一次复制是否是同一个主服务器,从而决定是部分重同步还是全同步。

上图没有展示的是,如果主服务器不支持 PSYNC,则返回 -ERR

心跳检测

心跳检测:在命令传播阶段,从服务器默认每秒发送一次心跳:REPLCONF ACK

作用有三:

  1. 检测主从服务器的网络状态

  2. 辅助实现 min-slaves 配置选项

    min-slaves-to-write、min-slaves-max-lag 可以防止发生脑裂现象

  3. 通过 offset 检测命令是否丢失

原文地址:https://www.cnblogs.com/lymtics/archive/2022/04/28/16203107.html

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Redis设计与实现2.1:主从复制

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Redis设计与实现2.1:主从复制

主从复制这是《Redis设计与实现》系列的文章,系列导航:Redis设计与实现笔记SLAVEOF新旧复制功能旧版复制功能旧版复制功能的实现为 同步 和 命令传播:当刚连上Master时,要做一次全同步:sequenceDiagramparticipant Sl
Redis设计与实现2.1:主从复制
2021-05-11

redis主从复制如何实现

redis主从复制是一种实现数据冗余和高可用性的机制,通过以下步骤实现:建立连接、部分复制、增量复制、更新状态和同步完成。它具有数据冗余、高可用性、负载均衡和灾难恢复等优势,但也应注意其单向复制、异步复制、网络延迟和过期数据的问题。Redi
redis主从复制如何实现
2024-06-12

Redis server 主从复制配置实现

Redis主从复制是一种数据复制机制,确保数据高可用性和易扩展性。配置主服务器涉及设置IP地址、端口和密码。配置从服务器需要指定主服务器信息、只读模式和复制积压。高级选项包括控制复制积压大小、空闲超时和写操作限制。最佳实践包括使用多个从服务器、监控复制积压、进行故障转移演练以及利用RedisSentinel进行自动化管理。
Redis server 主从复制配置实现
2024-04-02

Redis中怎么实现主从复制

今天就跟大家聊聊有关Redis中怎么实现主从复制,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.首先下去官网下载并安装redis若安装成功点击redis-server 如此是成功2
2023-06-20

怎么在Redis中实现持久化与主从复制

这篇文章给大家介绍怎么在Redis中实现持久化与主从复制,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。为什么需要持久化Redis是基于内存的NoSQL数据库,读写速度自然快,但内存是瞬时的,在redis服务关闭或重启之
2023-06-14

Redis实现主从复制方式(Master&Slave)

目录主从复制方式(Master&Slave)一、Master&Slave是什么?二、它能干嘛?三、怎么玩?四、复制原理五、哨兵模式(sentinel)六、复制的缺点Redis master, slave节点部署详解主从复制方式(Master
2022-06-20

使用Docker怎么实现Redis主从复制

今天就跟大家聊聊有关使用Docker怎么实现Redis主从复制,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。安装docker的命令如下所示curl -sSL https://get.
2023-06-14

Redis | 第11章 服务器的复制《Redis设计与实现》

目录前言1. 旧版复制功能的实现1.1 同步与命令传播1.2 旧版复制功能的缺陷2. 新版复制功能的实现2.1 部分重同步的实现原理3. PSYNC 命令的实现4. 复制的详细步骤4.1 设置主服务器的地址和端口4.2 建立套接字连接4.3 发送 PING 命
Redis | 第11章 服务器的复制《Redis设计与实现》
2020-11-24

Redis搭建主从复制实现高可用(如何保证 Redis 主从复制的高可用性?)

高可用 HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。
Redis搭建主从复制实现高可用(如何保证 Redis 主从复制的高可用性?)
2024-11-01

Redis主从复制与哨兵机制是什么

这篇文章主要介绍了Redis主从复制与哨兵机制是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redis主从复制与哨兵机制是什么文章都会有所收获,下面我们一起来看看吧。一、Redis复制是什么?Redis复
2023-07-05

redis主从复制的实现方法是什么

本篇内容介绍了“redis主从复制的实现方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 简介这篇文章主要讲述Redis的主从复制
2023-06-05

编程热搜

目录