Redis主从模式以及数据同步原理:全量数据同步、增量数据同步

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis主从模式以及数据同步原理:全量数据同步、增量数据同步

Redis有三种集群模式,分别是:主从模式、哨兵模式、Cluster模式

主从模式是三种模式中最简单的,在主从复制中分为主数据库(master)和从数据库(slave),若master出现宕机,需要手动配置slave转为master。

后来为了高可用提出来哨兵模式,可以选择出slave转为master,提升可用性,但不能动态扩充。

后来又有了cluster集群模式。

本文介绍主从模式,以及如何数据同步

一、主从复制

命令:redis-server --replicaof 127.0.0.1 7001

执行该命令后,当前服务器得redis-server就会成为127.0.0.1 7001的从数据库了,使用从数据库可以使得数据更加安全。从数据库具有只读属性,不能写。

主数据库要给从数据库同步数据才能使用,下面将介绍同步数据的方式

二、数据同步

1、全量数据同步

  1. 从数据库连接到主数据库
  2. 从数据库发送ping命令,主数据库回复pong命令
    发送ping主要是为了(相当于tcp的 keepalive 心跳包)检测主数据库是否有响应
  3. 从数据库发送一个同步命令,主数据库进行异步发送数据
    无论主数据采用aof还是rdb的持久化方式,在主从复制的时候都以rdb的数据格式进行复制
  4. 从数据库根据rdb调整内存后,发送给主数据库完成同步命令

2、增量数据同步

在从数据库连接着主数据库情况下,由于网络原因,某些数据出现主从不一致的情况,这时候可以容忍数据不一致的情况,通过设置环形缓冲区,将网络抖动时候的数据先写入环形缓冲区,从数据库会记录一个偏移值,在主数据库发送数据前,从数据库先把偏移值发送给主数据库,看偏移值是否在环形缓冲区中,然后再将环形缓冲区中偏移值到起始地址的数据发送到从数据库中

3、服务器 RUN ID

无论主库还是从库都有自己的 RUN ID,RUN ID 启动时自动产生,RUN ID 由40个随机的十六进

制字符组成;

当从库对主库初次复制时,主库将自身的 RUN ID 传送给从库,从库会将 RUN ID 保存;

当从库断线重连主库时,从库将向主库发送之前保存的 RUN ID;

  • 从库 RUN ID 和主库 RUN ID 一致,说明从库断线前复制的就是当前的主库;主库尝试执行 增量同步操作;
  • 若不一致,说明从库断线前复制的主库并不时当前的主库,则主库将对从库执行全量同步操作;

相比全量数据同步,增量数据同步还多了数据检查。从数据库连接主数据库,使用了runid,而不仅仅是ip、port,因为如果从数据库所在服务器宕机了,换了另一台,使用ip、port,那又怎么知道该增量多少呢,复制到哪个阶段,而使用runid可以唯一标识从数据库。

4、复制偏移量 offset

主从都会维护一个复制偏移量;

  • 主库向从库发送N个字节的数据时,将自己的复制偏移量上加N;
  • 从库接收到主库发送的N个字节数据时,将自己的复制偏移量加上N;

通过比较主从偏移量得知主从之间数据是否一致;偏移量相同则数据一致;偏移量不同则数据不一

致;

5、环形缓冲区

本质:固定长度先进先出队列;

存储内容:如下图;

当因某些原因(网络抖动或从库宕机)从库与主库断开连接,避免重新连接后开始全量同步,在主

库设置了一个环形缓冲区;该缓冲区会在从库失联期间累计主库的写操作;当从库重连,会发送自

身的复制偏移量到主库,主库会比较主从的复制偏移量:

  • 若从库offset还在复制积压缓冲区中,则进行增量同步;
  • 否则,主库将对从库执行全量同步;
# redis.conf
# 环形缓冲区的大小 为1mb
repl-backlog-size 1mb
# 如果所有从库断开连接 3600 秒后没有从库连接,则释放环形缓冲区
repl-backlog-ttl 3600

