Redis主从复制原理及过期key处理(上)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis主从复制原理及过期key处理(上)

在Redis复制的基础上(不包括Redis Cluster或Redis Sentinel作为附加层提供的高可用功能),使用和配置主从复制非常简单,能使得 【Redis从服务器】(下文称R)能精确得复制 【Redis主服务器】(下文称M)的内容。

每当 R 和 M 之间的连接断开时, R 会自动重连到 M,并且无论这期间 M 发生了什么, R 都将尝试让自身成为 M 的精确副本。


1 依赖机制

该系统的运行依靠如下重要的机制:

1.1 更新 R

当一个 M 和一个 R 连接正常时, M 会发送一连串命令流保持对 R 的更新,以便将自身数据集的改变复制给 R,这包括客户端的写入、key 的过期或被逐出等

1.2 部分重同步

M、R 断连后,因为网络问题或主从意识到连接超时, R 重新连接上 M 并会尝试进行部分重同步:它会尝试只获取在断开连接期间内丢失的命令流。

1.3 全量重同步

当无法进行部分重同步时, R 会请求全量重同步。

这涉及到一个更复杂过程,比如M需创建所有数据的快照,将之发送给 R ,之后在数据集更改时持续发送命令流到 R。


Redis使用默认的异步复制,低延迟且高性能,适用于大多数 Redis 场景。但R会异步确认其从M周期接收到的数据量。


客户端可使用 WAIT 命令请求同步复制某些特定的数据。但WAIT命令只能确保在其他 Redis 实例中有指定数量的已确认的副本:在故障转移期间,由于不同原因的故障转移或是由于 Redis 持久性的实际配置,故障转移期间确认的写入操作可能仍然会丢失。

2 Redis 复制特点

  • Redis 使用异步复制,R 和 M 之间异步地确认处理的数据量
  • 一个 M 可有多个 R
  • R 可接受其他 R 的连接
    除了多个 R 可以连接到同一 M,R 间也可以像层级连接其它 R。Redis 4.0起,所有 sub-R 将会从 M 收到完全一样的复制流
  • Redis 复制在 M 侧是非阻塞的
    M 在一或多 R 进行初次同步或者是部分重同步时,可以继续处理查询请求
  • 复制在 R 侧大部分也是非阻塞当 R 进行初次同步时,它可以使用旧数据集处理查询请求,假设在 redis.conf 中配置了让 Redis 这样做。否则,你可以配置如果复制流断开, Redis R 会返回一个 error 给客户端。但在初次同步后,旧数据集必须被删除,同时加载新的数据集。 R 在这个短暂的时间窗口内(如果数据集很大,会持续较长时间),会阻塞到来的连接请求。自 Redis 4.0 开始,可以配置 Redis 使删除旧数据集的操作在另一个不同的线程中进行,但是,加载新数据集的操作依然需要在主线程中进行并且会阻塞 R
  • 复制可被用在可伸缩性,以便只读查询可以有多个 R 进行(例如 O(N) 复杂度的慢操作可以被下放到 R ),或者仅用于数据安全和高可用
  • 可使用复制来避免 M 将全部数据集写入磁盘造成的开销:一种典型的技术是配置你的 M 的 redis.conf以避免对磁盘进行持久化,然后连接一个 R ,配置为不定期保存或是启用 AOF。但是,这个设置必须小心处理,因为重启的 M 将从一个空数据集开始:如果一个 R 试图与它同步,那么这个 R 也会被清空!

1 单机“危机”

  • 容量瓶颈
  • 机器故障
  • QPS瓶颈
  • image.png
  • 一主多从
  • image.png

主从复制作用

  • 数据副本
  • 扩展读性能
  1. 一个M可以有多个R
  2. 一个R只能有一个M
  3. 数据流向是单向的,M => R

2 实现复制的操作

2.1 命令:Rof

异步执行,很耗时间

image.png

无需重启,但是不便于配置管理。

2.2 配置

Rof ip port
R-read-only yes

虽然可统一配置,但需重启。

3 全量复制(全量同步)

  1. M执行bgsave,在本地生成一份RDB
    image.png
  2. M将RDB发给salve,若RDB复制时间>60s(repl-timeout)

image.png

则replica就会认为复制失败,可适当调大该参数(对于千兆网卡的机器,一般每秒传输100MB,6G文件,很可能超过60s)

image.png

M在生成RDB时,会将所有新的写命令缓存在内存中,在salve保存了rdb之后,再将新的写命令复制给salve


若在复制期间,内存缓冲区持续消耗超过64MB,或者一次性超过256MB,则停止复制,复制失败


R node接收到RDB之后,清空自己的旧数据,然后重新加载RDB到自己的内存中,同时基于旧的数据版本对外提供服务


如果R开启了AOF,那么会立即执行BGREWRITEAOF,重写AOF


image.png

image.png

RDB生成、RDB通过网络拷贝、R旧数据的清理、R aof rewrite,很耗费时间。

如果复制的数据量在4G~6G之间,那么很可能全量复制时间消耗到1分半到2分钟。

3.1 开销

  1. bgsave时间
  2. RDB文件网络传输时间
  3. 从节点清空数据时间
  4. 从节点加载RDB的时间
  5. 可能的AOF重写时间

3.2 细节

M 开启一个后台save进程,以便生成一个 RDB 文件。同时它开始缓冲所有从客户端接收到的新的写入命令。当后台save完成RDB文件时, M 将该RDB数据集文件发给 R, R会先将其写入磁盘,然后再从磁盘加载到内存。再然后 M 会发送所有缓存的写命令发给 R。这个过程以指令流的形式完成并且和 Redis 协议本身的格式相同。


