【征服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集群,这个我们下一篇继续介绍。

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

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

相关文章

服务器感染了.wis[[Rast@airmail.cc]].wis勒索病毒,如何确保数据文件完整恢复?

导言: 在当今数字化的时代,恶意软件攻击已经变得越来越复杂和狡猾,[[MyFilewaifu.club]].wis [[backupwaifu.club]].wis[[Rastairmail.cc]].wis勒索病毒是其中的一种新威胁。本文91数据恢复将深入介绍[[MyFilewaifu.club]].wis [[backupwaif…

Dify学习笔记-基础介绍(一)

1、简介 Dify AI是一款强大的LLMOps(Language Model Operations)平台,专为用户提供便捷的人工智能应用程序开发体验。 该平台支持GPT系列模型和其他模型,适用于各种团队,无论是用于内部还是外部的AI应用程序开发。 它…

基于springboot+vue的美容院管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

JAVA用Zxing生成的二维码扫码桩识别出现\000026

使用Zxing生成的二维码,扫码桩扫描偶先扫描出\000026 文章目录 [TOC](文章目录) 前言一、出现原因分析二、解决方式三、iso ECI 字符集编码说明 前言 Hutool QrCodeUtil(底层Zxing) 生成二维码扫码桩扫描二维码 出现类似:"\…

react18介绍

改进已有属性,如自动批量处理【setState】、改进Suspense、组件返回undefined不再报错等 支持Concurrent模式,带来新的API,如useTransition、useDeferredValue等 如何升级React 18 npm install reactlatest react-domlatestnpm install ty…

python pip安装包时,出现 WARNING: Ignoring invalid distributio xxxx,解决办法

pip安装包时,出现 WARNING: Ignoring invalid distributio xxxx,解决办法 遇到的问题,如图 这个问题其实就是python环境下的包无效了,找到WARNING: Ignoring invalid distributio xxxx后面对应的路径,删除对应的~XXXX…

Android开发--状态栏布局隐藏的方法

1.问题如下,安卓布局很不协调 2.先将ActionBar设置为NoActionBar 先打开styles.xml 3.使用工具类 package com.afison.newfault.utils;import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import android.graph…

TortoiseSVN源码安装与迁移全攻略

一、前言 随着版本控制系统的普及,越来越多的开发者和团队开始使用SVN(Subversion)来管理代码。本文将详细介绍TortoiseSVN的源码安装及迁移过程,帮助您轻松掌握这一版本控制工具。 二、TortoiseSVN源码安装 依赖环境安装&…

Window安装Python和开发Pycharm

准备: 1:安装Python环境 https://www.python.org/downloads/windows/ 2: 下载Pycharm https://www.jetbrains.com/pycharm/download/other.html

快速排序

快速排序 概况步骤代码示例输出结果 要想学习快速排序,前提必须了解 递归算法 概况 快速排序是一种高效的排序算法,它采用了分治的策略。 基本思想是选择一个基准数,通过一趟排序将待排序序列划分成两个子序列,其中一个子序列的…

乔迁新居发言

亲爱的家人们,大家好! 非常感谢大家在百忙之中抽出宝贵的时间来到这里为我们的新居增添福气。我代表我和田小帆对大家的到来表示热烈的欢迎和衷心的感谢。 在这个特殊的时刻,我对我们小家庭建设过程中帮助我们的所有亲人、朋友和同学们表示由…

大模型实战营Day6 笔记

本期主题为: 为何测评,因场景众多,需要统一的标准: 评测的意义: 传统NLP的一些评测需要: 到了大模型时代,需要评测的就更多了: 客观评测: 有些主观题可以用模型评价…

Shell脚本的条件语句-------if语句与case语句

目录 一、if语句 1、bash的配置文件 2、单分支结构 3、双分支结构 4、多分支结构 ①单分支应用举例:写一个脚本检查80端口是否开启,如果开启则反馈http正在运行,否则启动httpd服务 ②多分支应用例子:90-100 是优秀 70-89…

FlinkAPI开发之状态管理

案例用到的测试数据请参考文章: Flink自定义Source模拟数据流 原文链接:https://blog.csdn.net/m0_52606060/article/details/135436048 Flink中的状态 概述 有状态的算子 状态的分类 托管状态(Managed State)和原始状态&…

springboot123基于springboot框架的网上商城系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的基于springboot框架的网上商城系统的设计与实现 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看…

centos7.9安装redmine5.1.1

前提: 安装mysql并新建数据库--教程太多了此步骤省略; 用sqlyog连上mysql创建数据库redmine; 1.下载redmine-5.1.1.tar.gz,上传到/usr/local/software目录下; 2.解压 cd /usr/local/software tar -zxvf redmine-5.…

架构师的36项修炼-06高性能系统架构设计

本课时讲解大家常听到的高性能系统架构。 高性能系统架构,主要包括两部分内容,性能测试与性能优化。性能优化又可以细分为硬件优化、中间件优化、架构优化及代码优化,知识架构图如下。 性能测试 先看系统的性能测试。性能测试是性能优化的…

Mybatis 动态SQL条件查询(注释和XML方式都有)

需求 : 根据用户的输入情况进行条件查询 新建了一个 userInfo2Mapper 接口,然后写下如下代码,声明 selectByCondition 这个方法 package com.example.mybatisdemo.mapper; import com.example.mybatisdemo.model.UserInfo; import org.apache.ibatis.annotations.*; import j…

GetShell的姿势

0x00 什么是WebShell 渗透测试工作的一个阶段性目标就是获取目标服务器的操作控制权限,于是WebShell便应运而生。Webshell中的WEB就是web服务,shell就是管理攻击者与操作系统之间的交互。Webshell被称为攻击者通过Web服务器端口对Web服务器有一定的操作权…

AnimatedDrawings:让绘图动起来

老样子,先上图片和官网。这个项目是让绘制的动画图片动起来,还能绑定人体的运动进行行为定制。 快速开始 1. 下载代码并进入文件夹,启动一键安装 git clone https://github.com/facebookresearch/AnimatedDrawings.gitcd AnimatedDrawingspip…