Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >redis之主从库同步

redis之主从库同步

作者头像
编程黑洞
发布于 2023-03-06 11:28:51
发布于 2023-03-06 11:28:51
6520
举报
文章被收录于专栏:编程黑洞编程黑洞

# 0. 前言

在单点故障后,我们需要保证服务不间断,所以需要使用冗余的副本提供集群服务,从而达到服务的高可用。redis 提供了主从库数据同步机制,从而保证数据副本的一致性,而主从库使用的是读写分离的机制。

# 1. 读写分离模式

通过该模式构建多个数据副本,使用读写分离的方式

  • 读操作: 主从库都可以进行读取。
  • 写操作: 先写入到主库,在同步到从库。

为什么要读写分离呢?

如果从库也可以进行写操作,那么主从库在同一个 key 中存储的值可能会不一致,如果要保证一致性,需要通过加锁来解决,但这样会造成性能的损耗。

但如果只有主库写入,在同步给从库,则能保证所有实例中数据的一致性。

# 2. 全量复制

# 2.1 主从库同步的过程

第一阶段

从库向主库发送psync命令进行数据同步,该命令包含主库的runID和复制进度offset

  • runID,每个实例自动生成的随机 ID,第一次从库不知道主库 runID,设置为?
  • offset,记录复制的进度,第一次进度设置为-1

主库会回复 runID 和 offset 给从库

第二阶段

主从第一次同步是采用全量复制的方式,主库生成 RDB 文件,然后发送给从库,从库清空当前数据再读入 RDB 文件完成第一次同步。

在生成 RDB 文件时,还是会有新的操作的会进行,为了保持数据的一致性,会将新的操作记录到 replication buffer 中。

第三阶段

RDB 文件发送到从库后,再 replication buffer 中的操作再发送给从库。

# 2.2 如何减少主从同步时,对主库的压力?

主从同步有哪些压力?

  • 生成 RDB,这个操作会 fork 子进程,会阻塞主线程的正常请求。
  • 传输 RDB,会占用主库的网络带宽

主-从-从模式

可以手动选择一个从库(比如选择内存资源配置较高的从库),用于级联其他的从库。由从库生成 RDB 再传输给从库,减少了主库的压力。

在主库全量复制之后,会维护一个长连接,后需的操作命令通过该连接同步给从库

# 3. 增量复制

全量复制是通过生成 RDB 发送到从库然后进行读取后进行同步。我们知道生成 RDB 本身就是一个消耗 CPU 的操作,并且存在阻塞主线程的风险,所以我们需要尽量少的执行全量复制的操作。

所以在第一次使用 RDB 全量复制后,主从库会建立一个长连接,主库收到的新命令会再同步到从库,这样就避免频繁全量复制。

但是有一个风险点是,如果过程发生了网络中断或者阻塞,该如何解决?

# 3.1 增量复制的过程

当主从连接时,会将新的操作的命令写入 replication bufferrepl_backlog_buffer 缓冲区中

repl_backlog_buffer 是一个环形缓冲区,主库会记录当前的偏移量 master_repl_offset,记录自己写到的位置,而从库在上面也有对应的偏移量 slave_repl_offset,记录自己正在读到的偏移量。

在恢复连接时,从库会通过 psync 命令将自己的偏移量 slave_repl_offset 发送给主库,主库会将 slave_repl_offsetmaster_repl_offset 之间的命令同步给从库即可。

举了例子: 主库和从库之间相差了 put d e 和 put d f 两个操作,在增量复制时,主库只需要把它们同步给从库,就行了。

因为 replication buffer 是一个环形的缓存,当主从库长期断开时,是有可能被覆盖掉旧的数据,这个时候是会重新发起全量复制,主库根据从库发送的 slave_repl_offset 来判断是增量还是全量的复制。

那为什么全量复制使用 RDB 而不是使用 AOF 呢?

  • RDB 文件是经过压缩的二进制文件,AOF 文件是记录每一次的操作,包含对同一个 key 的多次冗余操作,文件比 RDB 要大的多,使用 AOF 可以减少带宽
  • RDB 是二进制数据,从库还原速度快。而 AOF 需要依次重放每一个命令,恢复速度慢。

