Redis:主从同步
Redis:主从同步
- 一. 概述
- 二. 原理
- (1) 全量同步
- (2) 增量同步
- (3) 优化Redis主从集群
- 三. 总结
一. 概述
引入:
Redis主从集群采用一个Master负责写,多个Slave负责读的方式(读多写少),那么如何让读取数据时多个从节点的数据都一样? ----将Master数据同步到每个Slave,即主从同步;
定义:
主从同步,是指将一台Redis服务器的数据,复制到其他的Redis服务器。
数据的复制是单向的,只能由主节点到从节点。
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。(redis有主从同步,从从同步)。
二. 原理
(1) 全量同步
触发时间:①第一次建立连接 ②增量同步失败
流程:
- 当slave和master建立连接后,slave发起psync同步请求,带上replid和offset;
master会根据slave的replid来判断slave是不是第一次同步,ID和自己不一样则是第一次,则将master的replid发给slave,slave记录replid作为自己的id; - ①master执行
bgsave,将内存数据写入RDB文件,并将RDB发送给slave;slave会清空本地数据,加载RDB文件到【内存】中;
②当master异步写RDB文件期间,会记录主进程的操作到repl_baklog缓冲区中;
(此时RDB文件+缓冲区的命令即=master上的完整数据) - 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数据会落后,此时就是做增量同步;
流程:
- slave重启,重启完后发送给psync请求同步并带上replid和offset,
由于不是第一次发起请求,此时slave的replid和master一致,master不用再给slave发送id,而是回复continue; - master不再RDB,因为slave已经拷贝过了,slave宕机期间丢失的部分记录在repl_baklog缓冲区,而slave的offest就是之前读取到的位置,所以将缓存中slave的offset往后的命令发往slave;
- slave执行master传过来的命令,就可以补上错过的命令,此时数据保持了一致;

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

什么时候增量同步失败?
缓冲区是一个数组,大小有限,当slave断开时间太长,和master的差距超过了缓冲区,导致尚未备份的数据被新命令覆盖,则此时无法基于缓冲区做增量同步,只能做全量同步了;
(3) 优化Redis主从集群
提高全量同步的性能:
- 在master中配置
无磁盘复制,避免全量同步时的磁盘IO;不使用RDB文件,即内存数据的IO流直接写到网络中,而不是先写到RDB磁盘文件,减少了一次拷贝到磁盘的过程,提高性能;(网络比较快时) - 控制Redis单节点内存上限,这样就能控制RDB文件的大小,从而减少磁盘IO;
减少全量同步:
- 提高repl_baklog缓冲区的大小,这样slave落后于master的数据就多一点,一定程度避免由于由于增量同步失效导致的全量同步;
其他:
- 主从链式结构,限制一个master上的slave节点数量,减轻master的压力;

