百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

读书笔记-Redis主从库是如何实现数据一致的

mhr18 2024-11-06 10:59 17 浏览 0 评论

0 本节知识点

  • 主从同步的基本原理
  • 主从同步过程
  • 主从同步如何缓解主库压力
  • 主从同步时网络断链,redis是如何解决的

1. Redis主从库如何保证数据一致

1.1 Redis主从同步的基本原理

Redis提供了主从库模式,以保证数据副本的一致,主从库采用的是读写分离的方式

读操作: 主库,从库都可以接收

写操作: 首先到主库执行,然后,主库将写操作同步给从库

1.2 Redis主从库间是如何同步的

当启动多个Redis实例后,它们之间可以通过 replicaof(在5.0版本前使用slaveof命令)命令形成主库和从库的关系,通过3个阶段完成同步过程

第一个阶段 , 从库给主 库发送 psync命令,表示要进行数据同步,主库根据这个命令的参数来启动复制,psync 命令包含了主库的runID 和复制进度 offset 两个参数。

  • runID是每个Redis实例启动进都会自动生成的一个随机ID,用来唯一标记这个实例,当从库和主库第一次复制时,因为不知道主库的runID,所以将runID设置为?
  • offset 由于是第一次复制,所以设置为-1,表示为第一次复制

主库收到psync命令后,会用FULLRESYNC响应命令带上两个参数:主库runID和主库目前的复制进度offset,返回给从库,从库收到响应后,会记录下这两个参数

FULLRESYNC响应表示每一次复制,采用的时 全量复制

第二阶段,主库执行bgsave命令,生成 RDB文件,接着将文件发送给从库,从库收到RDB文件后,会先清空当前数据库,然后加载RDB文件,主库将数据同步给从库的过程中,主 库不会阻塞,仍然可以接收到新的请求, 主库会在内存中用专门的 replication buffer记录RDB文件生成后收到的所有写请求

第三阶段

主库会把第二阶段执行过程中新收到的写命令,再发送给从库,从库再执行这些写操作

可能遇到的问题

  • 如果RDB文件过大,从库数量多,对主库有影响,如何解决?
  • 在第三阶段时,如果出现网络断链,是增量复制还是全量复制?

1.3 主从级联模式分担全量复制时的主库压力

在一次全量复制时,对于主库来说有2个耗时操作 生成RDB文件传输RDB文件

如果从库数量多,主库忙于fork子进程生成RDB文件,fork这个操作会阻塞主线程处理正常请求,此外传输 RDB文件也会占用主库的网络带宽

使用主-从-从模式,以级联方式,来解决上面的问题

1.4 Redis中主从库间网络断了怎么办?

在 2.8版本前,如果主从库在命令传播时出现了网络闪断,那么从库就会和主库重新进行一次全量复制,开销较大

在2.8版本,网络断了后,主从库会采用增量复制的方式继续同步, 主库会在断链期间接收到的写请求写入到 replication buffer中,同时也会写入repl_backlog_buffer这个缓冲区,repl_backlog_buffer是一个环形缓冲区,主库记录自己写到的位置,从库记录自己已经读到的位置

在刚开始时,主库和从库写读位置在一起,随着主库不断接收新的写操作,主库的偏移量会越来越大,对于主库来说,对应的偏移量就是master_repl_offset,对于从库来说,对应的偏移量slave_repl_offset,正常情况下,这两个偏移量 基本相等


当主从库的网络恢复时,从库首先会发送psync命令,并把自己当前的slave_repl_offset发送给主库,主库会判断 master_repl_offsetslave_repl_offset的差距,主库会把master_repl_offsetslave_repl_offset之间的写命令发送给从库

注意

由于 repl_backlog_buffer是一个环形缓冲区,如里从库的读取速度比较慢,可能会导致从库还未读取就被主库新写的操作覆盖了,会导致主从数据不一致,所以需要调整 repl_backlog_size参数大小,通常设置成缓冲空间的2倍,如里并发较大,则可以调整到更大

1.6 Redis同步的3种模式

  • 全量复制
  • 基于长链接的命令传播
  • 增量复制



相关推荐

