Redis 主从同步

主从同步

很多企业没有使用Redis的集群,但是至少都做了主从。有了主从,当master挂掉的时候,运维让从库过来接管,服务就可以继续,否则master需要经过数据恢复和重启的过程,可能会拖很长时间,影响业务持续服务。

CAP原理——现代分布式理论基石

  • C-Consistent,一致性
  • A-Availability,可用性
  • P-Partition tolerance 分区容错性

一句话概括CAP原理:在网络分区发生时,一致性和可用性难两全

分布式系统的节点往往都是分布在不同的机器上进行网络隔离开的,这意味着必然会用网络断开的风险,这个网络断开的场景就叫【网络分区】。

在网络分区发生时,两个分布式节点之间无法进行通信,我们对一个节点进行修改操作无法同步到另一个节点,所以数据的【一致性】将无法满足。因为 两个分布式节点数据不再保持一致,除非我们牺牲【可用性】,也就是暂停分布式节点服务,在网络分区发生时,不再提供修改数据的功能,直到网络状况完全恢复再继续对外提供服务。

BASE理论

BASE理论是分布式系统设计中的另一个重要概念,他的核心是,在分布式环境中,完全一致性往往难以实现,因此可以采用柔性的一致性模型来提高系统的可用性和扩展性

  • 基本可用(Basically Available):系统在分布式环境中可能会出现部分故障,但保证核心功能可用,尽可能避免全面崩溃。

  • 软状态(Soft State):系统的状态不需要时刻保持一致,允许存在中间状态,最终通过异步的方式达到一致性。

  • 最终一致性(Eventually Consistent):系统保证在没有新的更新的情况下,最终所有的复制数据会达到一致的状态。

Redis的最终一致即Base理论

Redis的主从数据是异步同步的,所以分布式的Redis系统并不满足【一致性】要求。当客户端在Redis的主节点修改了数据后,立即返回,即使在主从网络断开的情况下,主节点依旧可以正常对外提供服务,所以Redis满足【可用性】

Redis保证【最终一致性】,从节点会努力追赶主节点,最终从节点的状态会和主节点的状态保持一致。如果网络断开了,主从节点的数据将会出现大量不一致。一旦网络恢复,从节点会采取多种策略努力追赶上落后的数据,继续尽力保持和主节点的一致。

主从同步

Redis同步支持主从同步和从从同步,从从同步是Redis后续版本增加的功能,为了减轻主库的同步负担。
在这里插入图片描述

增量同步

Redis同步的是指令流,主节点会将那些对自己的状态产生修改性影响的指令记录在本地的内存buffer中,然后异步将buffer中的指令同步到从节点,从节点一边执行同步的指令流来达到和主节点一样的状态,一边向主节点反馈自己同步到哪里了(偏移量)

因为内存的buffer是有限的,所以Redis主库不能将所有的指令都记录在内存buffer中。Redis的复制内存buffer是一个定长的环形数组,如果数组内容满了,就会从头开始覆盖前面的内容

如果因为网络状况不好,从节点在短时间内无法和主节点进行同步,那么当网络状况恢复时,Redis的主节点中那些没有同步的指令在buffer中有可能已经被后续的指令覆盖掉了,从节点将无法直接通过指令流来进行同步,这个时候就需要用到更加复杂的同步机制——快照同步。

快照同步

快照同步是一个非常耗费资源的操作,他 1. 首先需要在主库上进行一次bgsave将当前内存的数据全部快照到磁盘文件2.然后再将快照文件的内容全部传送到从节点3. 从节点将快照接收完毕后,立即执行一次全量加载,加载之前先要将当前内存的数据清空。加载完毕后通知主节点继续进行增量同步

在整个快照同步进行的过程中,主节点的复制buffer还在不停的往前移动,如果快照同步的时间过长或者复制buffer太小,都会导致同步期间的增量指令在buffer中被覆盖,这样就会导致快照同步完成后无法进行增量复制,然后会再次发起快照同步,如此极有可能会陷入快照同步的死循环。
在这里插入图片描述
所以, 务必配置一个合适的复制buffer大小参数,避免快照复制的死循环

增加从节点

当从节点刚刚加入集群时,需要先进行一次快照同步,同步完成后在继续进行增量同步。

无盘复制

