Redis 主从架构数据同步

news/2024/4/29 20:40:34/文章来源:https://blog.csdn.net/qq_41956014/article/details/127610511

Redis 主从架构图


  • 主从架构能够很大提升并发能力,master 节点负责写数据,slave 节点负责读数据,这样就涉及到 master 和 slave 数据同步的一个过程
  • 一起来看一下数据是如何同步的吧
    • redis 的主从同步机制可以确保 master 和 slave 之间的数据同步
    • redis 在 2.8 及以上版本使用 psync 命令完成主从数据同步
    • 同步方式:全量复制、增量复制

数据同步详细流程

全量同步


  • slave 第一次启动时,连接 master,发送 psync 命令,格式为 psync {runId} {offset}
    • {runId} 为 master 的运行ID,{offset} 为 slave 自己的复制偏移量
    • slave 第一次连接 master 时,slave 并不知道 master 的 runId,也不知道自己偏移量,这时候 slave 会传一个问号和 -1,告诉 master 节点是第一次同步,格式为 psync ? -1
  • 当 master 接收到 psync ? -1 时,知道 slave 是要全量复制,就会将自己的 runId 和 offset 告知 slave,回复命令 fullresync {runId} {offset},同时 master 会执行 bgsave 命令来生成 rdb 文件,期间的所有写命令将被写入缓冲区
    • slave 接受到 master 的回复命令后,会保存 master 的 runId 和 offset,slave 此时处于同步状态
    • slave 处于同步状态,如果此时收到请求,当配置参数 slave-server-stale-data yes 时,会响应当前请求,slave-server-stale-data no,返回错误
  • master bgsave 执行完毕,向 slave 发送 rdb 文件,rdb 文件发送完毕后,开始向 slave 发送缓冲区中的写命令
  • slave 收到 rdb 文件,丢弃所有旧数据,开始载入 rdb 文件
  • rdb 文件同步结束之后,slave 执行从 master 缓冲区发送过来的所以写命令
  • 此后 master 每执行一个写命令,就向 slave 发送相同的写命令

增量同步

  • 如果出现网络闪断或者命令丢失等异常情况时,当主从连接恢复后,由于从节点之前保存了自身己复制的
    偏移量和主节点的运行ID。因此会把它们当作 psync 参数发送给主节点,要求进行部分复制操作,格式为 psync {runId} {offset}

  • 主节点接到 psync 命令后首先核对参数 runld 是否与自身一致,如果一致, 说明之前复制的是当前主节点,之后根据参数 offset 在自身复制积压缓冲区查找,如果偏移量之后的数据存在缓冲区中,则对从节点发送 +continue 响应,表示可以进行部分复制,否则进行全量复制

  • 主节点根据偏移量把复制积压缓冲区里的数据发送给从节点,保证主从复制进入正常状态


数据同步问题

同步超时问题

  • redis.conf 中的默认配置 repl-timeout 60,默认超时时间 60 秒
  • 假设网卡带宽理论峰值大约每秒传输 100MB,在不考虑其他进程消耗带宽的情况下,6GB 的 RDB 文件至少需要 60 秒传输时间,默认配置下,很容易出现数据同步超时

积压缓冲区拷贝溢出

  • slave 节点从开始接收 RDB 文件到接收完成期间,主节点仍然响应读写命令,因此主节点会把这期间写入命令保存在复制积压缓冲区内,当从节点加载完 RDB 文件后,主节点再把缓冲区内的数据发送给从节点,保证主从之间数据一致性
  • 如果主节点创建和传输 RDB 的时间过长,对于高流量写入场景非常容易造成主节点复制客户端缓冲区溢出,默认配置为 client-output-buffer-limit slave 256MB 64MB 60,如果 60 秒内缓冲区消耗持续大于 64MB 或者直接超过 256MB 时,主节点将直接关闭复制客户端连接,造成全量同步失败
  • 运维人员需要根据主节点数据量和写命令并发量调整 client-output-buffer-limit slave 配置,避免全量复制期间客户端缓冲区溢出;对于主节点,当发送完所有的数据后就认为全量复制完成,打印成功日志:synchronization with slave127.0.0.1:6380 succeeded

slave全量同步的响应问题

  • slave 节点接收完主节点传送来的全部数据后会清空自身旧数据,执行 flash old data,然后加载 rdb 文件,对于较大的 rdb 文件,这一步操作依然比较耗时
  • 对于线上做读写分离的场景,从节点也负责响应读命令,如果 slave 节点正出于全量复制阶段,那么 slave 节点在响应读命令可能拿到过期或错误的数据
  • 对于这种场景,redis 复制提供了slave-server-stale-data yes 参数(默认开启),如果开启则 slave 节点依然响应所有命令
  • 对于无法容忍不一致的应用场景可以设置no 来关闭命令执行,此时从节点除了 info 和 slaveof 命令之外所有的命令只返回 sync with master in progress 信息