B站收藏视频失效?mybili 收藏夹备份神器完整部署指南

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:羊刀仙很多B站用户都有过类似经历:自己精心收藏的视频突然“消失”,点开一看不是“已被删除”,就是“因UP主设置不可见”。而B站并不会主动通知...

中间件推荐初始化配置

Redis推荐初始化配置bind0.0.0.0protected-modeyesport6379tcp-backlog511timeout300tcp-keepalive300...

Redis中缓存穿透问题与解决方法

缓存穿透问题概述在Redis作为缓存使用时,缓存穿透是常见问题。正常查询流程是先从Redis缓存获取数据,若有则直接使用;若没有则去数据库查询,查到后存入缓存。但当请求的数据在缓存和数据库中都...

后端开发必看!Redis 哨兵机制如何保障系统高可用?

你是否曾在项目中遇到过Redis主服务器突然宕机,导致整个业务系统出现数据读取异常、响应延迟甚至服务中断的情况?面对这样的突发状况,作为互联网大厂的后端开发人员,如何快速恢复服务、保障系统的高可用...

Redis合集-大Key处理建议

以下是Redis大Key问题的全流程解决方案,涵盖检测、处理、优化及预防策略,结合代码示例和最佳实践:一、大Key的定义与风险1.大Key判定标准数据类型大Key阈值风险场景S...

深入解析跳跃表:Redis里的"老六"数据结构,专治各种不服

大家好,我是你们的码农段子手,今天要给大家讲一个Redis世界里最会"跳科目三"的数据结构——跳跃表(SkipList)。这货表面上是个青铜,实际上是个王者,连红黑树见了都要喊声大哥。...

Redis 中 AOF 持久化技术原理全解析,看完你就懂了!

你在使用Redis的过程中,有没有担心过数据丢失的问题?尤其是在服务器突然宕机、意外断电等情况发生时,那些还没来得及持久化的数据,是不是让你夜不能寐?别担心,Redis的AOF持久化技术就是...

Redis合集-必备的几款运维工具

Redis在应用Redis时,经常会面临的运维工作,包括Redis的运行状态监控,数据迁移,主从集群、切片集群的部署和运维。接下来,从这三个方面,介绍一些工具。先来学习下监控Redis实时...

别再纠结线程池大小 + 线程数量了,没有固定公式的!

我们在百度上能很轻易地搜索到以下线程池设置大小的理论:在一台服务器上我们按照以下设置CPU密集型的程序-核心数+1I/O密集型的程序-核心数*2你不会真的按照这个理论来设置线程池的...

网络编程—IO多路复用详解

假如你想了解IO多路复用,那本文或许可以帮助你本文的最大目的就是想要把select、epoll在执行过程中干了什么叙述出来,所以具体的代码不会涉及,毕竟不同语言的接口有所区别。基础知识IO多路复用涉及...

5分钟学会C/C++多线程编程进程和线程

前言对线程有基本的理解简单的C++面向过程编程能力创造单个简单的线程。创造单个带参数的线程。如何等待线程结束。创造多个线程,并使用互斥量来防止资源抢占。会使用之后,直接跳到“汇总”,复制模板来用就行...

尽情阅读,技术进阶,详解mmap的原理

1.一句话概括mmapmmap的作用,在应用这一层,是让你把文件的某一段,当作内存一样来访问。将文件映射到物理内存,将进程虚拟空间映射到那块内存。这样,进程不仅能像访问内存一样读写文件,多个进程...

C++11多线程知识点总结

一、多线程的基本概念1、进程与线程的区别和联系进程:进程是一个动态的过程,是一个活动的实体。简单来说,一个应用程序的运行就可以被看做是一个进程;线程:是运行中的实际的任务执行者。可以说,进程中包含了多...

微服务高可用的2个关键技巧,你一定用得上

概述上一篇文章讲了一个朋友公司使用SpringCloud架构遇到问题的一个真实案例,虽然不是什么大的技术问题,但如果对一些东西理解的不深刻,还真会犯一些错误。这篇文章我们来聊聊在微服务架构中,到底如...

Java线程间如何共享与传递数据

1、背景在日常SpringBoot应用或者Java应用开发中,使用多线程编程有很多好处,比如可以同时处理多个任务,提高程序的并发性;可以充分利用计算机的多核处理器,使得程序能够更好地利用计算机的资源,...

取消回复欢迎 发表评论: