26 redis 中 replication/cluster 集群中的主从复制

news2024/11/16 16:44:32

前言

我们这里首先来看 redis 这边实现比较复杂的 replication集群模式 

我们这里主要关注的是 redis 这边的主从同步的相关实现

这边相对比较简单, 我们直接基于 cluster集群模式 进行调试

 

 

主从命令同步复制

比如这里 master 是 redis_7002, slave 是 redis_7005

然后 这里是 master 这边直接同步 相关命令到各个 slave 

a19730e124774c85857090955e267bc1.png

 

然后这里是在 server.call:3765 进行命令存储到 backlog, aof, 以及同步发送到 slave 

命令真实执行是在 server.call:3675 的 cmd->proc->proc(c)

418fbbc6622a45fcbacaabe770ce8a0c.png

 

然后 redis_7005 这边拿到命令之后, 开始执行, 这个执行过程就和客户端这边发送执行命令一样 

e696cfc4a7874538a99cdc3dceaf3285.png

 

 

全量同步

整个流程分为两个 part, 一个是请求方, 就是 slave, 一个是提供方, 是 master 

slave 这边连接到 master 之后, slave 发送 SYNC 命令到 master 

master 通知客户端需要全量同步, 然后 master 这边后台去 dump 内存快照文件

slave 这边等待 master 这边 dump 内存快照文件, 并通过网络传递过来 

master 这边 dump 内存快照文件生成之后, 会向 slave 这边进行传输

slave 这边拿到 master 的 dump 的内存快照信息, 将其持久化到 临时文件, 完成之后重命名为 dump.rdb, 然后清空当前数据库, 然后 加载 dump.rdb 文件进行一个快照的数据恢复 

我们这里 一边一边的看, 先看 slave, 再看 master 

 

slave 的处理

这个是 slave 这边启动的时候 就会进行的一个操作

这里 syncWithMaster 根据 server.repl_state 这边同步的处理了几个 slave 和 master 的交互, 分为了几个不同的阶段 REPL_STATE_CONNECT, REPL_STATE_CONNECTING, REPL_STATE_RECEIVE_PING_REPLY, REPL_STATE_SEND_HANDSHAKE 等等 

比如这里会 发送 ping 给 master, 然后等待 master 这边回复信息 

在发送 masterauth 等相关信息, REPLCONF 等相关信息 

940a1e1b87924188a50abcc903662b87.png

 

后面和全量同步相关比较重要的流程就是 发送 SYNC 相关命令 

4a39f9fed3e045e2b222f3c318044dc3.png

 

然后 slave 这边会收到 master 这边的 FULLRESYNC 的通知 

34b74496b62949cda7472938880967fa.png

 

然后就是后面 slave 这边创建临时文件, 然后准备接受 master 这边 后台持久化 rdb 文件之后传递给 slave 这边, 之后的处理交给 readSyncBulkPayload

13b038ad45434cd3ad20a771daccc517.png

 

接受服务器这边传输过来的 rdb 文件的相关信息, 持久化到 上面创建的临时文件 repl_transfer_tmpfile

b0c87aeb46884d6aab1a5b22d8bcd4ed.png

 

然后就是 清空 slave 本地数据库, 然后重命名 临时文件 为 dump.rdb

然后加载 dump.rdb 到 slave 本地数据库 

2b7f847234874d599af93f8000cfbfdd.png

 

触发上面 syncWithMaster 的地方, 从上下文是可以看到是 serverCron 注册了一个定时任务, 100ms 跑一次, 跑的任务是 clusterCron 相关, 里面包含了这里的 connectWithMaster

所以节点的上下线 是可以再 100ms 左右感知到的 

6ead85e84fc64625b0fdd0679f2f5bc7.png

 

客户端这边相关日志如下, 基本上是 syncWithMaster + readSyncBulkPayload 这两部分中输出的 

前面两行是 connectWithMaster 中输出的连接 master 的相关日志 

后面的是 slave 这边向 master 发送 PING, master 进行回复 

后面的是 slave 这边发送 SYNC 指令, 询问是否可以增量同步, master 这边回复 只能全量同步

然后是 slave 这边接收到了 master 的 dump.rdb 的数据信息, 合计210字节, 清空 slave 的数据库, 从 dump.rdb 中加载数据到 slave 的数据库, 最终同步成功 

e6e4e511e17a4d33b9c4d079075d44da.png

 

 

master 的处理

需要全量同步的有几个场景 

场景1 是 slave 未传递同步偏移, 或者偏移传递错误 

场景2 是 master 和 slave 两边的 replyid 对不上 

场景3 是 slave 这边传递的偏移不在 master 这边数据同步的偏移区间内, 偏移错误 或者 落后的太多

c5c9b8775a3444bd9eec5f6bde5487f7.png

 

然后就是 master 这边处理全量同步的大头了 

场景1 如果是已经在进行 dump 内存快照文件, 则等待即可 

场景2 如果是已经在 dump 内存快照, 并且通过 tcp 直接传输数据, 则只能等待操作完成 

