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

【征服Redis12】redis的主从复制问题

从现在开始,我们来讨论redis集群的问题,在前面我们介绍了RDB和AOF两种同步机制,那你是否考虑过这两个机制有什么用呢?其中的一个重要作用就是为了集群同步设计的。

Redis是一个高性能的键值存储系统,广泛应用于Web应用、缓存、消息队列等领域。在实际应用中,为了保证Redis的高可用性,通常需要使用主从复制来进行数据备份和故障转移。本文将介绍Redis主从复制的概念、原理和实现方式,以及主从复制中的一些问题和解决方案。

1.主从配置实战

Redis支持集群的架构,集群的节点有主节点和从节点之分。主节点叫master,从节点叫slave。slave会通过复制的技术,自动同步master的数据。
redis】配置主从非常简单 ,只要在配置文件里增加一行即可,例如如果是一主多从,186是主结点,在每个slave结点的redis.conf配置文件增加一行即可:

replicaof 127.0.0.1 6379

从节点启动之后,会自动连接到master结点,开始同步数据。如果master结点变了,比如宕机了,选举出了新的master,则这个配置会被重写。
当然我们也可以在执行命令中增加参数的方式来配置,这个就不赘述了。
一个从结点也可以是其他结点的主结点,从而形成级联复制的关系。如果想看集群的状态,可以使用如下命令:

info replication

需要注意的是,从结点是只读的,不能执行写操作,否则会报错

在主几点写入后,slave会自动从master同步数据。
如果小弟想单飞了怎么办?也可以通过一行命令搞定:

slaveof no one

此时结点会变成自己的主节点,不再复制数据。

2.主从复制的原理

主从复制就是指将一个Redis实例(主服务器)的数据复制到其他Redis实例(从服务器)的过程。主服务器将自己的数据变化通过网络发送给从服务器,从服务器接收到数据后进行更新,从而保证从服务器的数据和主服务器的数据保持一致。主从复制可以实现数据备份、故障转移和读写分离等功能。
主从复制分为全量复制和增量复制两种方式。全量复制是指从主服务器将整个数据集发送到从服务器,而增量复制则是指只发送主服务器的增量变化数据到从服务器。
整个过程其实不复杂,至少比Mysql要容易一些的,在网上找到一张不错的图,已经说得很清楚了:

2.1 全量复制

全量复制的流程如下:

  • (1)从服务器向主服务器发送SYNC命令,请求进行复制。
  • (2)主服务器接收到SYNC命令后,创建一个RDB文件,将当前的数据集保存到RDB文件中,并向从服务器发送RDB文件。
  • (3)从服务器接收到RDB文件后,将其保存到本地,并加载到内存中。
  • (4)主服务器将从SYNC命令到复制完成期间的所有写命令记录到内存缓冲区中,并在复制完成后将这些写命令发送给从服务器。
  • (5)从服务器接收到写命令后,执行这些命令,更新自己的数据集。

我们再图示一下:

2.2 增量复制

增量复制的流程如下:

  • (1)从服务器向主服务器发送PSYNC命令,请求进行复制。
  • (2)主服务器记录从服务器复制的偏移量,并将从这个偏移量开始的所有写命令发送给从服务器。
  • (3)从服务器接收到写命令后,执行这些命令,更新自己的数据集。

我们看下面的图,更直观的理解一下:

首先,从服务器向主服务器发送PSYNC命令,请求进行复制。PSYNC命令包含两个参数:一个是复制的标识符,用于标识从服务器当前的复制状态;另一个是复制的偏移量,用于指定从哪个位置开始进行复制。在PSYNC命令中,如果标识符为0,表示从服务器是第一次进行复制,主服务器会进行全量复制;如果标识符不为0,表示从服务器已经进行过复制,主服务器会根据标识符和偏移量进行增量复制。

接下来,主服务器记录从服务器复制的偏移量,并将从这个偏移量开始的所有写命令发送给从服务器。主服务器在记录从服务器复制的偏移量时,有两个偏移量需要记录:一个是主服务器最后一次执行的命令的偏移量,另一个是主服务器最后一次执行的命令的复制偏移量。主服务器会将这两个偏移量发送给从服务器,从服务器接收后将其存储在自己的内存中。

