[Redis]主从同步

news/2025/3/13 2:51:49/文章来源:https://www.cnblogs.com/DCFV/p/18345106

有备无患--主从同步

很多企业都没有使用 Redis 的集群,但是至少都做了主从。有了主从,当主节点(Master)挂掉的时候,运维让从节点(Slave)过来接管,服务就可以继续,否则主节点需要经过数据恢复和重启的过程,这就可能会拖延很长的时间,从而影响线上业务的持续服务。在了解 Redis 的主从复制之前,让我们先来理解一下现代分布式系统的理论基石--CAP 原理。

CAP 原理

CAP 原理就好比分布式领域的牛顿定律,它是分布式存储的理论基石。自从CAP 的论文发表之后,分布式存储中间件犹如雨后春笋般涌现出来。理解这个原理其实很简单,本节我们首先对这个原理进行简单的讲解。

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

分布式系统的节点往往都是分布在不同的机器上进行网络隔离开的,这意味着必然会有网络断开的风险,这个网络断开的场景的专业词汇叫作网络分区。如图 3-1 所示,在网络分区发生时,两个分布式节点之间无法进行通信,我们对一个节点进行的修改操作将无法同步到另外一个节点,所以数据的一致性将无法满足,因为两个分布式节点的数据不再保持一致。除非我们牺牲可用性,也就是暂停分布式节点服务,在网络分区发生时,不再提供修改数据的功能,直到网络状况完全恢复正常再继续对外提供服务。

image

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

最终一致

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

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

主从同步与从从同步

Redis 同步支持主从同步和从从同步,如图 3-2 所示,从从同步功能是 Redis 后续版本增加的功能,以减轻主节点的同步负担。后面为了描述上的方便,统一理解为主从同步。

image

增量同步

Redis 同步的是指令流,主节点会将那些对自己的状态产生修改性影响的指令记录在本地的内存 buffer 中,然后异步将 buffer 中的指令同步到从节点,从节点一边执行同步的指令流来达到和主节点一样的状态,一边向主节点反馈自己同步到哪里了(偏移量)。
因为内存的 buffer 是有限的,所以 Redis 主节点不能将所有的指令都记录在内存 buffer中。Redis 的复制内存 buffer是一个定长的环形数组,如果数组内容满了,就会从头开始覆盖前面的内容。

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

快照同步

快照同步是一个非常耗费资源的操作,如图 3-4所示,它首先需要在主节点上进行一次 bgsave,将当前内存的数据全部快照到磁盘文件中,然后再将快照文件的内容全部传送到从节点从节点将快照文件接受完毕后,立即执行一次全量加载,加载之前先要将当前内存的数据清空,加载完毕后通知主节点继续进行增量同步(快照同步的过程中,主节点还在不停的产生增量)。在整个快照同步进行的过程中,主节点的复制 buffer 还在不停地往前移动,如果快照同步的时间过长或者复制 buffer 太小,都会导致同步期间的增量指令在复制buffer 中被覆盖,这样就会导致快照同步完成后无法进行增量复制然后会再次发起快照同步,如此极有可能会陷入快照同步的死循环。

image

所以务必配置一个合适的复制 buffer 大小参数,避免快照复制的死循环。

增加从节点

当从节点刚刚加入到集群时,它必须先进行一次快照同步,同步完成后再继续进行增量同步

无盘复制

主节点在进行快照同步时,会进行很耗时的文件 IO 操作(生成快照),在非 SSD 磁盘存储时,快照同步会对系统的负载产生较大影响。特别是当系统正在进行 AOF 的fsync 操作时,如果发生快照同步,fsync 将会被推迟执行,这就会严重影响主节点的服务效率所以从 Redis 2.8.18 版本开始,Redis 支持无盘复制。所谓无盘复制是指主服务器直接通过套接字将快照内容发送到从节点,生成快照是一个遍历的过程,主节点会一边遍历内存,一边将序列化的内容发送到从节点(不需要在本地先生成一个完整的快照文件),从节点还是跟之前一样,先将接收到的内容存储到磁盘文件中,再进行一次性加载

wait 指令

Redis 的复制是异步进行的,wait 指令可以让异步复制变身同步复制,确保系统的强一致性(不严格)。wait 指令是 Redis3.0版本以后才出现的。

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

wait 提供两个参数,第一个参数是从节点的数量 N,第二个参数是时间 t,以毫秒为单位。两个参数的含义是:等待 wait 指令之前的所有写操作同步到 N 个从节点(也就是确保 N 个从节点的同步没有滞后),最多等待时间t。如果时间 t=0,表示无限等待直到N个从节点同步完成。

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

小结

