当前位置: 首页 > news >正文

Redis:主从同步

Redis:主从同步

  • 一. 概述
  • 二. 原理
    • (1) 全量同步
    • (2) 增量同步
    • (3) 优化Redis主从集群
  • 三. 总结

一. 概述

引入
Redis主从集群采用一个Master负责写,多个Slave负责读的方式(读多写少),那么如何让读取数据时多个从节点的数据都一样? ----将Master数据同步到每个Slave,即主从同步;

定义
主从同步,是指将一台Redis服务器的数据,复制到其他的Redis服务器。
数据的复制是单向的,只能由主节点到从节点。
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。(redis有主从同步,从从同步)。

二. 原理

(1) 全量同步

触发时间:①第一次建立连接 ②增量同步失败

流程

  1. 当slave和master建立连接后,slave发起psync同步请求,带上replid和offset;
    master会根据slave的replid来判断slave是不是第一次同步,ID和自己不一样则是第一次,则将master的replid发给slave,slave记录replid作为自己的id;
  2. ①master执行bgsave,将内存数据写入RDB文件,并将RDB发送给slave;slave会清空本地数据,加载RDB文件到【内存】中;
    ②当master异步写RDB文件期间,会记录主进程的操作到repl_baklog缓冲区中;
    (此时RDB文件+缓冲区的命令即=master上的完整数据)
  3. master将缓冲区的新命令发送给slave,slave拿到命令后会执行命令,保证slave和master的数据一致;
    后序新的命令都写到缓冲区,再发送到slave,以次实现主从同步;
    在这里插入图片描述

Replication ID
简称replid,是数据集的标记,id一致则说明是同一数据集。每个master都有唯一一个replid,slave则会继承master节点的replid;

offset偏移量
随着master记录在【repl_baklog缓冲区】中的数据增多而逐渐增大。 slave完成同步时也会记录当前的offset;
如果slave的offset小于master的offset,说明slave落后于master,需要更新;(slave的offset<=master的offset)

所以slave做同步时,必须向master声明自己的Replication ID和offset,master就可以通过ID来判断slave是不是从当前master同步的;以及从offset判断数据同步的进度;

如何判断slave是不是第一次做数据同步?
Replication ID不一样则是slave第一次请求同步!
而后slave的Replication ID就变成了当前master的Replication ID;master根据slave的 offset ?大小来做增量同步;

(2) 增量同步

触发时间:在slave重启过程中,master会持续接收数据,则slave数据会落后,此时就是做增量同步;

流程

  1. slave重启,重启完后发送给psync请求同步并带上replid和offset,
    由于不是第一次发起请求,此时slave的replid和master一致,master不用再给slave发送id,而是回复continue;
  2. master不再RDB,因为slave已经拷贝过了,slave宕机期间丢失的部分记录在repl_baklog缓冲区,而slave的offest就是之前读取到的位置,所以将缓存中slave的offset往后的命令发往slave;
  3. slave执行master传过来的命令,就可以补上错过的命令,此时数据保持了一致;
    在这里插入图片描述

repl_baklog缓冲区
本质是一个成环的数组,当数组满了(slave落后master的数据超过了缓冲区容量),则会用master新命令覆盖旧的命令;
只要slave和master的数据差距在一个环内,就可以将slave落后于master的部分找到并发给slave;
当slave和master差距超过了一个环,则无法做增量同步了;
在这里插入图片描述

什么时候增量同步失败?
缓冲区是一个数组,大小有限,当slave断开时间太长,和master的差距超过了缓冲区,导致尚未备份的数据被新命令覆盖,则此时无法基于缓冲区做增量同步,只能做全量同步了;

(3) 优化Redis主从集群

提高全量同步的性能:

  1. 在master中配置无磁盘复制,避免全量同步时的磁盘IO;不使用RDB文件,即内存数据的IO流直接写到网络中,而不是先写到RDB磁盘文件,减少了一次拷贝到磁盘的过程,提高性能;(网络比较快时)
  2. 控制Redis单节点内存上限,这样就能控制RDB文件的大小,从而减少磁盘IO;

减少全量同步:

  1. 提高repl_baklog缓冲区的大小,这样slave落后于master的数据就多一点,一定程度避免由于由于增量同步失效导致的全量同步;

其他:

  1. 主从链式结构,限制一个master上的slave节点数量,减轻master的压力;
    在这里插入图片描述

三. 总结

1.全量同步与增量同步的区别?
全量同步master需要将内存数据写入 RDB 文件,再将RDB文件传给slave,后序命令记录在缓冲区;
增量同步时master不需要写RDB文件,只需要将缓冲区中slave的offset之后的命令传给slave;