从服务器接收到写命令后,执行这些命令,更新自己的数据集。在执行写命令期间,从服务器会不断地将执行的命令的偏移量发送给主服务器,以便主服务器随时记录从服务器的复制进度。此外,如果从服务器在执行写命令时发生了错误,主服务器会根据之前记录的复制进度,重新发送最近的命令,以保证主从数据的一致性。

需要注意的是,增量复制的过程中可能会出现延迟,这是因为主服务器需要缓存一定数量的写命令才会一次性发送给从服务器。如果从服务器在一段时间内没有接收到新的写命令,就会认为主服务器已经断开连接或者出现了故障,从而触发故障转移。此外,增量复制也可能出现主从数据不一致的情况,比如主从服务器之间的网络延迟、主从服务器的时钟不同步等问题。为了避免这些问题,我们需要采用一些额外的措施,如定期检查主从数据的一致性、使用时间戳和序列号等方式保证主从服务器的时钟同步等。
 

3.主从复制的进一步讨论与常见面试题

在上面的过程中还有不少问题需要进一步研究的,这里我们搜集了几个一起来一下:

3.1. 数据不一致

读写分离会将读操作和写操作分别发送到不同的Redis实例上,因此在进行写操作后,从库的数据不一定会立即更新,可能会存在一定的延迟。如果在这段延迟期间进行读操作,就会读取到旧的数据,导致数据不一致的问题。

解决方案
可以采用同步延迟、异步延迟、写完立即读、延迟刷新等策略,例如在写入数据后,通过命令等待从库同步完成后再进行读取操作;或者采用写完立即读的方式,即在写入数据后马上进行读取操作,保证数据的一致性;还可以定期刷新从库的数据,避免数据延迟过大。

3.2. 延迟问题

由于网络传输、数据同步等原因,从库的数据更新可能会存在一定的延迟,导致在进行读取操作时出现延迟问题,影响系统的性能和用户体验。

解决方案:可以采用主动刷新、被动刷新等策略,例如定期刷新从库的数据、在从库中设置较短的超时时间等,以保证数据的及时性和准确性。

3.3. 安全性问题

通常情况下从库的安全性其实也要很高,包括数据安全和环境安全。如果从库磁盘损坏也是会影响业务。如果从库被攻击,可能会导致主库的数据泄露,或者被篡改。因此需要采用一些安全措施来保证redis服务的存储安全和环境安全性。

解决方案
可以采用SSL加密、访问控制、数据加密等策略,例如使用SSL协议来保证数据传输的安全,或者在从库上设置密码、限制访问IP等来保证系统的安全性。

3.4. 故障切换问题

当主库出现故障时,需要将从库切换为新的主库,以确保系统的正常运行。但是,在进行切换时可能会存在数据不一致、丢失数据等问题。

解决方案
可以采用哨兵模式或者集群模式来实现故障切换(这个我们后续章节详细讲解),例如哨兵模式可以使用多个监控节点来监测主库的状态,并在主库出现故障时自动切换到从库;集群模式可以使用多个节点来实现数据的分布式存储,从而提高系统的可靠性和容错能力。

3.5. 延迟与不一致问题

在进行读写分离时,由于数据同步的延迟,可能会存在从库中数据不一致的问题,影响系统的性能和用户体验。

解决方案
这个只能是相对的解决方案,延迟是无法避免,这是由设计决定的。可以采用数据同步机制来避免延迟和数据不一致问题,例如使用增量复制机制来加快数据同步速度;或者在从库中使用缓存机制来减少读取延迟等,以提高系统的性能和可靠性。
 

3.6.当主服务器不进行持久化时复制的安全性

在主从复制中,当主服务器不进行持久化时,复制的安全性会受到影响。因为如果主服务器在发送数据之前崩溃,从服务器可能会丢失一些数据,从而导致数据不一致。因此,在使用主从复制时,最好将主服务器进行持久化。

3.7.为什么主从全量复制使用RDB而不使用AOF?

主从全量复制使用RDB而不使用AOF的原因是因为RDB文件是一个快照,包含了Redis实例的整个数据集,它可以很快地恢复Redis实例的数据,而AOF文件只记录了Redis实例的增量操作,恢复数据需要重新执行所有操作,速度较慢。

3.8. 为什么还有无磁盘复制模式?