大小确定: disconnect_time * write_size_per_second

disconnect_time :从库断线后重连主库所需的平均时间(以秒为单位);

write_size_per_second :主库平均每秒产生的写命令数据量;

偏移量会出现环绕回去,变成0的情况吗?偏移量最大为2 64 2^{64}264,就算一天增加1个亿,也要好几千年,不会存在这种问题。

三、何时使用全量还是增量数据同步

相关文章
|
存储 缓存 NoSQL
Redis 服务器全方位介绍:从入门到核心原理
Redis是一款高性能内存键值数据库,支持字符串、哈希、列表等多种数据结构,广泛用于缓存、会话存储、排行榜及消息队列。其单线程事件循环架构保障高并发与低延迟,结合RDB和AOF持久化机制兼顾性能与数据安全。通过主从复制、哨兵及集群模式实现高可用与横向扩展,适用于现代应用的多样化场景。合理配置与优化可显著提升系统性能与稳定性。
162 0
|
2月前
|
存储 缓存 监控
Redis分区的核心原理与应用实践
Redis分区通过将数据分散存储于多个节点,提升系统处理高并发与大规模数据的能力。本文详解分区原理、策略及应用实践,涵盖哈希、范围、一致性哈希等分片方式,分析其适用场景与性能优势,并探讨电商秒杀、物联网等典型用例,为构建高性能、可扩展的Redis集群提供参考。
128 0
|
6月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
227 32
|
9月前
|
消息中间件 缓存 NoSQL
Redis原理—5.性能和使用总结
本文详细探讨了Redis的阻塞原因、性能优化、缓存相关问题及数据库与缓存的一致性问题。同时还列举了不同缓存操作方案下的并发情况,帮助读者理解并选择合适的缓存管理策略。最终得出结论,在实际应用中应尽量采用“先更新数据库再删除缓存”的方案,并结合异步重试机制来保证数据的一致性和系统的高性能。
Redis原理—5.性能和使用总结
|
9月前
|
运维 NoSQL 算法
【📕分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
本文深入探讨了基于Redis实现分布式锁时遇到的细节问题及解决方案。首先,针对锁续期问题,提出了通过独立服务、获取锁进程自己续期和异步线程三种方式,并详细介绍了如何利用Lua脚本和守护线程实现自动续期。接着,解决了锁阻塞问题,引入了带超时时间的`tryLock`机制,确保在高并发场景下不会无限等待锁。最后,作为知识扩展,讲解了RedLock算法原理及其在实际业务中的局限性。文章强调,在并发量不高的场景中手写分布式锁可行,但推荐使用更成熟的Redisson框架来实现分布式锁,以保证系统的稳定性和可靠性。
483 0
【📕分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
|
6月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
1月前
|
缓存 负载均衡 监控
135_负载均衡:Redis缓存 - 提高缓存命中率的配置与最佳实践
在现代大型语言模型(LLM)部署架构中,缓存系统扮演着至关重要的角色。随着LLM应用规模的不断扩大和用户需求的持续增长,如何构建高效、可靠的缓存架构成为系统性能优化的核心挑战。Redis作为业界领先的内存数据库,因其高性能、丰富的数据结构和灵活的配置选项,已成为LLM部署中首选的缓存解决方案。
|
2月前
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
152 1
Redis专题-实战篇二-商户查询缓存
|
1月前
|
缓存 运维 监控
Redis 7.0 高性能缓存架构设计与优化
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Redis 7.0高性能缓存架构,探索函数化编程、多层缓存、集群优化与分片消息系统,用代码在二进制星河中谱写极客诗篇。
|
6月前
|
缓存 NoSQL Java
Redis+Caffeine构建高性能二级缓存
大家好,我是摘星。今天为大家带来的是Redis+Caffeine构建高性能二级缓存,废话不多说直接开始~
880 0