主从复制
侧边栏壁纸
  • 累计撰写 18 篇文章
  • 累计收到 3 条评论

主从复制

无冕の神
2026-02-03 / 0 评论 / 1 阅读 / 正在检测是否收录...

主从复制的应用场景

读写分离架构
原理:主节点负责处理所有写操作(插入、更新、删除)和核心读操作,从节点仅处理非核心读操作(如查询、统计)。
优势:
分散读压力,避免单节点因大量读请求而性能瓶颈;
主从节点可独立优化(如主节点侧重写性能,从节点增加缓存提升读速度)。

数据备份与灾备
实时备份:从节点同步主节点数据,可作为 “热备份”,避免主节点故障导致数据丢失。
离线备份:从节点可单独执行备份操作(如定时生成快照),不影响主节点的正常业务。
跨介质备份:主节点数据存储在高性能存储(如 SSD),从节点可将数据备份到低成本存储(如 HDD),

平衡成本与安全性。

故障转移与高可用
主节点故障时,将从节点提升为新主节点,保证服务连续性
部署多个从节点,即使部分从节点故障,仍有其他节点可用,降低单点故障风险

数据分析
主节点专注于线上业务(如用户交易),从节点用于离线数据分析(如用户行为统计、报表生成),
避免分析任务占用主节点资源

跨地域部署与延迟优化
在不同地域部署从节点,用户访问时连接本地从节点,减少跨地域网络延迟

全量复制的详细流程

从节点发起同步请求
从节点启动后,会向主节点发送 PSYNC ? -1 命令:

? 表示从节点不知道主节点的运行 ID(runID);
-1 表示从节点没有保存有效的复制偏移量(offset);

主节点收到后,会返回 FULLRESYNC 响应,其中 runID 是主节点的唯一标识,offset 是主节点当前的写偏移量

主节点生成 RDB 快照
主节点执行 BGSAVE 命令,在后台异步生成 RDB 快照文件:
生成期间,主节点会继续处理客户端的写命令(这些命令会被临时存入复制缓冲区);
若 BGSAVE 失败(如内存不足),主节点会拒绝从节点的同步请求。

主节点发送 RDB 文件
主节点通过网络将 RDB 文件发送给从节点,发送过程中会持续记录新的写命令到复制缓冲区;
若网络中断,从节点会重新发起同步,可能再次触发全量复制(取决于中断时间)。

从节点加载 RDB 并执行缓冲命令
从节点接收完 RDB 文件后,会先清空自身数据库(避免数据冲突);
加载 RDB 文件到内存,恢复主节点在生成快照时的状态;
加载完成后,从节点会执行主节点在 RDB 生成期间存入复制缓冲区的所有写命令,最终与主节点的偏移量保持一致。

增量复制的详细流程

从节点重连并发起增量同步请求
当从节点与主节点短暂断开后重新连接时,会发送 PSYNC <master_runid> <slave_offset> 命令:
<master_runid>:从节点记录的上次连接的主节点运行 ID(唯一标识主节点)。
<slave_offset>:从节点当前的复制偏移量(表示已同步到的位置)。

主节点验证同步条件
运行 ID 验证:确认从节点提供的 master_runid 与自身一致(确保未更换主节点)。
偏移量验证:检查从节点的 slave_offset 是否在复制积压缓冲区的范围内
(即缓冲区中是否包含从该偏移量之后的所有命令)。

主节点响应并发送增量数据
若上述验证通过,主节点返回 CONTINUE 响应,告知从节点可以进行增量同步。
主节点从复制积压缓冲区中,提取从 slave_offset 之后的所有命令,发送给从节点。

从节点执行命令并同步状态
从节点接收并执行这些增量命令,更新自身数据。
执行完成后,从节点的偏移量与主节点保持一致,恢复正常同步状态。

slave-serve-stale-data yes
当从节点与主节点的连接中断(如网络故障),且无法进行增量或全量复制时:

若配置为 yes(默认):从节点会继续响应客户端的读请求,返回当前已有的数据(可能已过时,与主节点不一致);
若配置为 no:从节点会拒绝所有读请求,返回 SYNC with master in progress 错误。

主节点重点指标
INFO server:

redis_version:6.2.19 # Redis 服务器的版本号
uptime_in_seconds:14339 # 服务器启动至今的运行时间(单位:秒)

INFO replication:

role:master # 当前节点的角色(master 表示为主节点)
connected_slaves:1 # 已连接的从节点数量
master_repl_offset:1000000 # 主节点的复制偏移量(记录已写入数据的字节位置,用于主从同步)
repl_backlog_size:10485760 # 复制积压缓冲区的大小(10485760 字节 = 10MB,用于从节点重连时快速同步)
repl_backlog_ttl:3600 # 复制积压缓冲区的存活时间(单位:秒,若从节点断开超过此时长,缓冲区将被释放)

INFO stats:

total_commands_processed:1000000 # 服务器启动至今累计处理的命令总数
instantaneous_ops_per_sec:1000 # 当前每秒处理的命令数(即 QPS,反映实时性能负载)

INFO memory:

used_memory_human:100.00M # 已使用的内存量(人性化显示,此处为 100MB)

从节点重点指标
INFO server:

redis_version:6.2.19 # Redis 服务器的版本号
uptime_in_seconds:14339 # 服务器启动至今的运行时间(单位:秒)

INFO replication:

role:slave # 当前节点的角色(slave 表示为从节点)
master_host:192.168.1.100 # 关联的主节点 IP 地址
master_port:6379 # 关联的主节点端口号
master_link_status:up # 主从连接状态(up 表示连接正常,down 表示连接断开)
master_last_io_seconds_ago:0 # 最后一次与主节点进行通信的时间间隔(单位:秒,0 表示刚刚通信过)
master_sync_in_progress:0 # 是否正在与主节点同步数据(0 表示未同步,1 表示正在同步)
lag = master_repl_offset - slave_repl_offset # 主从同步延迟(主节点偏移量减去从节点偏移量)
slave_repl_offset:1000000 # 从节点的复制偏移量(记录已同步主节点数据的字节位置)
slave_priority:100 # 从节点在哨兵模式下的故障转移优先级(值越小优先级越高)
0

评论 (0)

取消