主节点在进行快照同步时,会进行很重的IO文件操作,特别是对于非SSD磁盘存储时,快照会对系统的负载产生较大影响。特别是 当系统正在进行AOF的fsync操作时如果发生快照,fsync将会被推迟执行,这就会严重影响主节点的服务效率

Redis的无盘复制是一种优化主从复制过程的技术,旨在减少主节点在进行复制时对磁盘的依赖,从而提高复制速度并减轻主节点磁盘IO压力。

工作原理

  • 在无盘复制模式下,Redis主节点不会像传统复制那样先将数据保存为RDB文件到本地磁盘,然后再由从节点下载该文件。相反,主节点会直接在内存中创建RDB文件,并通过网络socket直接将RDB数据流发送到从节点,整个过程绕过了磁盘操作。
  • 这个过程涉及主节点创建一个子进程,该子进程负责将内存中的数据序列化并通过网络发送,而无需写入磁盘。

wait指令

Redis的复制是异步进行的,wait指令可以让异步复制变为同步复制,确保系统的强一致性(不严格)。

> set key value 
OK
> wait 1 0 
(integer) 1

wait提供两个参数,第一个参数是从库数量N,第二个参数是时间t,以毫秒为单位。他表示等待wait指令之前的所有写操作同步到N个从库,最多等待t时间,如果t为0,表示无限等待直到N个从库同步达到一致

假设此时出现了网络分区,wait指令第二个参数时间t=0,主从同步无法进行,wait指令会永远阻塞,Redis服务器将丧失可用性。

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

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

相关文章

男士内裤品牌哪个好?2024公认好穿的五款男士内裤分享

男士内裤作为大家每天都要长时间穿着的贴身衣物,它的重要性不言而喻。为了确保健康与卫生,专家和医生建议您每三个月更换一次内裤,避免细菌滋生,让身体更加清爽自在。而一款优质的内裤,不仅要有舒适的弹性,…

TikTok电商带货指南:策略、技巧与流量获取全解析

随着短视频平台的迅猛发展,TikTok已成为品牌和个人进行带货营销的主要阵地之一。通过有创意的内容、有效的互动方式和精准的流量获取策略,品牌和个人都能在TikTok上取得显著的带货效果。本文Nox聚星将和大家探讨在TikTok上进行带货营销的有效策略和技巧&…

图形化编程:解锁数字创意的新钥匙

在这个日新月异的数字时代,编程已不再局限于专业人士的小圈子,它正逐渐成为一项基础技能,融入我们的日常生活与工作中。而对于那些对传统代码望而生畏的人来说,6547网认为图形化编程犹如一股清流,以其直观、易学的特点…

芝麻文件重命名 一键批量重命名 支持批量修改图片 文档 文件夹名称

芝麻文件重命名是一款专业的文件批量重命名软件,它提供了丰富的功能和灵活的命名规则,可以大大提高文件管理的效率。以下是关于芝麻文件重命名的详细介绍: 一、软件特点 支持批量重命名:芝麻文件重命名支持文件和文件夹的批量重命…

学生课程信息管理系统

摘 要 目前,随着科学经济的不断发展,高校规模不断扩大,所招收的学生人数越来越 多;所开设的课程也越来越多。随之而来的是高校需要管理更多的事务。对于日益增 长的学生相关专业的课程也在不断增多,高校对其管理具有一…

【机器学习】机器学习重要方法——无监督学习:理论、算法与实践

文章目录 引言第一章 无监督学习的基本概念1.1 什么是无监督学习1.2 无监督学习的主要任务 第二章 无监督学习的核心算法2.1 聚类算法2.1.1 K均值聚类2.1.2 层次聚类2.1.3 DBSCAN聚类 2.2 降维算法2.2.1 主成分分析(PCA)2.2.2 t-SNE 2.3 异常检测算法2.3…

扩散模型在时间序列预测中的兴起

摘要 本文探讨了扩散模型在时间序列预测中的应用。扩散模型在生成式人工智能的各个领域展示了最先进的成果。本文包括扩散模型的全面背景资料,详细说明了它们的调节方法,并回顾了它们在时间序列预测中的应用。分析涵盖了11个具体的时间序列实现&#xf…

C++11(下):线程库

