广告
返回顶部
首页 > 资讯 > 数据库 >Redis设计与实现2.1:主从复制
  • 413
分享到

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

Redis设计与实现2.1:主从复制 2021-05-11 17:05:50 413人浏览 绘本
摘要

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

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

您可能感兴趣的文档:

--结束END--

本文标题: Redis设计与实现2.1:主从复制

本文链接: https://www.lsjlt.com/news/9291.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Redis设计与实现2.1:主从复制
    主从复制 这是《Redis设计与实现》系列的文章,系列导航:Redis设计与实现笔记 SLAVEOF 新旧复制功能 旧版复制功能 旧版复制功能的实现为 同步 和 命令传播: 当刚连上Master时,要做一次全同步: sequenceD...
    99+
    2021-05-11
    Redis设计与实现2.1:主从复制
  • 怎么实现Redis主从复制
    本篇内容介绍了“怎么实现Redis主从复制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!架构主 192.1...
    99+
    2022-10-18
  • 图解Redis,Redis主从复制与Redis哨兵机制
    目录 专栏导读一、Redis复制是什么?二、Redis复制能干嘛?三、Redis复制的缺点1、复制延迟2、master宕机 四、乐观复制策略五、Redis复制常用命令1、info re...
    99+
    2023-09-06
    redis java 数据库 分布式
  • Redis中如何实现主从复制
    Redis中如何实现主从复制,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Redis复制概论数据库复制指的是发生在不同数据库实...
    99+
    2022-10-18
  • Redis中怎么实现主从复制
    今天就跟大家聊聊有关Redis中怎么实现主从复制,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.首先下去官网下载并安装redis若安装成功点击redis-server 如...
    99+
    2023-06-20
  • Redis持久化与主从复制的实践
    为什么需要持久化 Redis是基于内存的NoSQL数据库,读写速度自然快,但内存是瞬时的,在redis服务关闭或重启之后,redis存放在内存的数据就会丢失,为了解决这个问题,red...
    99+
    2022-11-12
  • redis主从复制之全量复制与部分复制
    一、什么事全量复制与部分复制? 全量复制:一般用于初次复制场景,Redis早期支持的复制功能只有全量复制,它会把主节点全部数据一次性发送给从节点,当数据量较大时,会对主从节点和网络造成很大的开销. 部分复...
    99+
    2022-10-18
  • 怎么在Redis中实现持久化与主从复制
    这篇文章给大家介绍怎么在Redis中实现持久化与主从复制,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。为什么需要持久化Redis是基于内存的NoSQL数据库,读写速度自然快,但内存是瞬时的,在redis服务关闭或重启之...
    99+
    2023-06-14
  • Redis实现主从复制方式(Master&Slave)
    目录主从复制方式(Master&Slave)一、Master&Slave是什么?二、它能干嘛?三、怎么玩?四、复制原理五、哨兵模式(sentinel)六、复制的缺点R...
    99+
    2022-11-13
  • Redis-3.2主从复制与集群搭建
    一、Redis 主从搭建1.下载并解压yum install -y gcc gcc-c++ pcre zlib pcre-devel&n...
    99+
    2022-10-18
  • 详解Redis主从复制实践
    目录复制简介服务介绍实现方式1. 服务启动时配置2. 命令行配置3. 配置文件配置4.配置说明效果测试1.主服务器添加数据2.从服务器获取数据实现原理实现策略1.全量复制2.部分复制...
    99+
    2022-11-12
  • Redis主从复制与哨兵机制是什么
    这篇文章主要介绍了Redis主从复制与哨兵机制是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redis主从复制与哨兵机制是什么文章都会有所收获,下面我们一起来看看吧。一、Redis复制是什么?Redis复...
    99+
    2023-07-05
  • Redis实现主从复制方式(Master&Slave)
    目录主从复制方式(Master&Slave)一、Master&Slave是什么?二、它能干嘛?三、怎么玩?四、复制原理五、哨兵模式(sentinel)六、复制的缺点Redis master, slave节...
    99+
    2022-06-20
    Redis实现主从复制 Redis主从复制 主从复制Master Slave
  • 使用Docker怎么实现Redis主从复制
    今天就跟大家聊聊有关使用Docker怎么实现Redis主从复制,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。安装docker的命令如下所示curl -sSL ht...
    99+
    2023-06-14
  • Redis | 第11章 服务器的复制《Redis设计与实现》
    目录前言1. 旧版复制功能的实现1.1 同步与命令传播1.2 旧版复制功能的缺陷2. 新版复制功能的实现2.1 部分重同步的实现原理3. PSYNC 命令的实现4. 复制的详细步骤4.1 设置主服务器的地址和端口4.2 建立套接字连接4....
    99+
    2020-11-24
    Redis | 第11章 服务器的复制《Redis设计与实现》
  • Redis实现主从复制的方法是什么
    本篇内容介绍了“Redis实现主从复制的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、Master&Slave是什么?...
    99+
    2023-07-02
  • redis主从复制的实现方法是什么
    本篇内容介绍了“redis主从复制的实现方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 简介这篇文章主要讲述Redis的主从复制...
    99+
    2023-06-05
  • mysql实现主从复制
    Mysql的 Replication 是一个异步的复制过程(mysql5.1.7以上版本分为异步复制和半同步两种模式),从一个 Mysql instace(我们称之为 Master)复制到另一个 ...
    99+
    2022-10-18
  • 《Redis设计与实现》
    由浅到深,逐步讲解Redis 本书主要分为四大部分。 第一部分"数据结构与对象": 介绍了Redis中的各种对象及其数据结构,并说明这些数据结构如何影响对象的功能和性能。 第二部分"单机数据库的实现": 对Redis实现单机数据库的方法进...
    99+
    2020-06-17
    《Redis设计与实现》
  • PHP实现Redis数据库主从复制的方法
    近年来随着Web应用的快速发展,数据库的处理量也越来越大,性能的要求也越来越高,所以分布式数据库的需求也日渐增加。而Redis是一种流行的NoSQL数据库,支持多种分布式方案,其中主从复制是一种常用且实现起来比较简单的分布式方案。本文将介绍...
    99+
    2023-05-15
    PHP redis 主从复制
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作