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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
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
相关文章
|
5月前
|
存储 缓存 NoSQL
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
redis分布式锁、redisson、可重入、主从一致性、WatchDog、Redlock红锁、zookeeper;Redis集群、主从复制,全量同步、增量同步;哨兵,分片集群,Redis为什么这么快,I/O多路复用模型——用户空间和内核空间、阻塞IO、非阻塞IO、IO多路复用,Redis网络模型
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
|
4月前
|
NoSQL 关系型数据库 MySQL
Redis集群和数据同步你了解多少
Redis集群和数据同步你了解多少
137 0
|
25天前
|
NoSQL Java API
springboot项目Redis统计在线用户
通过本文的介绍,您可以在Spring Boot项目中使用Redis实现在线用户统计。通过合理配置Redis和实现用户登录、注销及统计逻辑,您可以高效地管理在线用户。希望本文的详细解释和代码示例能帮助您在实际项目中成功应用这一技术。
28 3
|
2月前
|
消息中间件 NoSQL 关系型数据库
一文彻底搞定Redis与MySQL的数据同步
【10月更文挑战第21天】本文介绍了 Redis 与 MySQL 数据同步的原因及实现方式。同步的主要目的是为了优化性能和保持数据一致性。实现方式包括基于数据库触发器、应用层双写和使用消息队列。每种方式都有其优缺点,需根据具体场景选择合适的方法。此外,文章还强调了数据同步时需要注意的数据一致性、性能优化和异常处理等问题。
559 0
|
2月前
|
存储 NoSQL Java
Spring Boot项目中使用Redis实现接口幂等性的方案
通过上述方法,可以有效地在Spring Boot项目中利用Redis实现接口幂等性,既保证了接口操作的安全性,又提高了系统的可靠性。
49 0
|
6月前
|
存储 NoSQL Java
大事件后端项目34_登录优化----redis_SpringBoot集成redis
大事件后端项目34_登录优化----redis_SpringBoot集成redis
大事件后端项目34_登录优化----redis_SpringBoot集成redis
|
4月前
|
存储 JSON NoSQL
【redis数据同步】redis-shake数据同步全量+增量
【redis数据同步】redis-shake数据同步全量+增量
|
5月前
|
监控 NoSQL Ubuntu
|
5月前
|
存储 NoSQL API
Redis问题之ETCD进行秒杀活动的配置数据同步如何解决
Redis问题之ETCD进行秒杀活动的配置数据同步如何解决
|
5月前
|
前端开发 JavaScript NoSQL
软件开发常见流程之若依项目修改,前后端本地启动,本地必须有Redis+Navicate启动数据库
软件开发常见流程之若依项目修改,前后端本地启动,本地必须有Redis+Navicate启动数据库