【面试之Redis篇】主从复制原理

从面试的角度来解释 Redis 主从复制原理,按照“总-分-总”的结构,清晰地阐述其核心概念、工作流程和关键要点,这能体现出你不仅知道是什么,还理解为什么以及如何应对相关问题。


总览:一句话定义

面试官您好,Redis 的主从复制是指:由一个 Redis 服务器(主节点 Master)将其数据自动同步到一个或多个 Redis 服务器(从节点 Slave)的过程。它的核心目的是实现数据的冗余备份、实现读写分离以提升读性能、并构成高可用和故障恢复的基础。


分步详解:核心工作原理(重点阐述)

主从复制的过程主要可以分为三个阶段:建立连接、数据同步、命令传播。其中数据同步阶段是重中之重。

第一阶段:建立连接 (Handshake)
  1. 配置与连接:从节点通过执行 replicaof <masterip> <masterport> 命令(旧版本为 slaveof)或修改配置文件,保存主节点的地址和端口。
  2. 建立 Socket 连接:从节点会创建一个专门的 Socket 连接,用于与主节点进行通信。如果连接成功,从节点会为这个 Socket 关联一个专门的文件事件处理器,负责处理后续的复制工作。
  3. 发送 PING 命令:连接建立后,从节点首先发送一个 PING 命令。目的是:
    • 检查 Socket 连接是否可用。
    • 检查主节点是否能正常处理请求(如果主节点返回错误或超时无响应,从节点会断开并重连)。
  4. 身份验证:如果主节点配置了 requirepass,从节点需要发送 AUTH 命令并提供密码进行验证。
  5. 发送端口信息:身份验证通过后,从节点会向主节点发送自己监听的端口号(REPLCONF listening-port <port>),主节点会保存这个信息。

至此,通信链路已准备好,复制流程进入最关键的数据同步阶段。

第二阶段:数据同步 (Synchronization)

这是复制过程的核心,目的是让从节点的数据集状态与主节点达成一致。根据从节点是否是第一次同步,会分为全量复制部分复制(增量复制)

1. 全量复制 (Full Resynchronization) - 用于首次同步或偏移量不匹配时

  • PSYNC 命令:从节点使用 PSYNC 命令向主节点发起同步请求。如果是第一次连接,从节点会发送 PSYNC ? -1
  • 主节点执行 BGSAVE:主节点收到全量同步请求后,会在后台启动一个 bgsave 子进程来生成当前数据的 RDB 快照文件。
  • 复制缓冲区bgsave 期间,主节点依然会处理新的写命令。这些写命令会被缓存在内存中的一个叫做复制缓冲区 (Replication Buffer) 的区域里。
  • 发送 RDB 文件bgsave 完成后,主节点将 RDB 文件通过之前建立的连接发送给从节点。
  • 从节点加载 RDB:从节点接收到 RDB 文件后,会清空自身旧数据,然后将其加载到内存中,使自身数据状态达到主节点执行 bgsave 时的状态。
  • 发送缓冲区的写命令:主节点将复制缓冲区中记录的、在 bgsave 期间产生的所有写命令发送给从节点。
  • 从节点执行写命令:从节点执行这些写命令,最终使其数据库状态与主节点完全同步。

面试点睛:这里常问 “主节点在生成 RDB 期间的新写命令是如何处理的?” 一定要答出复制缓冲区的概念。

2. 部分复制 (Partial Resynchronization) - 用于断线重连后的增量同步

  • 复制偏移量 (Replication Offset):主从节点都会维护一个复制偏移量。主节点每次向从节点传播 N 个字节的数据,自己的偏移量就增加 N。从节点每次收到 N 个字节,偏移量也增加 N。
  • 复制积压缓冲区 (Replication Backlog):主节点内部维护了一个固定长度的、FIFO 的队列(默认 1MB)。主节点在传播命令时,不仅发给从节点,还会写一份到复制积压缓冲区
  • 断线重连:当从节点重新连上主节点时,会通过 PSYNC 命令将自己的偏移量 offset 发送给主节点。
  • 偏移量比对:主节点检查 offset
    • 如果 offset+1 之后的数据仍然存在于复制积压缓冲区中,则主节点回复 +CONTINUE,表示可以进行部分复制。
    • 随后主节点将复制积压缓冲区中从 offset+1 开始的所有数据发送给从节点。
    • 从节点执行这些命令,即可将数据同步至主节点的最新状态。

面试点睛:这部分是高频考点。一定要解释清楚 PSYNCoffsetbacklog 这三个核心概念是如何协同工作来实现高效的部分复制的。

第三阶段:命令传播 (Command Propagation)

当同步完成后,主从节点的数据达到一致状态。之后,主节点进入命令传播阶段。

  • 每当主节点接收到新的写命令时,除了自己执行,还会异步地将这个命令发送给所有从节点。
  • 从节点执行相同的命令,从而最终保持数据的一致性。