2.什么时候执行全量同步?
①slave第一次连接master时;
②slave宕机时间太长,导致salve的offset在缓冲区被新的命令覆盖;

3.什么时候执行增量同步?
slave重启时;

相关文章:

Redis:主从同步

Redis&#xff1a;主从同步一. 概述二. 原理(1) 全量同步(2) 增量同步(3) 优化Redis主从集群三. 总结一. 概述 引入&#xff1a; Redis主从集群采用一个Master负责写&#xff0c;多个Slave负责读的方式&#xff08;读多写少&#xff09;&#xff0c;那么如何让读取数据时多个从…...

Unity Animator.Play(stateName, layer, normalizedTime) 播放动画函数用法

原理 接口&#xff1a; public void Play(string stateName, int layer -1, float normalizedTime float.NegativeInfinity);参数含义stateName动画状态机的某个状态名字layer第几层的动画状态机&#xff0c;-1 表示播放第一个状态或者第一个哈希到的状态normalizedTime从s…...

python学习——【第三弹】

前言 上一篇文章 python学习——【第二弹】中学习了python中的运算符内容&#xff0c;这篇文章接着学习python中的流程控制语句。 流程控制指的是代码运行逻辑、分支走向、循环控制&#xff0c;是真正体现我们程序执行顺序的操作。流程控制一般分为顺序执行、条件判断和循环控…...

科技云报道:AI大模型背后,竟是惊人的碳排放

科技云报道原创。 自从ChatGPT这样的大型语言模型在全球引起轰动以来&#xff0c;很少有人注意到&#xff0c;训练和运行大型语言模型正在产生惊人的碳排放量。 虽然OpenAI和谷歌都没有说过他们各自产品的计算成本是多少&#xff0c;但据第三方研究人员分析&#xff0c;ChatG…...

如何根据实际需求选择合适的三维实景建模方式?

随着实景三维中国建设的推进&#xff0c;对三维实景建模的数字化需求大幅增加。由于三维实景建模具有采集速度快、计算精度高等建模优势&#xff0c;引起了各个行业的高度关注。三维实景建模是一种应用数码相机或者激光扫描仪对现有场景进行多角度环视拍摄&#xff0c;然后利用…...

CENTO OS上的网络安全工具(十八)ClickHouse及编程环境部署

这篇其实去年就写好了&#xff0c;孰知就在12月31日那一天打进决赛圈&#xff0c;一躺&#xff0c;二过年&#xff0c;三休假&#xff0c;四加班&#xff0c;居然到了三个月以后&#xff0c;才有机会将它发出来…… 一年也就四个季度不是&#xff0c;实在是光阴荏苒&#xff0c…...

Java中class文件的格式

常见的class文件格式如下图所示&#xff0c;下面我将对一下格式一一作出解释。 一、magic 该部分主要是对语言类型的规范&#xff0c;只有magic这个部分是CAFEBABE时才能被检测为Java语言&#xff0c;否则则不是。 二、minor version和major version minor version主要表示了…...

C++排序算法

排序算法复习 冒泡排序 链接&#xff1a;https://www.runoob.com/w3cnote/bubble-sort.html 每次循环对比【相邻】两个元素&#xff0c;将最大的元素放到数组最后 void bubbleSort(int* arr, int n){//每次确认一个元素的最终位置&#xff0c;循环n-1次即可确认全部元素的最…...

JAVA后端部署项目三步走

1. JAVA部署项目三步走 1.1 查看 运行的端口 lsof -i:8804 &#xff08;8804 为端口&#xff09; 发现端口25111被监听 1.2 杀死进程,终止程序 pid 为进程号 kill -9 pid 1.3 后台运行jar包 nohup java -jar -Xms128M -Xmx256M -XX:MetaspaceSize128M -XX:MaxM…...

php使用zookeeper实现分布式锁

介绍 一、zookeeper和redis实现分布式锁的对比 1、redis 分布式场景应用比较广泛&#xff0c;redis分布式锁&#xff0c;其实需要自己不断去尝试获取锁&#xff0c;比较消耗性能&#xff1b;zk分布式锁&#xff0c;获取不到锁&#xff0c;注册个监听器即可&#xff0c;不需要不…...

力扣-可回收且低脂的产品

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道超级超级超级简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;1757. 可回收且低脂的产品二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交S…...

代码随想录刷题-数组-二分查找

文章目录写在前面原理习题题目1思路和代码题目-2写在前面 这个专栏是记录我刷代码随想录过程中的随想和总结。每一小节都是根据自己的理解撰写的&#xff0c;文章比较短&#xff0c;主要是为了记录和督促自己。刷完一章后&#xff0c;我会再单独整理一篇文章来总结和分享。 本…...

