redis驯不好,骑你头上跑

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: redis驯不好,骑你头上跑

前言:

你认为的主从关系:

实际上的主从关系:

哈哈~以上图片大家图一乐~ 你以为主从关系之间就是主在指导着全部,但是其实不是。在redis主从关系中,主从相辅相成。今天小面就和大家一起来唠一下redis主从复制的原理

正文:

什么情况下需要redis主从复制?

其实现在生产上,我们对于redis肯定是需要高可用的,为了防止一台机器挂掉,或者是网络崩了。比如主从复制,哨兵,集群。我们今天的主题就是主从复制,主从复制就是得到了数据备份和读写分离两个功能。

实现主从复制

假设我们有俩redis,A(master)与B(Slave) 我们使用SLAVEOF 去实现主从复制

Aip:6379>SLAVEOF Bip 6379

此时主从关系就已经建立

Aip:6379>SET a "abc"
   OK
   Bip:6379>GET a
   "abc"

从节点只能读,但是不能写会报错 READONLY 如果是想要取消主从复制,使用SLAVEOF NO ONE 命令

主从复制实现(Redis2.8之前的版本)

执行SLAVEOF命令后,

  1. 从 会向 主发送SYNC命令

2.从发送给主后,主收到了该命令就会去执行BGSAVE命令,BGSAVE命令执行后默认会在我们磁盘上回生成一个RDB文件,同时也会在缓冲区把之后的所有的命令都给保存下来。

3.主 讲rdb文件发给从,从 加载rdb文件。

4.主 将缓冲区的命令发送给从,从去执行这些命令 。

这就是redis2.8之前的同步操作,主有数据之后,主就会把自己执行过的命令集合发送给从服务器,从服务器接受到了这些命令后就会去执行,这样主和从就相同了。

缺点:如果说从因为网络等一些问题断线重连,每次都要去执行一次SYNC全量复制(SYNC命令是比较消耗资源的,要生成rdb文件,又要传输去从,从要再加载文件)

主从复制实现(Redis2.8之后的版本)

为了解决上述缺点,新版本的主从复制就可以解决。初次复制和原来的全量复制是一样的。断线后的复制,只需要把断线后主执行过的命令发送给从就可以了。

那么要怎么实现呢?那我们需要了解几个知识点,第一个知识点是复制积压缓冲区,顾名思义就是一个暂时存放的地方。第二个是复制偏移量。第三个是runId。主每次执行命令,主的偏移量就会去加向从传输的字节大小。从收到数据后执行后,从的偏移量就会加上传输的字节大小。

给大家举个例子 A是主,BC是从 原先ABC的偏移量都是10000,A传输了33字节的数据,B断开,C正常 此时A和C的偏移量都是10033,而B重连之后还是10000。

那么B该怎么获取数据?这就会涉及到了复制积压缓冲区,简单来说在A传输数据的时候,他会把命令往缓冲区去存入。不过我们也需要考虑一下情况,我们把复制积压缓冲区想象成一个圆形。初始的主从偏移量全部都在12点方向,主接受了一定量的数据,顺时针跑到了6点。那么此时 从断开重连后, 就是要去执行增量同步。如果主偏移量从12点顺时针跑了一圈又到了12点,再多跑了一点,有一部分数据已经被重新覆盖了,增量同步将不起作用,这部分被覆盖的数据就永远获取不到,所以此时就要做全量同步。

那么比如再重新选主的场景,我怎么知道我是不是复制的还是原来的主呢?这就涉及到runId,第一次全量复制的时候,主会把runId给从,从在做psync的时候会去携带runId,如果runid不一致,就直接全量同步

总结

相关实践学习
基于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 Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
面试被吊打!正确打开Redis分布式锁的七种方案,涨见识了
日常开发中,秒杀下单、抢红包等等业务场景,都需要用到分布式锁。而Redis非常适合作为分布式锁使用。本文将分七个方案展开,跟大家探讨Redis分布式锁的正确使用方式。如果有不正确的地方,欢迎大家指出哈,一起学习一起进步。
|
7月前
|
NoSQL Redis
【怒怼大厂面试官】听说你精通Redis?Redis数据同步懂吗
面试官:不用慌尽管说,错了也没关系。。。来说说Redis数据同步。是这样的,Redis有一个叫命令传播的概念,如果像面试官说的这种场景,再使用上面我提到的AOF缓冲区就有点浪费内存空间了。所以Redis会将主服务器的这条Del删除命令
【怒怼大厂面试官】听说你精通Redis?Redis数据同步懂吗
|
消息中间件 JavaScript 小程序
麻了,代码改成多线程,竟有9大问题 上
麻了,代码改成多线程,竟有9大问题 上
|
安全 Java 数据库连接
麻了,代码改成多线程,竟有9大问题 下
麻了,代码改成多线程,竟有9大问题 下
|
NoSQL 关系型数据库 MySQL
又陷入知识盲区了,面试被问Redis事务,我差点脸都“绿”了
前几天有读者说自己面试被问到Redis的事务,虽然不常用,但是面试竟然被问到,平时自己没有注意Redis的事务这一块,面试的时候被问到非常不好受。 虽然,这位读者面试最后算是过了,但是薪资方面没有拿到自己理想的薪资。 其实这个也是正常的,一般面试被问到烂大街的,谁还问你啊,专门挑一些不常见的来问你,就是为了压你的薪资。
|
消息中间件 JavaScript 小程序
新来个阿里 P7,仅花 2 小时,撸出一个多线程永动任务,看完直接跪了,真牛逼!
新来个阿里 P7,仅花 2 小时,撸出一个多线程永动任务,看完直接跪了,真牛逼!
|
存储 缓存 运维
redis灵魂拷问:19图+11题带你面试通关
redis灵魂拷问:19图+11题带你面试通关
108 0
redis灵魂拷问:19图+11题带你面试通关
|
存储 Web App开发 程序员
程序猿的血泪史:一定要有数据备份的思想,不然死都不知道咋死的!!!
程序猿的血泪史:一定要有数据备份的思想,不然死都不知道咋死的!!!
208 0

热门文章

最新文章