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

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服务器将丧失可用性。

相关文章:

  • Linux 系统图像化编程GTK入门
  • git 基本命令
  • 基于STM32的智能水产养殖系统(四)
  • 探究 IP 地址被网站封禁的原因
  • 前端开发中的热更新原理
  • Linux 获取文件大小fstat、stat使用
  • 深入理解和应用Eureka:服务注册与发现的利器
  • 第一百一十一节 Java面向对象设计 - Java泛型方法和构造函数
  • 13.3 Go 性能优化
  • 《Linux运维总结:prometheus+altermanager+webhook-dingtalk配置文件详解》
  • c++之说_15|成员函数的const尾缀修饰 ( const const)
  • 程序员们,能告诉我你们为什么选择arch linux吗?
  • LINUX内核权限提升漏洞(CVE-2024-1086)通告
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 目录管理器(200分) - 三语言AC题解(Python/Java/Cpp)
  • 【Science Data Bank】数据集下载脚本
  • 收藏网友的 源程序下载网
  • [Vue CLI 3] 配置解析之 css.extract
  • Angular6错误 Service: No provider for Renderer2
  • cookie和session
  • Docker入门(二) - Dockerfile
  • ES6系统学习----从Apollo Client看解构赋值
  • ES学习笔记(12)--Symbol
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • overflow: hidden IE7无效
  • Phpstorm怎样批量删除空行?
  • React Transition Group -- Transition 组件
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • 工程优化暨babel升级小记
  • 机器学习学习笔记一
  • 简单易用的leetcode开发测试工具(npm)
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 译自由幺半群
  • 责任链模式的两种实现
  • mysql面试题分组并合并列
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (2.2w字)前端单元测试之Jest详解篇
  • (28)oracle数据迁移(容器)-部署包资源
  • (7)摄像机和云台
  • (libusb) usb口自动刷新
  • (初研) Sentence-embedding fine-tune notebook
  • (五)MySQL的备份及恢复
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)LINQ之路
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • ***监测系统的构建(chkrootkit )
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .java 9 找不到符号_java找不到符号
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET中winform传递参数至Url并获得返回值或文件
  • /etc/skel 目录作用