无磁盘复制模式是指从服务器不需要将主服务器的数据保存到本地磁盘上,而是直接将数据保存到内存中,这样可以减少磁盘I/O的开销,提高复制效率。但是,由于从服务器不进行持久化,如果从服务器崩溃或者重启,数据可能会丢失。

3.9. 为什么还会有从库的从库的设计?

从库的从库设计是为了实现更高的可用性和更好的性能。将从服务器作为主服务器的从服务器,可以构建一个多层级的主从架构,从而提高系统的容错能力和性能。

4.总结

读写分离需要注意解决故障切换、数据过期、延迟和不一致等问题,以保证系统的稳定性和可靠性。
在实际应用中,主从复制是保证高可用性的重要手段之一。了解Redis主从复制的原理和实现方式,可以帮助我们更好地搭建和维护Redis集群,提高系统的稳定性和可靠性。

不过主从复制的弊端是仍然只有一个能写,其他的主要扛读的高并发问题,假如频繁写的场景,此时仍然会有瓶颈,因此读写分离适合并发强度并不是很高的场景。如果真的要应对大规模读写的问题,我们需要建立更严格的redis集群,这个我们下一篇继续介绍。

相关文章:

【征服Redis12】redis的主从复制问题

从现在开始,我们来讨论redis集群的问题,在前面我们介绍了RDB和AOF两种同步机制,那你是否考虑过这两个机制有什么用呢?其中的一个重要作用就是为了集群同步设计的。 Redis是一个高性能的键值存储系统,广泛应用于Web应用…...

php函数 一

一 自动加载 1.1 __autoload(string $class) 类自动加载,7.2版本之后废弃。可使用sql_autoload_register()注册方法实现。 类自动加载,无返回值。 #php7.2之前function __autoload($class) {if(strpos($class, CI_) ! 0){if (file_exists(APPPATH . …...

监督学习 - 梯度提升回归(Gradient Boosting Regression)

什么是机器学习 梯度提升回归(Gradient Boosting Regression)是一种集成学习方法,用于解决回归问题。它通过迭代地训练一系列弱学习器(通常是决策树)来逐步提升模型的性能。梯度提升回归的基本思想是通过拟合前一轮模…...

【工具】使用ssh进行socket5代理

文章目录 shellssh命令详解正向代理:反向代理:本地 socks5 代理 shell ssh -D 3333 root192.168.0.11 #输入密码 #3333端口已经使用远程机进行转发设置Windows全局代理转发 socks127.0.0.1 3333如果远程机为公网ip,可通过搜索引擎查询出网…...

(delphi11最新学习资料) Object Pascal 学习笔记---第2章第六节(类型转换)

Object Pascal 学习笔记,Delphi 11 编程语言的完整介绍 作者: Marco Cantu 笔记:豆豆爸 2.6 类型转换和类型转换 ​ 正如我们所见,不能将一种数据类型的变量赋值给另一种类型的变量。原因在于,根据数据的实际表示,你…...

计算机服务器中了mallox勒索病毒怎么办,mallox勒索病毒解密数据恢复

企业的计算机服务器存储着企业重要的信息数据,为企业的生产运营提供了极大便利,但网络安全威胁随着技术的不断发展也在不断增加,近期,云天数据恢复中心接到许多企业的求助,企业的计算机服务器中了mallox勒索病毒&#…...

CPU相关专业名词介绍

CPU相关专业名词 1、CPU 中央处理器CPU(Central Processing Unit)是计算机的运算和控制核心,可以理解为PC及服务器的大脑CPU与内部存储器和输入/输出设备合称为电子计算机三大核心部件CPU的本质是一块超大规模的集成电路,主要功…...

VRRP协议负载分担

VRRP流量负载分担 VRRP负载分担与VRRP主备备份的基本原理和报文协商过程都是相同的。同样对于每一个VRRP备份组,都包含一个Master设备和若干Backup设备。与主备备份方式不同点在于:负载分担方式需要建立多个VRRP备份组,各备份组的Master设备可以不同;同一台VRRP设备可以加…...

maven 基本知识/1.17

maven ●maven是一个基于项目对象模型(pom)的项目管理工具,帮助管理人员自动化构建、测试和部署项目 ●pom是一个xml文件,包含项目的元数据,如项目的坐标(GroupId,artifactId,version )、项目的依赖关系、构建过程 ●生命周期&…...

【Java】HttpServlet类简单方法和请求显示