数据被清空问题

  • 采用主从架构,建议开启 master 的持久化,不建议用 slave 节点作为 master 的数据备份,假设关掉 master 的持久化,可能在 master 宕机重启的时候数据是空的,然后可能一经过复制, slave 的数据也丢了
  • master 节点的备份文件需要各种备份,假设 master 本地的备份文件丢失、宕机, sentinel 还没检测到 master failure,master node 就自动重启,还是可能导致上面所有的 slave node 数据被清空

主从节点通讯

  • 主从节点互相都会发送 heartbeat 信息
  • master 默认每隔 10 秒发送一次 heartbeat,slave node 每隔 1 秒发送一个 heartbeat

名词阐述

  • 节点运行ID
    • 每个 redis 节点启动后,都会动态分配一个 40 位的十六进制字符串作为 运行id,即 {runId},runId 主要用来唯一识别 redis 节点,比如从节点保存主节点的 runId 识别自己正在复制的是哪个主节点
    • 如果只使用 ip + port 的方式识别主节点,那么主节点重启变更了,整体数据集(如替换rdb、aof文件),从节点再基于偏移量复制数据将是不安全的,因此当 runId 变化后从节点将做全量复制
    • 可以运行 info server 命令查看当前节点的 runId
  • 偏移量拷贝
    • 参与复制的主从节点都会维护自身复制偏移量,即 {offset}。
    • 主节点(master) 在处理完写入命令后,会把命令的字节长度做累加记录,统计信息在 info relication中的 master_repl_offset 指标中
    • 从节点(slave) 在接收到主节点发送的命令后,也会累加记录自身的偏移量,统计信息在 info relication 命令的 slave_repl_offset 指标中
    • 从节点(slave) 每秒钟上报自身的复制偏移量给主节点,因此主节点也会保存从节点的复制偏移量
  • 积压缓存区拷贝
    • 存在于主节点(master),默认大小为 1MB,可以通过参数 rel_backlog_size 来修改默认大小
    • 复制积压缓冲区是保存在主节点上的一个固定长度的队列,当从节点(slave) 连接主节点时被创建,这时主节点(master)响应写命令时,不但会把命令发送给从节点,还会写入复制积压缓冲区

参考地址
  • https://redis.io/docs/manual/replication/#partial-sync-after-restarts-and-failovers
  • https://blog.csdn.net/iflink/article/details/122389644

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes 架构介绍

目录 一、Kubernetes 架构 1、Kubernetes 是什么? 2、Kubernetes 架构 3、Master 节点 4、Node 节点 5、推荐Add-ons 6、Kubeadm 7、查看组件运行状态 8、Kubeadm 容器化组件 二、namespace 1、命名空间 — namespace 2、常用命名空间命令 1. 查看存在哪…

【操作系统】混合索引分配和链接分配相关练习题

混合索引分配练习题: 比较简单,容易理解 练习1: 在UNIX操作系统中,给文件分配外存空间采用的是混合索引分配方式,如下图所示。UNIX系统中的某个文件的索引结点指示出了为该文件分配的外存的物理块的寻找方法。在该索…

C++ 并行编程

C 并行编程1. 进程和线程1.1 常规解释1.2 总结1.3 具体理解1.4 为什么使用多线程1.5 进程和线程的区别2. 并发与并行2.1 多进程并发2.2 多线程并发3. C中的多线程4. 时间管理4.1 C语言:time.h4.2 C11时间标准库:std::chrono4.2.1 获取时间段 int64_t/dou…

SQL学习十九、使用游标

游标(cursor)是一个存储在 DBMS 服务器上的数据库查询, 它不是一条 SELECT 语句,而是被该语句检索出来的结果集。在存储了 游标之后,应用程序可以根据需要滚动或浏览其中的数据。 我们通常的检索操作会返回一组称为结…

vue3+antd中使用Dayjs实现输出的日期格式化,和限制自定义日期选择器的可选范围

场景复现 在vue3antd项目中用到了日期选择器,但是默认的日期选择的结果是标准的日期格式,我们往往需要对最后的结果进行一定的格式化输出 一般输出的是这种标准的数据格式 如果我们想对时间进行指定的格式化输出,通常大家会想到moment&…

如何在页面中制作悬浮发布按钮弹窗