三. 总结
1.全量同步与增量同步的区别?
全量同步master需要将内存数据写入 RDB 文件,再将RDB文件传给slave,后序命令记录在缓冲区;
增量同步时master不需要写RDB文件,只需要将缓冲区中slave的offset之后的命令传给slave;
2.什么时候执行全量同步?
①slave第一次连接master时;
②slave宕机时间太长,导致salve的offset在缓冲区被新的命令覆盖;
3.什么时候执行增量同步?
slave重启时;
相关文章:
Redis:主从同步
Redis:主从同步一. 概述二. 原理(1) 全量同步(2) 增量同步(3) 优化Redis主从集群三. 总结一. 概述 引入: Redis主从集群采用一个Master负责写,多个Slave负责读的方式(读多写少),那么如何让读取数据时多个从…...
Unity Animator.Play(stateName, layer, normalizedTime) 播放动画函数用法
原理 接口: public void Play(string stateName, int layer -1, float normalizedTime float.NegativeInfinity);参数含义stateName动画状态机的某个状态名字layer第几层的动画状态机,-1 表示播放第一个状态或者第一个哈希到的状态normalizedTime从s…...
python学习——【第三弹】
前言 上一篇文章 python学习——【第二弹】中学习了python中的运算符内容,这篇文章接着学习python中的流程控制语句。 流程控制指的是代码运行逻辑、分支走向、循环控制,是真正体现我们程序执行顺序的操作。流程控制一般分为顺序执行、条件判断和循环控…...
科技云报道:AI大模型背后,竟是惊人的碳排放
科技云报道原创。 自从ChatGPT这样的大型语言模型在全球引起轰动以来,很少有人注意到,训练和运行大型语言模型正在产生惊人的碳排放量。 虽然OpenAI和谷歌都没有说过他们各自产品的计算成本是多少,但据第三方研究人员分析,ChatG…...
如何根据实际需求选择合适的三维实景建模方式?
随着实景三维中国建设的推进,对三维实景建模的数字化需求大幅增加。由于三维实景建模具有采集速度快、计算精度高等建模优势,引起了各个行业的高度关注。三维实景建模是一种应用数码相机或者激光扫描仪对现有场景进行多角度环视拍摄,然后利用…...
CENTO OS上的网络安全工具(十八)ClickHouse及编程环境部署
这篇其实去年就写好了,孰知就在12月31日那一天打进决赛圈,一躺,二过年,三休假,四加班,居然到了三个月以后,才有机会将它发出来…… 一年也就四个季度不是,实在是光阴荏苒,…...
Java中class文件的格式
常见的class文件格式如下图所示,下面我将对一下格式一一作出解释。 一、magic 该部分主要是对语言类型的规范,只有magic这个部分是CAFEBABE时才能被检测为Java语言,否则则不是。 二、minor version和major version minor version主要表示了…...
C++排序算法
排序算法复习 冒泡排序 链接:https://www.runoob.com/w3cnote/bubble-sort.html 每次循环对比【相邻】两个元素,将最大的元素放到数组最后 void bubbleSort(int* arr, int n){//每次确认一个元素的最终位置,循环n-1次即可确认全部元素的最…...
JAVA后端部署项目三步走
1. JAVA部署项目三步走 1.1 查看 运行的端口 lsof -i:8804 (8804 为端口) 发现端口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 分布式场景应用比较广泛,redis分布式锁,其实需要自己不断去尝试获取锁,比较消耗性能;zk分布式锁,获取不到锁,注册个监听器即可,不需要不…...
力扣-可回收且低脂的产品
大家好,我是空空star,本篇带大家了解一道超级超级超级简单的力扣sql练习题。 文章目录前言一、题目:1757. 可回收且低脂的产品二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交S…...
代码随想录刷题-数组-二分查找
文章目录写在前面原理习题题目1思路和代码题目-2写在前面 这个专栏是记录我刷代码随想录过程中的随想和总结。每一小节都是根据自己的理解撰写的,文章比较短,主要是为了记录和督促自己。刷完一章后,我会再单独整理一篇文章来总结和分享。 本…...
HCIA复习1
HCIA复习 抽象语言---->编码 编码---->二进制 二进制--->电信号 处理电信号 OSI参考模型----OSI/RM 应用层 表示层 会话层 传输层 端口号:0-65535;1-1023是注明端口 网络层 IP地址 数据链路层 物理层 ARP协议 正向ARP---通过IP地址获取目的MAC地…...
Kotlin中的destructuring解构声明
开发中有时只是想分解一个包含多个字段的对象来初始化几个单独的变量。要实现这一点,可以使用Kotlin的解构声明。本文主要了解:“1、如何使用解构声明这种特性 2、底层是如何实现的 3、如何在你自己的类中实现它1、解构声明的使用解构声明&a…...
Kubernetes Pod 水平自动伸缩(HPA)
Pod 自动扩缩容 之前提到过通过手工执行kubectl scale命令和在Dashboard上操作可以实现Pod的扩缩容,但是这样毕竟需要每次去手工操作一次,而且指不定什么时候业务请求量就很大了,所以如果不能做到自动化的去扩缩容的话,这也是一个…...
钉钉、企业微信和飞书向“钱”看
在急剧变革的时候,不管黑猫白猫,要抓到老鼠才算好猫。如今,各互联网企业早已进入降本增效的新阶段。勒紧裤腰带过日子之下,能不能盈利、商业化空间有多大,就成为各个业务极为重要的考核指标。在各业务板块中࿰…...
网上购物网站的设计
技术:Java、JSP等摘要:本文介绍了JSP和JAVA等相关技术,针对网上购物系统的实际需求,设计开发了一个基于JSP的小型电子商务网站也就是网上购物系统,。在设计开发中,采用的是SSH框架(strutsspring…...
【Java学习笔记】8.Java 运算符
Java 运算符 计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。我们可以把运算符分成以下几组: 算术运算符关系运算符位运算符逻辑运算符赋值运算符其他运算符 算术运算符 算术运算符…...
RHCSA-使用命令管理文件(3.6)
硬链接与软链接基本操作: 创建软硬连接的命令:ln 硬链接:ln 源文件(已经存在的文件) 链接文件名(新建) 软连接:ln -s 源文件(已存在的文件) 快捷方式文件名…...
socket聊天室--socket的建立
socket聊天室–socket实现 文章目录 socket聊天室--socket实现socket()bind()listen()accept()connect()发送接收read()函数recv()函数write()函数send()函数close()关闭套接字IP 地址格式转换函数socket() #include <sys/types...
别只改.prettierrc了!从Git配置到CI/CD,一劳永逸解决团队换行符冲突
从Git配置到CI/CD:彻底解决团队协作中的换行符冲突 跨平台协作开发时,换行符问题就像鞋里的一粒沙子——看似微不足道,却能让整个团队步履维艰。当Windows的CRLF遇上Unix的LF,不仅会导致Prettier报出恼人的Delete ␍错误ÿ…...
微信小程序自动化测试:自定义测试(Minium)
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快录制回放支持输入,文本查找,断言等自动化测试基础操作,无需编写代码,用例生成效率高,但是部分操作不支持…...
AirNgin ESP32 MQTT客户端:面向工业IoT的平台化固件库
1. 项目概述AirNgin ESP32 MQTT Client 是一款专为 ESP32 平台设计的 Arduino 兼容库,面向伊朗本土 IoT 平台 AirNgin 构建。该库并非通用 MQTT 封装,而是深度集成 AirNgin 云平台特有协议栈与管理逻辑的生产级固件组件。其核心价值在于将设备接入、状态…...
【SLAM实战解析】卡方检验在ORB-SLAM2外点剔除中的关键作用
1. 卡方检验在SLAM中的核心价值 第一次在ORB-SLAM2的代码里看到卡方检验时,我盯着那行chi2测试代码愣了半天。这个在统计学课本里见过的概念,怎么突然出现在视觉SLAM系统中?后来才发现,这简直是SLAM开发者处理异常值的"瑞士军…...
零基础玩转Qwen2.5-7B-Instruct:Streamlit可视化界面一键启动
零基础玩转Qwen2.5-7B-Instruct:Streamlit可视化界面一键启动 1. 项目概览 Qwen2.5-7B-Instruct是阿里通义千问推出的旗舰级大语言模型,拥有70亿参数规模,在逻辑推理、长文本创作、代码生成等专业场景展现出远超轻量模型的性能。本项目基于…...
解决跨平台资源下载难题:res-downloader高效资源获取工具全解析
解决跨平台资源下载难题:res-downloader高效资源获取工具全解析 【免费下载链接】res-downloader 资源下载器、网络资源嗅探,支持微信视频号下载、网页抖音无水印下载、网页快手无水印视频下载、酷狗音乐下载等网络资源拦截下载! 项目地址: https://gi…...
cronos:嵌入式C++17零依赖chrono时间抽象库
1. 项目概述cronos是一个轻量级、零依赖的 C17 头文件库,其核心目标是为嵌入式系统提供std::chrono兼容的、与硬件原生滴答计数器(native tick counter)无缝对接的时间抽象层。它并非实现一个独立的定时器驱动,而是作为“适配器”…...
Kubernetes与Istio服务网格最佳实践
Kubernetes与Istio服务网格最佳实践 1. Istio服务网格核心概念 1.1 什么是服务网格 服务网格是一种专门用于处理服务间通信的基础设施层,它负责在现代云原生应用的复杂服务拓扑中可靠地传递请求。 1.2 Istio架构组件 控制平面:包含Pilot、Galley、Citade…...
SigmaStar SSD21X系列芯片:智能家居与工业控制的多场景显示解决方案
1. SigmaStar SSD21X系列芯片:智能家居与工业控制的显示利器 第一次接触SigmaStar SSD21X系列芯片是在一个智能门锁项目上。当时客户要求低成本实现高清彩色触控屏,还要支持人脸识别和远程控制。测试了几款方案后,SSD210的表现让我印象深刻—…...
从零开始玩转Arduino:手把手教你用MOS管和继电器控制大电流设备(附电路图)
从零开始玩转Arduino:手把手教你用MOS管和继电器控制大电流设备(附电路图) 当你第一次尝试用Arduino控制大功率设备时,可能会遇到一个常见问题:小小的开发板输出引脚根本无法直接驱动电机、灯带或加热管。这时候&#…...