主从复制是 Redis 分布式的基础,Redis 的高可用离开了主从复制将无从进行。在后面的内容中,我们会讲解 Redis 的集群模式,这几种集群模式都依赖于本节所讲的主从复制。

不过复制功能也不是必需的,如果你只用 Redis 做缓存,跟 memcache 一样对待也就不需要从节点做备份,挂掉了重新启动一下就行。但是只要你使用了Redis 的持久化功能,就必须认真对待主从复制,它是系统数据安全的基础保障。2024-08-06 14:42:13 星期二

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

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

相关文章

【YashanDB数据库】VMware虚拟机使用默认安装,在掉电之后数据库无法启动

问题现象 客户使用VMware虚拟机使用默认安装,部署YashanDB个人版,在掉电之后无法启动 操作系统: Virtualization: VMware Operating System: CentOS Linux 7 (Core) CPE OS Name: cpe:/o:centos:centos:7 Kernel: Linux 3.10.0-1160.el7.x86_64 Architecture: x86-64 [yasha…

在 Kubernetes 中部署 Alertmanager

AlertManager 是一个开源警报系统,与 Prometheus 监控系统配合使用。本博客是 Prometheus Kubernetes 教程系列的一部分。在我们之前的文章中,我们研究了以下内容:在 Kubernetes 上部署 Prometheus 部署 Kube State Metrics在本指南中,我将介绍 Alertmanager 设置及其与 Pr…

华为云IoTDA控制台全新升级,来体验35万+开发者使用的平台

摘要:现在体验华为云IoT全新控制台,赢无线耳机等精美好礼 本文分享自华为云社区《华为云IoTDA控制台全新升级,邀您有奖体验!| 云声建议 - 华为云IoTDA专属活动(8月)》,作者:华为IoT云服务。 作为万物上云的物联网底座,华为云IoT物联网平台(设备接入IoTDA)目前接入的…

第三章 栈、队列和数组

栈 栈的基本概念 栈的定义 栈是只允许在一端进行插入或删除操作的线性表栈顶:线性表允许进行插入删除的那一端 栈底:固定的,不允许进行插入和删除的另一端 空栈:不含任何元素的空表栈的操作特性可以概括为:后进先出(LIFO) 栈的基本操作 InitStack(&S)//初始化栈,构…

第二章 线性表

线性表的定义和基本操作 线性表的定义 线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表,若当L命名线性表,则其一般表示为L=(a1,a2,.…,an)ai 是线性表中“第i个”元素线性表中的位序 a1 是表头元素,an 是表尾元素 出第一个…

zabbix“专家坐诊”第250期问答

问题一 Q:乐维监控社区版监控交换机,能统计出端口的IP流量排名吗? A:社区版没有这个功能 ,正式版,流量报表可以实现端口IP流量排行。问题二 Q:我看了一下乐维有事件平台汇总的功能,可以接第三方的告警吗? A:可以的。 Q:有没有操作手册我看看,或者你们是基于什么做的…

uniapp中的websocket的研究,以及相关的封装

官方文档---官方文档写的跟屎一样 https://uniapp.dcloud.net.cn/api/request/websocket.html相关博客 https://www.cnblogs.com/sunnyeve/p/16757633.html

aspnet .core 网站默认不支持文件下载

将txt文件和rar文件都放到 wwwroot 目录下,会发现前者可以正常下载而后者不行。其实是需要在初始化的地方进行设置: builder.WebHost.UseKestrel(option =>{ option.ListenAnyIP(config.Port);}); WebApplication app = builder.Build(); var httpContextAccessor = ap…

2024FIC线上初赛WP

感觉需要总结一些技巧了2024FIC线上初赛WP 挖个坑,哪天想起来了补一下艰难困苦,玉汝于成

部署CPU与GPU通用的tensorflow:Anaconda环境

本文介绍在Anaconda环境中,下载并配置Python中机器学习、深度学习常用的新版tensorflow库的方法~本文介绍在Anaconda环境中,下载并配置Python中机器学习、深度学习常用的新版tensorflow库的方法。在之前的两篇文章Python TensorFlow深度学习回归代码:DNNRegressor与Python T…

采购订单列表根据条件设置行背景色

方式一:通过Python脚本实现 import clr clr.AddReference(System) clr.AddReference(Kingdee.BOS) clr.AddReference(Kingdee.BOS.Core) clr.AddReference(System.Drawing) clr.AddReference(System.Collections)from System import * from System.Collections import * from…

采购订单打开单据时表格行设置颜色

列表根据条件设置背景色import clr clr.AddReference(System) clr.AddReference(Kingdee.BOS) clr.AddReference(Kingdee.BOS.Core) clr.AddReference(System.Drawing) clr.AddReference(System.Collections)from System import * from System.Collections import * from Syst…