HCIA复习1

HCIA复习 抽象语言---->编码 编码---->二进制 二进制--->电信号 处理电信号 OSI参考模型----OSI/RM 应用层 表示层 会话层 传输层 端口号&#xff1a;0-65535&#xff1b;1-1023是注明端口 网络层 IP地址 数据链路层 物理层 ARP协议 正向ARP---通过IP地址获取目的MAC地…...

Kotlin中的destructuring解构声明

开发中有时只是想分解一个包含多个字段的对象来初始化几个单独的变量。要实现这一点&#xff0c;可以使用Kotlin的解构声明。本文主要了解&#xff1a;“1、如何使用解构声明这种特性 2、底层是如何实现的 3、如何在你自己的类中实现它1、解构声明的使用解构声明&a…...

Kubernetes Pod 水平自动伸缩(HPA)

Pod 自动扩缩容 之前提到过通过手工执行kubectl scale命令和在Dashboard上操作可以实现Pod的扩缩容&#xff0c;但是这样毕竟需要每次去手工操作一次&#xff0c;而且指不定什么时候业务请求量就很大了&#xff0c;所以如果不能做到自动化的去扩缩容的话&#xff0c;这也是一个…...

钉钉、企业微信和飞书向“钱”看

在急剧变革的时候&#xff0c;不管黑猫白猫&#xff0c;要抓到老鼠才算好猫。如今&#xff0c;各互联网企业早已进入降本增效的新阶段。勒紧裤腰带过日子之下&#xff0c;能不能盈利、商业化空间有多大&#xff0c;就成为各个业务极为重要的考核指标。在各业务板块中&#xff0…...

网上购物网站的设计

技术&#xff1a;Java、JSP等摘要&#xff1a;本文介绍了JSP和JAVA等相关技术&#xff0c;针对网上购物系统的实际需求&#xff0c;设计开发了一个基于JSP的小型电子商务网站也就是网上购物系统&#xff0c;。在设计开发中&#xff0c;采用的是SSH框架&#xff08;strutsspring…...

【Java学习笔记】8.Java 运算符

Java 运算符 计算机的最基本用途之一就是执行数学运算&#xff0c;作为一门计算机语言&#xff0c;Java也提供了一套丰富的运算符来操纵变量。我们可以把运算符分成以下几组&#xff1a; 算术运算符关系运算符位运算符逻辑运算符赋值运算符其他运算符 算术运算符 算术运算符…...

RHCSA-使用命令管理文件(3.6)

硬链接与软链接基本操作&#xff1a; 创建软硬连接的命令&#xff1a;ln 硬链接&#xff1a;ln 源文件&#xff08;已经存在的文件&#xff09; 链接文件名&#xff08;新建&#xff09; 软连接&#xff1a;ln -s 源文件&#xff08;已存在的文件&#xff09; 快捷方式文件名…...

socket聊天室--socket的建立

socket聊天室–socket实现 文章目录 socket聊天室--socket实现socket()bind()listen()accept()connect()发送接收read()函数recv()函数write()函数send()函数close()关闭套接字IP 地址格式转换函数socket() #include <sys/types...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

21-Oracle 23 ai-Automatic SQL Plan Management(SPM)

小伙伴们&#xff0c;有没有迁移数据库完毕后或是突然某一天在同一个实例上同样的SQL&#xff0c; 性能不一样了、业务反馈卡顿、业务超时等各种匪夷所思的现状。 于是SPM定位开始&#xff0c;OCM考试中SPM必考。 其他的AWR、ASH、SQLHC、SQLT、SQL profile等换作下一个话题…...

EC2安装WebRTC sdk-c环境、构建、编译

1、登录新的ec2实例&#xff0c;证书可以跟之前的实例用一个&#xff1a; ssh -v -i ~/Documents/cert/qa.pem ec2-user70.xxx.165.xxx 2、按照sdk-c demo中readme的描述开始安装环境&#xff1a; https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c 2…...

2025年渗透测试面试题总结-腾讯[实习]安全研究员(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]安全研究员 1. 自我介绍 2. SQL二次注入原理 3. 二次注入修复方案 4. SQL注入绕WAF&#xff…...

跨域请求解决方案全解析

跨域请求可以通过多种技术方案实现&#xff0c;核心是绕过浏览器的同源策略限制。以下是主流解决方案及具体实现方式&#xff1a; 一、CORS&#xff08;跨域资源共享&#xff09; 最常用的标准化方案&#xff0c;通过服务器设置HTTP响应头实现&#xff1a; Access-Control-Al…...