1、HttpServlet类简介🍀 Servlet类中常见的三个类有:☑️HttpServlet类,☑️HttpServletRequest类,☑️HttpResponse类 🐬其中,HttpServlet首先必须读取Http请求的内容。Servlet容器负责创建HttpServlet对…...

使用Rancher管理Kubernetes集群

部署前规划 整个部署包括2个部分,一是管理集群部署,二是k8s集群部署。管理集群功能主要提供web界面方式管理k8s集群。正常情况,管理集群3个节点即可,k8s集群至少3个。本文以3节点管理集群,3节点k8s集群为例 说明部署过…...

QT中操作word文档

QT中操作word文档: 参考如下内容: C(Qt) 和 Word、Excel、PDF 交互总结 Qt对word文档操作总结 QT中操作word文档 Qt/Windows桌面版提供了ActiveQt框架,用以为Qt和ActiveX提供完美结合。ActiveQt由两个模块组成: QAxContainer模…...

纯前端在线Office文档安全预览之打开Word文档后禁止打印、禁止另存为、禁止复制

在一些在线Office文档中,有很多重要的文件需要保密控制,比如:报价单、客户资料等数据,只能给公司成员查看,但是不能编辑,并且不能拷贝,打印、不能另存为,导致重要资料外泄。 可以通…...

李沐深度学习-d2lzh_pytorch模块实现

d2lzh_pytorch 模块 import random import torch import matplotlib_inline from matplotlib import pyplot as plt import torchvision import torchvision.transforms as transforms import torchvision.datasets import sys from collections import OrderedDict# --------…...

什么是OSPF?为什么需要OSPF?OSPF基础概念

什么是OSPF? 开放式最短路径优先OSPF(Open Shortest Path First)是IETF组织开发的一个基于链路状态的内部网关协议(Interior Gateway Protocol)。 目前针对IPv4协议使用的是OSPF Version 2(RFC2328&#x…...

Java多线程并发篇----第二十六篇

系列文章目录 文章目录 系列文章目录前言一、什么是 Executors 框架?二、什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?三、什么是 Callable 和 Future?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分…...

list下

文章目录 注意:const迭代器怎么写?运用场合? inserterase析构函数赋值和拷贝构造区别?拷贝构造不能写那个swap,为什么?拷贝构造代码 面试问题什么是迭代器失效?vector、list的区别? 完整代码 注…...

【Linux】进程间通信——system V 共享内存、消息队列、信号量

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 写在前面1. 共享内存1.1 共享内存的概念1.2 共享内存的原理1.3 共享内存的使用1.3.1 …...

网络卡问题排查手段

问题 对后端来说&#xff0c;网络卡了问题&#xff0c;本身很难去排查&#xff0c;因为是 App 通过互联网连接服务 总结下&#xff0c;以往经验&#xff0c;网络卡&#xff0c;通常会有以下情况造成&#xff1a; 某地区网络问题某地区某运营商问题后端服务超载前端网络模块 …...

20240119-子数组最小值之和

题目要求 给定一个整数数组 arr&#xff0c;求 min(b) 的总和&#xff0c;其中 b 的范围涵盖 arr 的每个&#xff08;连续&#xff09;子数组。由于答案可能很大&#xff0c;因此返回答案模数 Example 1: Input: arr [3,1,2,4] Output: 17 Explanation: Subarrays are [3]…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式

pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图&#xff0c;如果边框加在dom上面&#xff0c;pdf-lib导出svg的时候并不会导出边框&#xff0c;所以只能在echarts图上面加边框 grid的边框是在图里…...

Yii2项目自动向GitLab上报Bug

Yii2 项目自动上报Bug 原理 yii2在程序报错时, 会执行指定action, 通过重写ErrorAction, 实现Bug自动提交至GitLab的issue 步骤 配置SiteController中的actions方法 public function actions(){return [error > [class > app\helpers\web\ErrorAction,],];}重写Error…...

大模型真的像人一样“思考”和“理解”吗?​

Yann LeCun 新研究的核心探讨&#xff1a;大语言模型&#xff08;LLM&#xff09;的“理解”和“思考”方式与人类认知的根本差异。 核心问题&#xff1a;大模型真的像人一样“思考”和“理解”吗&#xff1f; 人类的思考方式&#xff1a; 你的大脑是个超级整理师。面对海量信…...