效果展示: 前置准备: 1.已搭建好,待添加悬浮层的页面 2.icon素材 具体步骤:(3) 1.添加悬浮层页面 2.配置悬浮层关闭触发器 3.配置首页发布icon触发器和动画 步骤分解: 1.添加悬浮层页面 1.1…

2022 年跨境电商要尝试的 25 个黑五营销技巧

关键词:黑五营销、黑色星期五活动、跨境电商黑五 我们汇总了以下最佳跨境电商黑五创意清单: 黑五营销技巧分享 如何宣传您的黑色星期五优惠 小型企业的黑五营销创意 黑五营销提示 随意跳到您最感兴趣的部分,或通读它们,看看…

JAVA序列化和反序列化学习笔记

0x01 开始学习JAVA反序列化,参考 《安全漫谈》和feng师傅的文章一步一步来,希望 能赶在这个学期学完java最基础的东西, 笔记做到这里方便自己查阅,也是事先实操了一下 ,才写的笔记 概念: JAVA 序列化 就是…

program arguments,vm arguments,environment variable

作者:david_zhang@sh 【转载时请以超链接形式标明文章】 https://www.cnblogs.com/david-zhang-index/p/16846493.html 参数太多,傻傻分不清楚,简单说 1,program arguments是main函数args[]参数 2,vm arguments是java环境变量 3,environment variable是jvm环境变量 看代码…

华为设备配置NAT原理与示例

网络地址转换NAT 文章目录网络地址转换NAT1 NAT概述1.1 NAT产生的技术背景1.2 私有IP地址1.3 NAT技术原理2 静态NAT2.1 静态NAT原理2.2 静态NAT转换示例2.3 静态NAT配置介绍2.4 静态NAT配置示例3 动态NAT3.1 动态NAT原理3.2 动态NAT转换示例3.3 动态NAT配置介绍3.4 动态NAT配置…

resultMap结果映射

文章目录一、resulrMap结果映射二、驼峰命名自动映射查询结果的列名和Java对象的属性名对应不上怎么办? *第一种方式:as给列名起别名 *第二种方式:使用resultMap进行结果映射 *第三种方式:是否开启驼峰命名自动映射(配…

算法学习:动态规划

14天阅读挑战赛 努力是为了不平庸~ 系列文章目录 第一章 算法简介 第二章 贪心算法 第三章 分治法 第四章 动态规划 目录系列文章目录2.0兔子序列2.1动态规划基础2.2最长的公共子序列2.2.1问题描述:2.2.2分析问题&设计思路:2.2.3图解思路&#xff1…

Python抓取我的CSDN粉丝数,白嫖GithubAction自动抓取

《Python抓取我的CSDN粉丝数,白嫖GithubAction自动抓取》 一.介绍 这段时间我想申请CSDN的博客专家认证,但是我发现我的总访问量不够(博客专家的总访问量要大于20万),所以我就想把我的CSDN每天的 【总访问量】&#…

芯片与自动驾驶技术漫谈

芯片与自动驾驶技术漫谈 从芯片到系统国产,信创产业如何4步走上自主路? 信创产业发展是国家经济数字化转型、提升产业链发展的关键。我国明确了“数字中国”建设战略,抢占数字经济产业链制高点。推进信创产业的发展,促进信创产业在区域性落地生根,带动传统IT信息产业转型,…

【光通信】常见光模块与光纤收发器说明及作用区别

:单纤收发器是指采用的是单模光缆 单纤收发器是只用一根芯,两端都接这根芯,两端的收发器采用不同的光波长,所以能在一根芯里传输光信号。 双纤收发器就是采用了两根芯,一根发送一根接收,一端是发的另一端就…

MongoDB 分片集群均衡器导致的性能下降

近期,有人反馈其mongodb分片集群,在加载处理大批量数据时,程序处理十分缓慢并且应用还会报错:version mismatch detected for 。现将分析汇总如下备用。 一、问题现象 负责同事反馈9月1日18:52分左右,应用报错version…

计算机毕业设计(附源码)python医院预约挂号管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

学习笔记-php伪协议

伪协议 相关文章 & Source & Reference PHP伪协议的妙用 filter协议 php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents()&#x…

网课查题系统搭建-查题校园题库

网课查题系统搭建-查题校园题库 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台&…

【C++笔记】第十九篇 多态

C的多态 1. 多态简介 ① 多态是C面向对象三大特性之一。 ② 多态分为两类: 静态多态:函数重载和运算符重载属于静态多态,复用函数名。动态多态:派生类和虚函数实现运行时多态。 ③ 静态多态和动态多态区别: 静态…