# 4. 参考文章

  • 本文主要是学习《极客时间-redis 核心技术与实战》专栏总结而来
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Redis:主从库模式、哨兵和分片集群
Redis提供了主从库模式,增加冗余的副本来提高Redis集群的高可靠性。主从库之间采用读写分离的方式,写请求只能在主库,读请求在主从库都可以完成。
睡魔的谎言
2020/11/12
1.9K0
从高可用看redis的改革与创新
我们一般使用redis作为缓存来提高我们的应用性能,我们听过很多redis的功能:主从复制,主从切换,持久化(RDB,AOF,AOF重写),今天我们从降低redis服务的不可用的角度来讲解,redis从单体到集群架构的演进过程,以及这些功能的运用。
灬沙师弟
2023/03/07
3270
从高可用看redis的改革与创新
Redis高可用全景一览
在一篇高赞回答中讲述了建立“外脑”是关键,文章观点认为:大脑是用来思考的,不是用来记忆的。
杨同学technotes
2023/02/24
5210
Redis高可用全景一览
数据同步:主从库如何实现数据一致?
Redis 发生了宕机,它们可以分别通过回放日志和重新读入 RDB 文件的方式恢复数据,从而保证尽量少丢失数据,提升可靠性。不过,即使用了这两种方法,也依然存在服务不可用的问题。比如说,在实际使用时只运行了一个 Redis 实例,那么,如果这个实例宕机了,它在恢复期间,是无法服务新来的数据存取请求的。
刺槐儿
2023/11/28
4620
redis主从架构
以上架构,如果从库较多,那么会导致主库过多的在处理主从同步工作,可以选取性能比较好的从库,作为二级主库,实现 主-从-从 的模式,分摊主库的同步工作
少羽大怪兽
2020/12/03
5530
redis主从架构
Redis 面霸篇:从高频问题透视核心原理
「码哥字节」从高频面试问题跟大家一起横扫 Redis 核心知识点,从根本上理解 Redis ,不做八股文的工具人,做扭转乾坤的大神。
码哥字节
2021/07/19
7470
Redis 高可用篇:你管这叫主从架构数据同步原理?
在《Redis 核心篇:唯快不破的秘密》中,「码哥」揭秘了 Redis 五大数据类型底层的数据结构、IO 模型、线程模型、渐进式 rehash 掌握了 Redis 快的本质原因。
码哥字节
2021/03/16
7380
读者诉苦:Redis 宕机,数据丢了,老板要辞退我
最近跟一位读者聊天,小哥非常郁闷,公司的Redis宕机了,线上业务受到了影响,老板非常愤怒,小哥担心会不会被辞退!
微观技术
2021/12/01
3820
读者诉苦:Redis 宕机,数据丢了,老板要辞退我
Redis集群架构----主从复制
上次我们看了CAP定理,以及CP,AP架构的原则,这篇文章主要聊下redis的几种集群架构方式。以及对应的架构原则。
袁新栋-jeff.yuan
2022/05/05
3140
Redis集群架构----主从复制
Redis主从复制与优化
每个redis节点启动后都会动态分配一个40位的十六进制字符串为运行ID。运行ID的主要作用是来唯一识别redis节点,比如从节点保存主节点的运行ID识别自已正在复制是哪个主节点。如果只使用ip+port的方式识别主节点,那么主节点重启变更了整体数据集(如替换RDB/AOF文件),从节点再基于偏移量复制数据将是不安全的,因此当运行ID变化后从节点将做全量复制。可以在info server命令查看当前节点的运行ID。
用户2781897
2020/12/15
2910
Redis 运维实战 第01期:Redis 复制
从这篇文章开始,将出几期 Redis 运维实战相关的内容,大致包括:Redis 主从、Redis 集群、持久化、大 key、热 key、Redis 监控以及 Redis 规范等。
数据库交流
2022/04/25
3140
Redis 运维实战 第01期:Redis 复制
【云原生进阶之PaaS中间件】第一章Redis-2.3.1主从复制部署模式
        Redis在日常部署的时候,可以有多种部署模式:单机、主从、哨兵、集群(分区分片),因此本文将对上面这四种模式进行详细的讲解,特别是集群模式将进行最细致的讲解(现行普遍使用的方式)。
江中散人_Jun
2023/10/16
3400
【云原生进阶之PaaS中间件】第一章Redis-2.3.1主从复制部署模式
路上,小胖问我:Redis 主从复制原理是怎样的?
我负责我司的报表系统,小胖是我小弟。随着业务量的增加,单实例顶不住,我就搭建了多个 Redis 实例,实现主从模式。
JavaFish
2021/04/30
4160
路上,小胖问我:Redis 主从复制原理是怎样的?
redis学习笔记(四)主从数据同步
在redis恢复数据时我们可以依赖于aof日志或rdb日志,但是redis在运行中该如何保证服务的可靠性,就需要依赖redis主从和哨兵集群。
虞大大
2021/01/03
1.1K0
redis灵魂拷问:聊一聊主从复制缓冲区
在我之前《redis灵魂拷问:怎样搭建一个哨兵主从集群》搭建的集群主从哨兵集群,有1个主节点和2个从节点环境如下表:
jinjunzhu
2020/11/04
1.4K0
redis灵魂拷问:聊一聊主从复制缓冲区
Redis从入门到放弃(7):主从复制
主从复制是Redis的一项重要特性,用于将一个Redis服务器(Master主节点)的数据复制到其他Redis服务器(Slave从节点),以实现数据的高可用性和读写分离。数据的复制是单向的,只能由主节点到从节点。
夕阳也是醉了
2023/10/16
2350
Redis从入门到放弃(7):主从复制
Redis 学习笔记(五)高可用之主从模式
上一节提到了 Redis 的持久性,也就是在服务器实例宕机或故障时,拥有再恢复的能力。但是在这个服务器实例宕机恢复期间,是无法接受新的数据请求。对于整体服务而言这是无法容忍的,因此我们可以使用多个服务器实例,在一个实例宕机中断时,另外的服务器实例可以继续对外提供服务,从而不中断业务。Redis 是如何做的呢?Redis 做法是增加冗余副本,将一份数据同时保存在多个实例上。那么如何保存各个实例之间的数据一致性呢?Redis 采用主从库读写分离模式来保证数据副本的一致性。
归思君
2023/10/16
3690
Redis 学习笔记(五)高可用之主从模式
Redis之主从复制1
前面的两篇文章给大家介绍了Redis的两种持久化方式RDB和AOF,两种方式各有各的优缺点,本文给大家介绍Redis的主从复制,算是Redis的第三种持久化方式。
用户4919348
2019/04/02
3480
Redis之主从复制1
救命!只有我还不明白Redis主从复制的原理吗?
大家好,我是小❤,一个漂泊江湖多年的 985 非科班程序员,曾混迹于国企、互联网大厂和创业公司的后台开发攻城狮。
xin猿意码
2023/11/08
5110
救命!只有我还不明白Redis主从复制的原理吗?
Redis 主从同步原理
**主从同步,就是将数据冗余备份,主库(Master)将自己库中的数据,同步给从库(Slave)。**
仁扬
2023/07/27
2740
相关推荐
Redis:主从库模式、哨兵和分片集群
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档