场景3 master 可以 dump 内存快照, 或者直接通过 tcp 传输数据, 

af85abbcfcfa45ceb8e0ea54936075f4.png

 

处理如下, 通过 startBgsaveForReplication 进行逻辑上的分发 

是 dump 内存快照文件, 还是 dump内存快照直接通过 tcp 传输数据 

52f259ff5fdc4f738f35bd2887180487.png

 

然后这里就是 fork 出子进程, 让子进程 来 dump 内存快照, 并保存到目标文件 

b8228fd2a58f4d5eaf6e17f268540803.png

 

然后 master 这边有定时任务在定时检查 子进程是否完成, 周期为 1秒 

如果完成了, 则向 slave 这边传输 dump 的内存快照的数据 

917c4dbcf0904cc08b352d0337f836ea.png

 

master 这边日志如下 

slave 这边发送过来了 PSYNC 的请求 

然后 master 这边判断 replyid, replyid2 匹配不上, 然后开始进行 全量同步 

然后 master 开始进行 dump 内存快照, fork 子进程 来生成 dump.rdb

master dump 内存快照生成完成之后, 发送数据到 slave, 之后记录 成功日志

da60fc2fde1b4f83b00c8c124b7f8a1e.png

 

 

基于 backlog 的增量同步

master 这边添加增量命令到 backlog

命令到 server.call:3765 的时候, 会将命令添加到 backlog 队列 

其中存储的数据就是 具体的执行命令, 存储在了一个数据中, 比如这里的 “set name4 jerry17”, 会将其存储为 一个长度为3的数组, 元素分别为 [“set”, “name4”, “jerry17”]

ba04a1534ab046718c620d9d3b0cad42.png

 

具体的复制命令到 backlog 中的相关处理如下, 可以简单理解为一个 memcpy 进去, 然后更新 索引 repl_backlog_idx

a3044b1a017d43da8de3032f1f1d5aca.png

 

 

slave 这边长时间和 master 失联, 重新连接之后发送 PSYNC 增量同步请求

clusterCron 为定时任务, 定时扫描集群的状态, 如果失联了, 则重新建立连接 

同样是在 syncWithMaster 的代码中, 这里传入了 replyid 和 offset 到 master 

0c02133909a24ac9949c51dcf4be9040.png

 

 

master 这边获取增量的命令响应给客户端

比如这里传输了 134 字节的命令数据到客户端, 我们 再来看一下 详细的命令信息

b3fae4214f3e40d9bb2df8f977400e62.png

 

从响应的字符串信息中可以看到, 传输了 “select 0”, “set name4 jerry18”, “set name4 jerry19”, “set name4 jerry20” 四条命令, 其中 “select 0” 是 redis 自己增加的, 然后 其他的几个命令是 客户端这边交互产生的

d264df34188742058d2ec667e97c961a.png

 

 

slave 这边收到命令之后执行

客户端这边接收到这一批次的命令之后, 依次进行执行 “select 0”, “set name4 jerry18”, “set name4 jerry19”, “set name4 jerry20” 进而实现了增量的同步 

f02dc9a1337142dbb429264788559fde.png

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1314986.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

打开软木塞,我们来谈谈葡萄酒泡泡吧

香槟是任何庆祝场合的最佳搭配。从婚礼和生日到单身派对和典型的周五晚上,这款气泡饮料是生活中特别聚会的受欢迎伴侣。 来自云仓酒庄品牌雷盛红酒分享你知道吗,你喜欢喝的那瓶香槟酒可能根本不是香槟,而是汽酒?你不是唯一一个认…

6个超好用的小众图片素材网站,高清、免费,值得收藏~

推荐几个超好用的图片素材网站,免费下载,还可以商用,建议收藏哦~ 1、菜鸟图库 https://www.sucai999.com/pic.html?vNTYwNDUx 我推荐过很多次的设计素材网站,除了设计类素材,还有很多自媒体可以用到的高清图片、背景…

最好的猫粮排行榜前十名有哪些品牌?质量好的主食冻干猫粮分享

为什么越来越多人推荐冻干猫粮喂养呢?主食冻干猫粮究竟是最适应猫饮食习惯的喂养方式还是消费陷阱? 作为一个6年的宠物营养师,我以前接触过很多不同品种的猫咪,一只健康又漂亮的猫咪从表面上就能看出来!体型匀称刚好、…

大模型落地,向量数据库到底能做什么?

▼最近直播超级多,预约保你有收获 今晚直播:《AI编程向量数据库架构设计案例实践》 —1— 大模型的“数据局限性” 数据局限对企业做 LLM 大模型带来的影响,可归结为以下三点: 第一点:对数据的管理和运维。随着文本、…

LeetCode(63)旋转链表【链表】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 旋转链表 1.题目 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 示例 1: 输入:head [1,2,3,4,5], k 2 输出:[4,5,1,2,3]示例 2&…

深入理解LightGBM

