考考你Redis主从,就知道有没深入Redis

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 大家好,我是南哥。一个对Java程序员进阶成长颇有研究的人,今天继续给大家带来新的一篇Java进阶指南。如果是单机版的数据库,像MySQL、Redis,看起来实现并不复杂。只要支持保存一条数据,同时要能够查询出来。但如果是多机版的数据库呢,各个节点的配合联调是比较复杂的过程,看起来就不是那么简单喽。要考你对Redis深不深入理解,问问Redis多机版相关的问题就知道了。我们今天就来指南下Redis主从架构。

大家好,我是南哥。

一个对Java程序员进阶成长颇有研究的人,今天继续给大家带来新的一篇Java进阶指南。

如果是单机版的数据库,像MySQL、Redis,看起来实现并不复杂。只要支持保存一条数据,同时要能够查询出来。但如果是多机版的数据库呢,各个节点的配合联调是比较复杂的过程,看起来就不是那么简单喽。要考你对Redis深不深入理解,问问Redis多机版相关的问题就知道了。

我们今天就来指南下Redis主从架构。

1. Redis数据同步

1.1 数据同步过程

面试官:我看你们项目用的Redis主从,数据同步了解吗?

回答数据同步过程问题前,大家有没想过为什么Redis要数据同步?不会是MySQL主从架构要数据同步,Redis就照猫画虎吧。

虽然这两者有关系型数据库和非关系型数据库的差异,但都是作为存储数据的数据库系统。而主从架构的目的就在于对数据有多个"备份",有了多个"备份",就自然而然衍生出众多好处。如负载均衡、灾难恢复、数据备份。

既然要"备份",那数据同步就必不可少了。Redis主从数据同步大致的过程如下。

  1. 首先,从服务器会先向主服务器发送SYNC命令
  2. 收到命令后,Redis主服务器会执行BGSAVE命令来生成一个RDB文件,并使用AOF缓冲区来记录在生成期间执行的写命令。关于BGSAVE命令和SAVE命令的区别,大家可以往前阅读我写的Redis系列文章。
  3. 完成第二步后,主服务器会将RDB文件发送给从服务器,让从服务器同步RDB文件数据。
  4. 当然这还没完,在生成RDB文件的过程中,仍然会有其他写命令到达服务器。Redis主服务器的AOF缓冲区会继续发送给从服务器,让它们之间的数据同步至最终状态

在这里插入图片描述

1.2 命令传播

面试官:按你这么说,数据同步后主服务器某个键删除了,数据又不同步了怎么办?

有了AOF缓冲区的概念还没完,Redis主从复制还有一个命令传播的概念等着你去学。

从服务器使用SYNC进行初次数据同步后,主、从服务器的数据库状态并不是每时每刻都保持一致的,这种情况反而是常态。肯定不能为了一条写指令的差异就重新执行SYNC命令,因为SYNC命令是一个非常耗费资源的操作。

这种情况Redis主服务器会将造成主从服务器数据不一致的写命令,即最近执行的写命令,发送给从服务器执行。这便是命令传播的过程,当从服务器执行命令后,主从服务器的数据库状态也就保持了一致。

如果后续有新的命令写入主服务器,主服务器会继续重复命令传播的过程。

1.3 部分重同步

面试官:如果主从服务器断线呢?还是用的RDB来同步吗?

主从服务器断线的话,假设你是Redis开发者,要怎么高效地恢复主、从服务器数据同步的状态。

如果还是用的RDB文件来同步,也太浪费资源了。有可能只是短时间断线,执行的写命令不过几十个,上文我已经提到SYNC命令是很耗费资源的一种操作。

能不能有一支记号笔,在主、从服务器断线时在主服务器的命令队列画下一个记号?

其实Redis除了提供SYNC命令的支持,还有一个叫PSYNC命令

主从服务器断线后,Redis从服务器会发送一个PSYNC命令给主服务器。收到命令后主服务器会将两者断线期间执行的写命令一条不剩地发送给从服务器。

从服务器执行命令后,主、从服务器的数据也就同步了。这种同步方式也叫部分重同步

1.4 复制偏移量

面试官:那主服务器怎么知道断线期间执行了哪些命令?

提前剧透下,前面提到的记号笔就是复制偏移量,命令队列也就是复制积压缓冲区队列

Redis主、从服务器都会去维护一个复制偏移量,复制偏移量是什么?例如主从服务器的初始偏移量都是0,主服务器发送给从服务器N字节数据后,主从服务器的偏移量就会 + N。复制偏移量通过该数值来代表主服务器发送给从服务器的字节总量

通过复制偏移量就可以来记录同步状态。

Redis其实有是一个容器来存储命令传播的写命令,命令传播的命令保存在一个有复制偏移量标识的复制积压缓冲区队列。

从服务器发送PSYNC命令给主服务器,还会同时发送从服务器的复制偏移量。主服务器只要根据该复制偏移量在复制积压缓冲区队列中找到对应的命令,就可以发送相关命令给到从服务器。

