突破Java面试(23-4) - 再深入Redis Replication的完整执行流程及原理

简介: 0 Github1 复制的完整流程slave node启动,仅仅保存master node的信息,包括master node的host和ip,但复制流程尚未开始master host和ip配置在 redis.

0 Github

1 复制的完整流程

  1. slave node启动,仅仅保存master node的信息,包括master node的hostip,但复制流程尚未开始master host和ip配置在 redis.conf 中的 slaveof
  2. slave node内部有个定时任务,每s 检查是否有新的master node要连接和复制,若发现,就跟master node建立socket网络连接
  3. slave node发送ping命令给master node
  4. 口令认证 - 若master设置了requirepass,那么salve node必须同时发送masterauth的口令认证
  5. master node第一次执行全量复制,将所有数据发给slave node
  6. master node后续持续将写命令,异步复制给slave node
  • 完整复制的基本流程图

2 数据同步相关的核心机制

即第一次slave连接msater时,执行的全量复制过程中你必须知道的一些细节

2.1 master和slave都会维护一个offset

master会在自身基础上累加offset,slave亦是

slave每秒都会上报自己的offset给master,同时master保存每个slave的offset

倒不是说特定就用在全量复制场景,主要是master和slave都要知道各自的数据的offset,才能知晓互相之间的数据不一致的情况

2.2 backlog

master node有一个backlog,默认是1MB

master node给slave node复制数据时,也会将数据在backlog中同步写一份

backlog主要是用来做全量复制中断时候的增量复制

2.3 master run id

info server,可以看到master run id

如果根据host+ip定位master node,是不靠谱的,如果master node重启或者数据出现了变化,那么slave node应该根据不同的run id区分,run id不同就做全量复制

如果需要不更改run id重启redis,可以使用

redis-cli debug reload

2.4 psync

从节点使用psync从master node复制,psync runid offset

master node会根据自身的情况返回响应信息

  • 可能是FULLRESYNC runid offset触发全量复制
  • 可能是CONTINUE触发增量复制

3 全量复制

  1. master执行bgsave,在本地生成一份RDB快照client-output-buffer-limit slave 256MB 64MB 60
  2. master node将RDB快照发送给salve node,若RDB复制时间超过60秒(repl-timeout),那么slave node就会认为复制失败,可适当调大该参数(对于千兆网卡的机器,一般每秒传输100MB,6G文件,很可能超过60s)
  3. master node在生成RDB时,会将所有新的写命令缓存在内存中,在salve node保存了rdb之后,再将新的写命令复制给salve node
  4. 若在复制期间,内存缓冲区持续消耗超过64MB,或者一次性超过256MB,那么停止复制,复制失败
  5. slave node接收到RDB之后,清空自己的旧数据,然后重新加载RDB到自己的内存中,同时基于旧的数据版本对外提供服务
  6. 如果slave node开启了AOF,那么会立即执行BGREWRITEAOF,重写AOF

RDB生成、RDB通过网络拷贝、slave旧数据的清理、slave aof rewrite,很耗费时间

如果复制的数据量在4G~6G之间,那么很可能全量复制时间消耗到1分半到2分钟

5 增量复制

  1. 如果全量复制过程中,master-slave网络连接中断,那么salve重连master时,会触发增量复制
  2. master直接从自己的backlog中获取部分丢失的数据,发送给slave node
  3. msater就是根据slave发送的psync中的offset来从backlog中获取数据的

5 heartbeat

主从节点互相都会发送heartbeat信息

master默认每隔10秒发送一次heartbeat,salve node每隔1秒发送一个heartbeat

6 异步复制

master每次接收到写命令之后,先在内部写入数据,然后异步发送给slave node

参考

《Java工程师面试突击第1季-中华石杉老师》

目录
相关文章
|
4月前
|
存储 缓存 NoSQL
Redis常见面试题全解析
Redis面试高频考点全解析:从过期删除、内存淘汰策略,到缓存雪崩、击穿、穿透及BigKey问题,深入原理与实战解决方案,助你轻松应对技术挑战,提升系统性能与稳定性。(238字)
|
存储 缓存 NoSQL
Redis 服务器全方位介绍:从入门到核心原理
Redis是一款高性能内存键值数据库,支持字符串、哈希、列表等多种数据结构,广泛用于缓存、会话存储、排行榜及消息队列。其单线程事件循环架构保障高并发与低延迟,结合RDB和AOF持久化机制兼顾性能与数据安全。通过主从复制、哨兵及集群模式实现高可用与横向扩展,适用于现代应用的多样化场景。合理配置与优化可显著提升系统性能与稳定性。
609 0
|
6月前
|
前端开发 Java API
2025 年 Java 全栈从环境搭建到项目上线实操全流程指南:Java 全栈最新实操指南(2025 版)
本指南涵盖2025年Java全栈开发核心技术,从JDK 21环境搭建、Spring Boot 3.3实战、React前端集成到Docker容器化部署,结合最新特性与实操流程,助力构建高效企业级应用。
1958 1
|
6月前
|
消息中间件 Java Kafka
Java 事件驱动架构设计实战与 Kafka 生态系统组件实操全流程指南
本指南详解Java事件驱动架构与Kafka生态实操,涵盖环境搭建、事件模型定义、生产者与消费者实现、事件测试及高级特性,助你快速构建高可扩展分布式系统。
328 7
|
6月前
|
消息中间件 Java 数据库
Java 基于 DDD 分层架构实战从基础到精通最新实操全流程指南
本文详解基于Java的领域驱动设计(DDD)分层架构实战,结合Spring Boot 3.x、Spring Data JPA 3.x等最新技术栈,通过电商订单系统案例展示如何构建清晰、可维护的微服务架构。内容涵盖项目结构设计、各层实现细节及关键技术点,助力开发者掌握DDD在复杂业务系统中的应用。
1195 0
|
7月前
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
219 0
|
6月前
|
Java 编译器
Java 17 Switch表达式:更简洁、更强大的流程控制
Java 17 Switch表达式:更简洁、更强大的流程控制
771 111
|
5月前
|
存储 SQL NoSQL
Redis-常用语法以及java互联实践案例
本文详细介绍了Redis的数据结构、常用命令及其Java客户端的使用,涵盖String、Hash、List、Set、SortedSet等数据类型及操作,同时提供了Jedis和Spring Boot Data Redis的实战示例,帮助开发者快速掌握Redis在实际项目中的应用。
385 1
Redis-常用语法以及java互联实践案例
|
6月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
744 64
|
6月前
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
335 3