1. LightGBM简介 GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。GBDT不仅在工业界应用广泛&#…

python初试二

连接数据库 Django为多种数据库后台提供了统一的调用API。根据需求不同,Django可以选择不同的数据库后台。MySQL算是最常用的数据库。我们这里将Django和MySQL连接。 在Linux终端下启动mysql: $mysql -u root -p 在MySQL中创立Django项目的数据库: …

【数据结构和算法】判断子序列

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一:双指针 三、代码 3.1 方法一:双指针 3.1.1 Java易懂版:…

Cosmopolitan Libc:让 C 语言一次构建、随处运行 | 开源日报 No.109

jart/cosmopolitan Stars: 12.9k License: ISC Cosmopolitan Libc 使 C 成为一种构建一次运行在任何地方的语言,就像 Java 一样,但它不需要解释器或虚拟机。相反,它重新配置了标准 GCC 和 Clang 以输出符合 POSIX 标准的多语言格式&#xff…

VS Code连接远程Linux服务器调试C程序

1.在 VS Code 上安装扩展 C/C 2.通过 VS Code 连接远程 Linux 服务器 3.通过 VS Code 在远程 Linux 服务器上安装扩展 C/C 4.打开远程 Linux 服务器上的文件夹 【注】本文以 /root/ 为例。 5.创建项目文件夹,并在项目文件夹下创建C程序 6.按 F5,选…

数据挖掘任务一般流程

数据挖掘是从大量数据中提取有价值信息的过程。它涉及多个步骤,每一步都对整个数据挖掘过程至关重要。以下是数据挖掘任务的一般流程: 业务理解: 确定业务目标。评估当前情况。定义数据挖掘问题。制定一个初步计划来达到这些目标。 数据理…

JVM的类的生命周期

目录 前言 1. 加载(Loading): 2. 验证(Verification): 3. 准备(Preparation): 4. 解析(Resolution): 5. 初始化(Ini…

解决ES伪慢查询

一、问题现象 服务现象 服务接口的TP99性能降低 ES现象 YGC:耗时极其不正常, 峰值200次,耗时7sFULL GC:不正常,次数为1但是频繁,STW 5s慢查询:存在慢查询5 二 解决过程 1、去除干扰因素 从现象上看应用是由于某种…

从零开始:前端架构师的基础建设和架构设计之路

文章目录 一、引言二、前端架构师的职责三、基础建设四、架构设计思想五、总结《前端架构师:基础建设与架构设计思想》编辑推荐内容简介作者简介目录获取方式 一、引言 在现代软件开发中,前端开发已经成为了一个不可或缺的部分。随着互联网的普及和移动…

算法通关第十九关-青铜挑战理解动态规划

大家好我是苏麟 , 今天聊聊动态规划 . 动态规划是最热门、最重要的算法思想之一,在面试中大量出现,而且题目整体都偏难一些对于大部人来说,最大的问题是不知道动态规划到底是怎么回事。很多人看教程等,都被里面的状态子问题、状态…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑电力-交通交互的配电网故障下电动汽车充电演化特性》

这个标题涉及到电力系统、交通系统和电动汽车充电的复杂主题。让我们逐步解读: 考虑电力-交通交互的配电网故障: 电力-交通交互: 指的是电力系统和交通系统之间相互影响、相互关联的关系。这可能涉及到电力需求对交通流量的影响,反…

windows wsl2 ubuntu上部署 redroid云手机

Redroid WSL2部署文档 下载wsl内核源码 #文档注明 5.15和5.10 版本内核可以部署成功,这里我当前最新的发布版本 #下载wsl 源码 wget --progressbar:force --output-documentlinux-msft-wsl-5.15.133.1.tar.gz https://codeload.github.com/microsoft/WSL2-Linux-Ker…

Nacos配置管理-微服务配置拉取

yaml已配置内容 目录 一、配置获取步骤 二、统一配置管理步骤 三、Nacos管理配置的步骤总结 一、配置获取步骤 二、统一配置管理步骤 1、引入Nacos的配置管理客户端依赖: <!--nacos配置管理依赖--> <dependency> <groupId>com.alibaba.cloud&l…

ABAP与HANA集成:HANA视图转换为ABAP字典视图

使用场景 最近项目在用HANA开发逻辑&#xff0c;形成了很多过程的计算视图&#xff0c;一般我们BW人员可能直接用计算视图出具前端报表&#xff0c;或者链接到cp使用&#xff0c;没有考虑转换成abap字典视图&#xff0c;也就是前台SE11能查到的视图&#xff0c;但是非开发人员…

基于itextpdf的java读取和更新pdf表单域字段值功能

基于itextpdf的java读取和更新pdf表单域字段值功能 执行结果为&#xff1a; Hello World! keytopmostSubform[0].Page1[0].qhjc[0] keytopmostSubform[0].Page1[0].qhmc[0] keytopmostSubform[0].Page1[0].cqzh[0] keytopmostSubform[0].Page1[0].fm_year[0] keytopmostSubf…