【Redis系列】我看你们项目用的Redis主从,数据同步了解吗

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 面试官:说说Redis数据同步。是这样的,Redis有一个叫命令传播的概念,如果像面试官说的这种场景,再使用上面我提到的AOF缓冲区就有点浪费内存空间了。所以Redis会将主服务器的这条Del删除命令
  • 👉以贴近现实的【面试官面试】形式帮助你系统学习后端技术
  • 📚本期博客为《Redis系列》
  • 创作不易,不妨点赞、收藏、关注支持一下
  • 🔥博客内容持续产出以下系列
    • 《Redis系列》
    • 《MySQL系列》
    • 《Kafka系列》
    • 《ZooKeeper系列》
    • 《多线程系列》
    • 《JVM系列》

alt

文章目录

  1. Redis数据同步过程
    1. 命令传播的作用
    2. 部分重同步
  2. 复制偏移量记录同步状态
  3. 服务器运行ID
  4. Redis心跳检测

1. Redis数据同步过程

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

嗯嗯了解的。数据同步主要是利用了RDB文件来进行数据同步。

  1. 首先,从服务器会先向主服务器发送SYNC命令
  2. 收到命令后,主服务器会执行BGSAVE命令来生成一个RDB文件,并使用AOF缓冲区来记录在生成期间执行的写命令
  3. 完成第二步后,主服务器会将RDB文件发送给从服务器,让从服务器同步RDB文件数据
  4. 当然这还没完,主服务器的AOF缓冲区还会发送给从服务器,让它们之间的数据同步至最终状态

alt


面试官思考中…


1.1 命令传播的作用

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

噢噢好的。是这样的,Redis有一个叫命令传播的概念。

如果像面试官说的这种场景,再使用上面我提到的AOF缓冲区就有点浪费内存空间了。所以Redis会将主服务器的这条Del删除命令,发送给从服务器

当从服务执行命令后,数据也就同步了。


面试官思考中…


1.2 部分重同步

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

不是的面试官。用的RDB来数据同步太消耗资源了,比如像CPU、内存、磁盘IO消耗。

如果是短时间断线,根本没有必要使用这么浪费资源的笨方法…

Redis它其实有一个叫PSYNC命令,主从服务器断线后,从服务器会发送一个PSYNC命令给主服务器。收到命令后主服务器会发送给从服务器断线期间执行的写命令

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


面试官思考中…


2. 复制偏移量记录同步状态

面试官:考你点深入些的,主服务器怎么知道断线期间执行了哪些命令呢?

emmmmm我想想。

其实每个Redis节点都有维护一个复制偏移量,例如主从服务器的初始偏移量都是0,主服务器发送给从服务器N字节数据,主从服务器的偏移量就会+N。

通过这种形式来记录同步状态。

另外主服务器不是会进行命令传播吗,同时它还会把命令传播的命令保存在一个有复制偏移量标识的复制积压缓冲区队列。

所以从服务器发送PSYNC命令同时发送复制偏移量,主服务器只要根据复制偏移量在队列中找到对应的命令就可以了。


面试官思考中…


3. 服务器运行ID

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

哦哦知道的,每个Redis节点都有自己的服务器运行ID。

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

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

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

所以此时主服务器会向从服务器发送RDB文件来进行数据同步,服务器运行ID主要是这个作用


面试官思考中…


4. Redis心跳检测

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

知道的,面试官。

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

REPLCONF ACK <replication_offset>

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

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

心跳检测也有检测命令丢失的功能。

alt

面试官抓抓脑袋,继续看你的简历......


得想想考点你不懂的😰

未完待续。。。

好了,今天的分享就先到这,我们下期《Redis系列》继续。

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

相关实践学习
基于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
相关文章
|
2月前
|
NoSQL 算法 安全
Redlock 算法-主从redis分布式锁主节点宕机锁丢失的问题
Redlock 算法-主从redis分布式锁主节点宕机锁丢失的问题
163 0
|
4月前
|
存储 监控 NoSQL
Redis 高可用之主从模式
上一节RDB和AOF持久化机制提到了 Redis 的持久性,也就是在服务器实例宕机或故障时,拥有再恢复的能力。但是在这个服务器实例宕机恢复期间,是无法接受新的数据请求。对于整体服务而言这是无法容忍的,因此我们可以使用多个服务器实例,在一个实例宕机中断时,另外的服务器实例可以继续对外提供服务,从而不中断业务。Redis 是如何做的呢?Redis 做法是**增加冗余副本**,**将一份数据同时保存在多个实例**上。那么如何保存各个实例之间的数据一致性呢?
47 0
Redis 高可用之主从模式
|
2天前
|
存储 NoSQL 算法
Redis持久化&Redis主从
Redis持久化&Redis主从
11 0
|
2天前
|
NoSQL Linux Redis
本地虚拟机centos7通过docker安装主从redis3.2
本地虚拟机centos7通过docker安装主从redis3.2
10 0
|
3天前
|
负载均衡 NoSQL 关系型数据库
深入浅出Redis(六):Redis的主从架构与主从复制原理
深入浅出Redis(六):Redis的主从架构与主从复制原理
|
14天前
|
监控 NoSQL Redis
Redis分区容错秘诀:解密主从模式
Redis主从模式用于提高高可用性、负载均衡和数据备份。主节点处理写入,从节点复制数据并分担读取,实现故障切换和读写分离。配置主从关系后,从节点连接主节点进行全量和增量复制。当主节点故障,从节点可接管服务。然而,主从延迟和数据不一致性是挑战,可通过优化网络、使用Sentinel和Redis Cluster等解决。关注“软件求生”获取更多内容。
47 1
Redis分区容错秘诀:解密主从模式
|
17天前
|
NoSQL Redis
Redis入门到通关之Redis主从数据同步原理
Redis入门到通关之Redis主从数据同步原理
26 0
|
17天前
|
NoSQL Redis Docker
使用Docker搭建Redis主从集群
使用Docker搭建Redis主从集群
32 1
|
17天前
|
NoSQL 网络安全 Redis
Redis 搭建主从集群
Redis 搭建主从集群
20 0
|
1月前
|
NoSQL Redis 开发工具
redis主从配置 安装详解
redis主从配置 安装详解
18 0