【Redis】全量复制和部分复制

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 【Redis】全量复制和部分复制

1. 相关概念


1.1 全量复制


用于初次复制或其它无法进行部分复制的情况,将主节点中的所有数据都发送给从节点,是一个IE非常重型的操作,当数据量较大时,会对主从节点和网络造成很大的开销


1.2 部分复制


用于处理主从复制中因网络闪断原因造成的数据丢失场景,当从主节点再次连接上主节点后,如果(条件允许),主节点会补发丢失数据给从节点。因为补发的数据远远小于全量数据,可以有效避免全量复制的过高开销,需要注意的是,如果网络中断时间过长,造成主节点没有能够完整的保存中断期间执行的写命令,则无法进行部分复制,仍使用全量复制


1.3 复制偏移量


参与复制的主从节点都会维护自身复制偏移量。主节点(master)在处理完写入命令后,会把命令的字节长度做累加记录,统计信息会在info replication 中的master_repl_offset指标中


image.png


从节点(slave)每秒钟上报自身的复制偏移量给主节点,因为主节点也会保存从节点的复制偏移量,统计指标如下


image.png


从节点在接收到主节点发送的命令后,也会累加记录自身的偏移量。统计信息在info replication中的slave_repl_offset


1.4 复制积压缓冲区


复制积压缓冲去是保存在主节点上的一个固定长度的队列,默认大小为1mb,当主节点有连接从节点(slave)时被创建,这时主节点(master)响应写命令时,不但会把命令发送给从节点,还会写入复制积压缓冲区。


image.png


在命令传播阶段,主节点除了将写命令发送给从节点,还会发送一份给复制积压缓冲区,作为写命令的备份;除了存储写命令,复制积压缓冲区中还存储了其中的每个字节对应的复制偏移量(offset) 。由于复制积压缓冲区定长且先进先出,所以它保存的是主节点最近执行的写命令;时间较早的写命令会被挤出缓冲区。


2. Redis全量复制过程


image.png


Redis 内部会发出一个同步命令,刚开始是 Psync 命令,Psync ? -1表示要求 master 主机同步数据

主机会向从机发送 runid (redis-cli info server)和 offset,因为 slave 并没有对应的 offset,所以是全量复制

从机slave会保存主机master的基本信息save masterinf

主节点收到全量复制的命令后,执行bgsave(异步执行),在后台生成RDB文件(快照),并使用一个缓冲区(称为复制缓冲区)记录从现在开始执行的所有命令

主机send RDB发送RDB文件给从机

发送缓冲区数据

刷新旧的数据,从节点在载入主节点的数据之前要先将老数据清除

加载RDB文件将数据库状态更新至主节点执行bgsave时的数据库状态和缓冲区数据加载

全量复制开销的方面


bgsave时间


RDB文件网络传输时间


从节点清空数据的时间


从节点加载RDB的时间


3. 部分复制


部分复制是 Redis 2.8 以后出现的,之所以要加入部分复制,是因为全量复制会产生很多问题,比如像上面的时间开销大、无法隔离等问题, Redis 希望能够在 master 出现抖动(相当于断开连接)的时候,可以有一些机制将复制的损失降低到最低


image.png


1. 如果网络抖动(连接断开 connection lost)


2. 主机master 还是会写 replbackbuffer(复制缓冲区)


3. 从机slave 会继续尝试连接主机


4. 从机slave 会把自己当前 runid 和偏移量传输给主机 master,并且执行 pysnc 命令同步


5. 如果 master 发现你的偏移量是在缓冲区的范围内,就会返回 continue 命令


6. 同步了 offset 的部分数据,所以部分复制的基础就是偏移量 offset。


4. 正常情况下Redis是如何决定全量复制还是部分复制(增量复制)


从节点将offset发送给主节点后,主节点根据offset和缓冲区大小决定能否执行部分复制


如果offset偏移量之后的数据,仍然都在复制积压缓冲区里,则执行部分复制;


如果offset偏移量之后的数据已不在复制积压缓冲区中(数据已被挤压),则执行全量复制


缓冲区大小调节:


由于缓冲区长度固定且有限,因此可以备份的写命令也有限,当主从节点offset的差距过大超过缓冲区长度时,将无法执行部分复制,只能执行全量复制。反过来说,为了提高网络中断时部分复制执行的概率,可以根据需要增大复制积压缓冲去的小打(通过配置repl_backlog_size)来设置;例如如果网络中断的平均时间是60s,而主节点平均每秒产生的写命令(特定协议格式)所占的字节数为100kb,则复制积压缓冲区的平均需求为6MB,保险起见可以设置为12MB,来保证绝大多数断线情况都可以使用部分复制。


服务器运行ID(runid)


每个Redis节点(无论主从),在启动时都会自动生成一个随机ID(每次启动都不一样),由40个随机的十六进制字符串组成,runid用来唯一识别一个Redis节点。通过info server命令,可以查看runid

image.png



主从节点初次复制时,主节点将自己的runid发送给从节点,从节点将这个runid保存起来,当断线重连时,从节点会将这个runid发送给主节点,主节点根据runid判断能否进行部分复制;


如果从节点保存的runid与主节点现在的runid相同,说明主从节点之前同步过,主节点会继续尝试使用部分复制(到底能不能部分复制还要看offset和复制积压缓冲区的情况)


如果从节点保存的runid与主节点现在的runid不同,说明从节点在断线前同步的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
相关文章
|
4月前
|
NoSQL 关系型数据库 MySQL
当Redis与MySQL数据一致性校验中Redis数据量小于MySQL时的全量查询处理方法
保持Redis和MySQL之间的数据一致性是一个需要细致规划和持续维护的过程。通过全量数据同步、建立增量更新机制,以及定期执行数据一致性校验,可以有效地管理和维护两者之间的数据一致性。此外,利用现代化的数据同步工具可以进一步提高效率和可靠性。
65 6
|
5月前
|
存储 JSON NoSQL
【redis数据同步】redis-shake数据同步全量+增量
【redis数据同步】redis-shake数据同步全量+增量
|
8月前
|
NoSQL Redis
[Redis]——主从同步原理(全量同步、增量同步)
[Redis]——主从同步原理(全量同步、增量同步)
310 2
|
8月前
|
存储 NoSQL 数据库连接
Redis主从模式以及数据同步原理:全量数据同步、增量数据同步
Redis主从模式以及数据同步原理:全量数据同步、增量数据同步
877 0
|
NoSQL Redis
Redis从入门到精通【面试篇】Redis 为什么主从全量复制使用RDB而不使用AOF
RDB 文件只是 Redis 备份的一种方式,它的频率和方式可以根据具体的业务需求进行配置。而 AOF 文件则是 Redis 提供的另一种持久化方式,它记录了每次写入操作,可以保证数据的实时性和可靠性,但相对来说会占用更多的磁盘空间和写入性能。因此,在实际应用中需要根据业务需求进行选择。
296 13
|
缓存 NoSQL Redis
redis全量同步和增量同步周期
redis全量同步和增量同步周期
109 0
|
存储 缓存 NoSQL
Redis学习 - 复制以及三种部署模式(下)
Redis学习 - 复制以及三种部署模式(下)
153 0
|
存储 运维 监控
Redis学习 - 复制以及三种部署模式(上)
Redis学习 - 复制以及三种部署模式(上)
168 0
|
存储 NoSQL Redis
​Redis:在集合中复制键
问题描述: 由于某种原因,我必须需要将某个集合的键(Key)复制一份副本。并移动到目标库
236 0
​Redis:在集合中复制键