总结与升华

在回答的最后,可以进行总结并引申出相关话题,展示知识的广度:

  • 最终一致性:Redis 主从复制是异步的,这意味着主从数据存在短暂延迟,是最终一致性模型。延迟取决于网络、负载等因素。
  • 核心面试点
    1. 全量复制 vs 部分复制:理解它们的触发条件和过程,尤其是 PSYNC 机制。
    2. 核心组件复制偏移量 (offset)复制积压缓冲区 (backlog)复制缓冲区 (buffer) 的作用和区别。
    3. 异步复制:理解其优势和可能的数据丢失风险(主节点宕机且未同步到从节点的数据会丢失)。
  • 引申话题
    • 读写分离:基于主从复制,可以将写操作交给主节点,读操作分散到从节点,提升系统吞吐量。
    • 高可用基石:主从复制是 Redis Sentinel(哨兵)和 Redis Cluster(集群)实现故障自动转移(Failover)的基础。哨兵系统正是通过监控主从节点,并在主节点故障时自动将一个从节点提升为主节点来实现高可用。

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

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

相关文章

数据库开启ssl

数据库&#xff1a;阿里云rds 系统&#xff1a;centos 需要修改的&#xff1a;nacos连接项目连接本地navicat连接 重点&#xff1a;为了兼容本地和服务器&#xff0c;ssl证书路径由原来的绝对路径换成环境变量参数&#xff0c;所以有步骤4 文章目录步骤1 阿里云步骤2 navicat…

Redis 事件驱动与多路复用源码剖析

Redis 事件驱动与多路复用源码剖析1. 前言 Redis 是 单线程 I/O 多路复用 的典型代表。 它并不是多线程处理请求&#xff0c;而是依赖 事件驱动&#xff08;event-driven&#xff09;模型&#xff0c;在一个线程内高效管理海量连接。 核心组件&#xff1a; ae.c&#xff1a;事…

VR煤矿实训系统相较于传统煤矿培训方式的独特优势​-广州华锐互动

高度逼真&#xff0c;沉浸体验​VR煤矿实训系统运用先进的3D建模、动态仿真技术&#xff0c;对煤矿井下的复杂环境进行1:1还原。从幽深的巷道、运转的采煤设备&#xff0c;到潮湿的空气、昏暗的灯光&#xff0c;甚至细微的煤尘颗粒&#xff0c;都能逼真呈现。使用者戴上VR设备后…

javaweb XML DOM4J

XMLXML作用就是配置文件&#xff0c;properties使用不了较复杂的需求&#xff0c;xml应运而生配置文件对比 xml更方便tips1:新建resources目录&#xff0c;并将src中的jdbc.properties移到resourcs中&#xff0c;并且右键标记为源代码根目录&#xff0c;这样运行src时就会和pro…

多模态视频理解领域 Benchmark 与 Leaderboard 整理

多模态视频理解是当前人工智能领域的研究热点&#xff0c;其核心目标是让模型像人类一样&#xff0c;综合视频中的视觉、听觉&#xff08;部分场景&#xff09;及文本信息&#xff0c;实现对视频内容的深度感知、理解与推理。为客观评估模型性能&#xff0c;行业内涌现了众多权…

18j621-3通风天窗图集pdf(免费高清版)

18j621-3通风天窗已经替代05j621-3通风天窗图集成为目前比较通用的建筑屋顶通风选型重要参考标准&#xff0c;18j621-3图集是对前图集的优化和革新&#xff0c;在18j621-3图集中新增了TC8圆拱型电动采光天窗&#xff0c;丰富了屋面通风排烟设备的选型。在18j621-3天窗图集中&am…

LawGPT:基于中文法律知识的大模型

本文转载自&#xff1a;https://www.hello123.com/lawgpt ** 一、⚖️ LawGPT&#xff1a;中文法律界的 “AI 法助”&#xff0c;啃透了 15 万份判决书&#xff01; LawGPT 是一系列专攻中文法律知识的开源大模型&#xff0c;在通用中文基座&#xff08;如 ChatGLM&#xff0…

用 go-commons 快速写一个监控 CPU/内存的 Exporter

欢迎加入开源项目&#xff0c;提你的 mr Go Commons&#xff1a;Golang 开发者的常用工具集&#xff0c;一站式解决常见需求 在 Go 语言的开发过程中&#xff0c;你是不是经常遇到这样的情况&#xff1a; 想要做点小功能&#xff0c;却得从零写起&#xff0c;或者到处找三方…

KingbaseES客户端工具Ksql使用全指南:从安装到高级操作