2. 服务器运行ID

面试官:知道服务器运行ID吗?

每个Redis节点都有自己的服务器运行ID,这个ID由服务器启动时自动生成。

当从服务器对主服务器进行初次复制时,主服务器会将自己的运行ID传送给从服务器,而从服务器则会将这个运行ID保存起来。

当断线后数据同步时,从服务器会向当前连接的主服务器发送之前保存的主服务器运行ID

如果此时主服务器发现从服务器发送的运行ID与自己的不一致。那就说明此时的主服务器是新的主服务器,它也没有复制积压缓冲区队列,也就不能进行部分重同步。此时Redis主服务器会向从服务器发送RDB文件来进行数据同步。

3. Redis心跳检测

面试官:Redis心跳检测知道吧?

从服务器默认会每秒一次向主服务器发送心跳检测命令,如果主服务器超过1s没有收到replconf命令,说明主从服务器的网络连接有问题了。

以下是心跳检测命令。

REPLCONF ACK <replication_offset>

同时这个心跳检测命令还会附带传送一个复制偏移量,也就是上文的replication_offset

在心跳检测时的过程中,如果主服务器发现他们的复制偏移量不一致,就会通过该偏移量找到从服务器丢失的写命令,从而发送给从服务器保持同步。

到这我们就知道了,心跳检测不仅仅能让主服务器检测从服务器是否存活。Redis开发者很聪明,在从服务器发送心跳检测命令时添加复制偏移量,让心跳检测也具有检测命令丢失的功能。

在这里插入图片描述
本文收录在我开源的《Java学习面试指南》中,目前已经更新有近200道面试官常考的面试题,涵盖了Java系列、Redis系列、MySQL系列、多线程系列、Kafka系列、JVM系列、ZooKeeper系列等等。GitHub地址:https://github.com/hdgaadd/JavaGetOffer,相信你看了一定会有所收获。

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
存储 NoSQL Redis
08- 什么是 Redis 主从同步?
Redis主从同步是种数据备份机制,Slave从Master获取全量数据,之后持续接收增量更新。全量复制阶段包括Slave请求同步、Master拒绝增量并发送RDB到Slave、Slave加载RDB。增量复制阶段,Master使用repl_backlog存储命令并发送给Slave,Slave执行这些命令以保持与Master同步。该机制确保主从数据一致性,支持多个Slave和一个Master。
43 0
|
1月前
|
NoSQL 算法 安全
Redlock 算法-主从redis分布式锁主节点宕机锁丢失的问题
Redlock 算法-主从redis分布式锁主节点宕机锁丢失的问题
189 0
|
11天前
|
缓存 运维 NoSQL
Redis主从模式部署
Redis主从模式部署
34 4
|
2天前
|
缓存 NoSQL Redis
Redis主从架构
当看到图示中红色标记的,就代表从节点挂载成功了。
8 0
|
1月前
|
负载均衡 NoSQL 网络协议
Redis(主从模式)
Redis(主从模式)
36 1
|
14天前
|
NoSQL Redis
Redis主从结构,主库宕机,解决
Redis主从结构,主库宕机,解决
16 0
|
1月前
|
监控 NoSQL Redis
Redis分区容错秘诀:解密主从模式
Redis主从模式用于提高高可用性、负载均衡和数据备份。主节点处理写入,从节点复制数据并分担读取,实现故障切换和读写分离。配置主从关系后,从节点连接主节点进行全量和增量复制。当主节点故障,从节点可接管服务。然而,主从延迟和数据不一致性是挑战,可通过优化网络、使用Sentinel和Redis Cluster等解决。关注“软件求生”获取更多内容。
154 1
Redis分区容错秘诀:解密主从模式
|
20天前
|
消息中间件 NoSQL Linux
详解Redis的主从同步原理
只不过在主节点中叫做master_repl_offset; 从节点也有一个偏移量叫做slave_repl_offset,用来记录从节点已经从主节点的repl_backlog_buffer中同步到的最新写指令的位置;
173 0
|
22天前
|
存储 NoSQL 网络协议
主从复制,Could not connect to Redis at 127.0.0.1:6380: Connection refusednot connected> exit,1.主从模式如何指
主从复制,Could not connect to Redis at 127.0.0.1:6380: Connection refusednot connected> exit,1.主从模式如何指
|
1月前
|
消息中间件 NoSQL Java
【Redis系列】我看你们项目用的Redis主从,数据同步了解吗
面试官:说说Redis数据同步。是这样的,Redis有一个叫命令传播的概念,如果像面试官说的这种场景,再使用上面我提到的AOF缓冲区就有点浪费内存空间了。所以Redis会将主服务器的这条Del删除命令
65 2
【Redis系列】我看你们项目用的Redis主从,数据同步了解吗

相关产品

  • 云数据库 Redis 版