线程库 1.线程1.1线程类介绍以及简单使用1.2线程函数参数1.3如何获取线程函数返回值 2.锁2.1锁的种类2.2 lock_guard与unique_lock 3.原子库3.1介绍与基本使用3.2CAS(原子操作原理) 4.条件变量 1.线程 1.1线程类介绍以及简单使用 在C11之前&#xff0c…

【操作系统】操作系统课后作业-聊天程序

无名管道与有名管道的区别 无名管道: 它是半双工的,具有固定的读端和写端。 只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。 不是普通的文件,不属于其他任何文件系统,并且只存…

实战|YOLOv10 自定义目标检测

引言 YOLOv10[1] 概述和使用自定义数据训练模型 概述 由清华大学的研究团队基于 Ultralytics Python 包研发的 YOLOv10,通过优化模型结构并去除非极大值抑制(NMS)环节,提出了一种创新的实时目标检测技术。这些改进不仅实现了行业领…

有关排序的算法

目录 选择法排序 冒泡法排序 qsort排序(快速排序) qsort排序整型 qsort排序结构体类型 排序是我们日常生活中比较常见的问题,这里我们来说叨几个排序的算法。 比如有一个一维数组 arr[8] {2,5,3,1,7,6,4,8},我们想要把它排成升序&#…

【MAVEN学习 | 第1篇】Maven介绍与安装

文章目录 前言 一. Maven主要作用1.1 依赖管理1.2 项目构建 二. Maven安装和配置2.1 安装2.2 配置环境变量2.3 命令测试2.4 配置文件(1)依赖本地缓存位置(本地仓库位置)(2)配置国内阿里镜像(3&a…

logback-spring.xml 小记

为什么不用logback.xml 名字 加载顺序:logback.xml>application.yml>logback-spring.xml 使用xml中使用到配置文件属性时,就会报错 为什么logback中记录不到运行时报错 logback获取不到堆栈错误 解决办法:在全局错误出使用log.error()指定输出 为什么打印不出来myba…

【面试实战】# 并发编程之线程池配置实战

1.先了解线程池的几个参数含义 corePoolSize (核心线程池大小): 作用: 指定了线程池维护的核心线程数量,即使这些线程处于空闲状态,它们也不会被回收。用途: 核心线程用于处理长期的任务,保持最低的线程数量,以减少线程的创建和…

【html】爱心跳动动画:CSS魔法背后的故事

效果展示: 代码介绍: 爱心跳动动画:CSS魔法背后的故事 在前端开发中,CSS不仅仅是一种用于控制网页样式的工具,它也是一种表达创意和想象力的艺术手段。今天,我要为大家介绍一段使用CSS实现的爱心跳动动画…

【计算方法】对分区间套解非线性方程

废话少说&#xff0c;直接上干货。 #include <stdio.h> #include <math.h>float f(float x) {// 函数return x*x*x - x - 1; }float root(float x1, float x2) {float mid, fmid;float e 1e-6;while ((x2 - x1) > e) {mid (x1 x2) / 2;fmid f(mid);// 判断中…

Android断点续传原理及实现

常见两种网络请求方式 一、 HttpURLConnection HttpURLConnection的setRequestProperty()方法&#xff0c;对我们要读取的字节部分进行控制&#xff0c;比如: 1.Range0-100代表只读取前100个字节。 2.Range100-500代表读取从第100个字节开始&#xff0c;读到第500个字节为止。…

从理论到实践掌握UML

统一建模语言&#xff08;UML&#xff09;是软件工程师用来设计软件系统的一种工具&#xff0c;就像是一套图形化的说明书。它让开发团队能够以图形化的方式来理解、设计和开发软件系统&#xff0c;比起用文字来描述&#xff0c;更加直观易懂。本文通过UML实例化的理论和实践相…

【漏洞复现】蓝凌EIS api.aspx 任意文件上传漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

指针的深入理解(3)(包括数组名的理解、一维数组传参的本质以及指针数组的相关知识及使用)

文章目录 1 数组名的理解2 使用指针访问数组3 一维数组传参的本质4 指针数组5 指针数组的使用 1 数组名的理解 当我们运行以下代码&#xff1a; #include <stdio.h> int main() {int arr[10] { 0 };printf("%p\n", &arr[0]);printf("%p\n", a…