引言 在国产数据库蓬勃发展的今天&#xff0c;KingbaseES凭借其自主可控、高性能、高可用的特性&#xff0c;已成为政务、金融、能源等关键领域的首选数据库。而作为其配套的命令行工具&#xff0c;Ksql更是DBA和开发人员的“瑞士军刀”——它不仅能高效执行SQL查询&#xff0c…

【LeetCode - 每日1题】可以输入的最大单词数

🌈 个人主页:(时光煮雨) 🔥 高质量专栏:vulnhub靶机渗透测试 👈 希望得到您的订阅和支持~ 💡 创作高质量博文(平均质量分95+),分享更多关于网络安全、Python领域的优质内容!(希望得到您的关注~) 🌵目录🌵 难度 ⭐⭐ 题目回顾 ✅解题思路 💖概述 💓核心…

3227. 字符串元音游戏

3227. 字符串元音游戏 题目链接&#xff1a;3227. 字符串元音游戏 代码如下&#xff1a; class Solution { public:bool doesAliceWin(string s) {return ranges::any_of(s, [](char c) {return c a || c e || c i || c o || c u;});} };

微信小程序坐标位置使用整理(四)map组件

一、地图上标点&#xff0c;marker 1.wxml <map id"map" scale"9" class"map"markers"{{markers}}" longitude"{{longitude}}" latitude"{{latitude}}" show-location"{{true}}"><cover-vie…

Parlant框架深度技术解析:革命性AI代理行为建模引擎

引言 在人工智能快速发展的今天&#xff0c;AI代理&#xff08;Agent&#xff09;技术已经成为连接人工智能与实际应用场景的重要桥梁。然而&#xff0c;传统的AI代理开发面临着诸多挑战&#xff1a;提示词工程的复杂性、行为不可预测性、工具调用的不确定性等问题严重制约了AI…

AI重构车载测试:从人工到智能的跨越

目录 一、AI 在车载测试中的核心价值 二、AI 在车载测试的具体应用场景 (一)自动驾驶测试:AI 解决 “场景覆盖” 与 “决策可靠性” 难题 (二)车机系统测试:AI 优化 “交互体验” 与 “功能稳定性” (三)车载硬件测试:AI 实现 “故障预测” 与 “精准校准” (四)功能…

从职责划分看架构:MVC 的 Controller 与 MVVM 的 ViewModel 差异

深入浅出&#xff1a;前端MVC与MVVM架构模式&#xff0c;你真的懂了吗&#xff1f;✨ 序言 各位前端的“程序猿”和“程序媛”们&#xff0c;大家好&#xff01;&#x1f44b; 在前端开发的江湖中&#xff0c;MVC和MVVM这两个词&#xff0c;就像武林秘籍一样&#xff0c;常常被…

Vue-color:Vue.js 专业颜色选择器组件库 – 支持Vue2/3,TypeScript,暗色主题

简介 Vue-color 是一个专为 Vue.js 设计的颜色选择器组件库&#xff0c;提供了多种风格的颜色选择器组件。它支持 Vue 2.7 和 Vue 3&#xff0c;具有 TypeScript 支持、SSR 兼容性和暗色主题支持。 特性 多种颜色选择器 – 提供 Chrome、Sketch、Photoshop 等多种风格Vue 2.…

ArcGIS定向影像(2)——非传统影像轻量级解决方案

ArcGIS能让用户自己低成本的做出谷歌街景吗&#xff1f;现在ArcGIS Pro 3.2 和 ArcGIS Enterprise 11.2 能够让用户不使用任何插件和扩展的情况下完成街景数据集的构建&#xff0c;数据管理&#xff0c;发布服务和调用的完整解决方案。非常体系化&#xff0c;由底层数据驱动&am…

CKA05--service

Task 重新配置 spline-reticulator namespace 中现有的 front-end Deployment&#xff0c;以公开现有容器 nginx 的端口 80/tcp 创建一个名为 front-end-svc 的新 Service &#xff0c;以公开容器端口 80/tcp 配置新的 Service &#xff0c;以通过 NodePort 公开各个 Pod 解析&…

用 Go 采集服务器资源指标:从原理到实践

在后端开发或运维工作中&#xff0c;采集服务器资源指标 是个绕不开的需求&#xff1a; 运维要看 CPU、内存、磁盘的使用情况监控系统要定期上报这些数据应用程序有时候也需要根据系统负载做限流、弹性伸缩 那么问题来了&#xff1a;用 Go 怎么优雅地采集这些指标呢&#xff…

安卓学习 之 上下文菜单的操作

先来认识一下上下文菜单是什么样子的&#xff1f;如图&#xff0c;当长按一个控件时弹出来的菜单叫做上下文菜单&#xff1a;图中第一个和第二个就是一个上下文菜单&#xff0c;第二个菜单里面还有一层菜单&#xff0c;这个上下文菜单被绑定到注册按钮中&#xff0c;也就是长按…