当主从之间的连接因为一些原因崩溃之后, R 能够自动重连。如果 M 收到了多个 R 要求同步的请求,它会执行一个单独的后台保存,以便于为多个 R 服务。

加速复制

默认情况下,M接收SYNC命令后执行BGSAVE,将数据先保存到磁盘,若磁盘性能差,则写入磁盘会消耗大量性能

因此在Redis 2.8.18时进行改进,可以设置无需写入磁盘直接发生RDB快照给R,加快复制速度。


复制SYNC策略:磁盘或套接字。仅仅接受差异就无法继续复制过程的新副本和重新连接副本需要进行所谓的“完全同步”。 RDB文件从主数据库传输到副本数据库。传输可以通过两种不同的方式进行:1)支持磁盘:Redis主服务器创建一个新过程,将RDB文件写入磁盘。后来,该文件由父进程逐步传输到副本。 2)无盘:Redis主服务器创建一个新进程,该进程将RDB文件直接写入副本套接字,而完全不接触磁盘。使用磁盘支持的复制,在生成RDB文件的同时,只要生成RDB文件的当前子级完成工作,就可以将更多副本排入队列并与RDB文件一起使用。如果使用无盘复制,则一旦传输开始,新的副本将排队,并且当当前副本终止时将开始新的传输。当使用无盘复制时,主服务器在开始传输之前等待一段可配置的时间(以秒为单位),以希望多个副本可以到达并且传输可以并行化。使用慢速磁盘和快速(大带宽)网络时,无盘复制效果更好。

修改配置:

repl-diskless-sync yes (默认no)


目录
相关文章
|
4天前
|
消息中间件 存储 缓存
Redis 服务器全方位介绍:从入门到核心原理
Redis是一款高性能、基于内存的NoSQL数据库,支持String、Hash、List、Set、ZSet等丰富数据结构,广泛用于缓存、分布式锁、排行榜、消息队列等场景。支持持久化(RDB/AOF)、主从复制、集群部署,具备原子操作与高并发能力,是构建高可用系统的核心组件之一。(239字)
66 0
|
29天前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
1月前
|
存储 负载均衡 NoSQL
Redis主从复制
在分布式系统中,为解决单点故障和提升性能,常采用Redis主从复制架构。通过将数据复制到多个从节点,实现读写分离、负载均衡及高可用性,同时支持多种拓扑结构以适应不同场景需求。
|
1月前
|
存储 缓存 监控
Redis分区的核心原理与应用实践
Redis分区通过将数据分散存储于多个节点,提升系统处理高并发与大规模数据的能力。本文详解分区原理、策略及应用实践,涵盖哈希、范围、一致性哈希等分片方式,分析其适用场景与性能优势,并探讨电商秒杀、物联网等典型用例,为构建高性能、可扩展的Redis集群提供参考。
95 0
|
3月前
|
负载均衡 NoSQL Redis
【赵渝强老师】Redis的主从复制集群
Redis主从复制是指将一台Redis服务器的数据复制到其他Redis服务器,实现数据热备份、故障恢复、负载均衡及高可用架构的基础。主节点负责写操作,从节点同步数据并可提供读服务,提升并发处理能力。
112 5
|
7月前
|
缓存 NoSQL Java
Redis应用—6.热key探测设计与实践
热key问题在高并发系统中可能导致数据层和服务层的严重瓶颈,如Redis集群瘫痪和用户体验下降。为解决此问题,京东开发了JdHotkey热key探测框架,具备实时性、准确性、集群一致性和高性能等特点。该框架由etcd集群、Client端jar包、Worker端集群和Dashboard控制台组成,通过分布式计算快速识别热key并推送至应用内存,有效减轻数据层负载,提升服务性能。JdHotkey适用于多种场景,安装部署简便,支持毫秒级热key探测和集群一致性维护。
357 61
Redis应用—6.热key探测设计与实践
|
4月前
|
NoSQL 测试技术 Redis
Redis批量删除Key的三种方式
Redis批量删除Key是优化数据库性能的重要操作,本文介绍三种高效方法:1) 使用通配符匹配(KEYS/SCAN+DEL),适合不同数据规模;2) Lua脚本实现原子化删除,适用于需要事务保障的场景;3) 管道批量处理提升效率。根据实际需求选择合适方案,注意操作不可逆,建议先备份数据,避免内存溢出或阻塞。
|
8月前
|
消息中间件 缓存 NoSQL
Redis原理—5.性能和使用总结
本文详细探讨了Redis的阻塞原因、性能优化、缓存相关问题及数据库与缓存的一致性问题。同时还列举了不同缓存操作方案下的并发情况,帮助读者理解并选择合适的缓存管理策略。最终得出结论,在实际应用中应尽量采用“先更新数据库再删除缓存”的方案,并结合异步重试机制来保证数据的一致性和系统的高性能。
Redis原理—5.性能和使用总结
|
8月前
|
NoSQL 算法 安全
Redis原理—1.Redis数据结构
本文介绍了Redis 的主要数据结构及应用。
Redis原理—1.Redis数据结构
|
8月前
|
缓存 NoSQL Redis
Redis原理—2.单机数据库的实现
本文概述了Redis数据库的核心结构和操作机制。
Redis原理—2.单机数据库的实现

热门文章

最新文章