当前位置: 首页 > news >正文

Redis 主从复制详解:原理、配置与主从切换实战

Redis 主从复制详解:原理、配置与主从切换实战

在高并发场景下,单一 Redis 节点往往难以承受大量的读写请求。为了提高 Redis 的可用性和读写性能,主从复制(Master/Slave)架构成为了常用的解决方案。本文将详细介绍 Redis 主从复制的原理、配置方法以及主从切换的实战操作。

一、Redis 主从复制原理

Redis 主从复制是指将一台 Redis 服务器(主节点,Master)的数据复制到其他 Redis 服务器(从节点,Slave),数据复制是单向的,只能从主节点到从节点。

在实际应用中,通常使用一个 Master 节点处理写操作,多个 Slave 节点处理读操作,同时可以选择一个 Slave 节点进行数据备份,这样能最大程度发挥 Redis 的性能。需要注意的是,Master 和 Slave 的数据并非实时同步,但最终会达到一致,这就是最终一致性。

1.1 全量同步

全量同步是指从节点第一次连接主节点时,完整复制主节点所有数据的过程,具体步骤如下:

  1. Slave 发送 Sync 命令到 Master
  2. Master 启动后台进程,将 Redis 中的数据快照保存到文件中
  3. Master 将保存数据快照期间接收到的写命令缓存起来
  4. Master 完成文件写入后,将该文件发送给 Slave
  5. Slave 使用新接收的 RDB 或 AOF 文件替换旧文件

1.2 增量同步

增量同步用于网络中断等情况后的复制,只将中断期间主节点执行的写命令发送给从节点,比全量复制更高效。其实现依赖于三个重要概念:

(1)复制偏移量

主节点和从节点分别维护一个复制偏移量(offset),代表主节点向从节点传递的字节数。主节点每次向从节点传播 N 个字节数据时,自身 offset 增加 N;从节点每次收到 N 个字节数据时,自身 offset 也增加 N。通过比较两者的 offset,可以判断主从节点的数据是否一致。

(2)复制积压缓冲区

由主节点维护的固定长度 FIFO 队列,默认大小 1MB,当主节点有从节点时创建,用于备份主节点最近发送给从节点的数据。

在命令传播阶段,主节点会将写命令同时发送给从节点和复制积压缓冲区。由于缓冲区长度固定,当主从节点 offset 差距超过缓冲区长度时,将无法执行增量复制,只能执行全量复制。

可以通过配置repl-backlog-size增大缓冲区大小,计算公式参考:网络中断平均时间 × 主节点每秒产生的写命令字节数 × 2(保险起见)。

(3)服务器运行 ID(runid)

每个 Redis 节点启动时会生成一个唯一的 40 位十六进制随机 ID,用于唯一识别节点。主从初次复制时,主节点将自己的 runid 发送给从节点,从节点保存该 runid。

当断线重连时,从节点将保存的 runid 发送给主节点:

  • 如果 runid 相同,说明之前同步过,尝试进行增量复制
  • 如果 runid 不同,说明从节点之前同步的不是当前主节点,只能进行全量复制

二、配置主从同步

2.1 环境说明

主机名IP 地址角色
redis-master192.168.2.20/24master
redis-slave1192.168.2.21/24slave1
redis-slave2192.168.2.22/24slave2

2.2 配置 Master 节点

  • 关闭防火墙和 SELinux
[root@redis-master ~]# systemctl disable --now firewalld
[root@redis-master ~]# setenforce 0
  • 安装 Redis 并修改配置文件
[root@redis-master ~]# yum install redis -y
[root@redis-master ~]# vim /etc/redis/redis.conf
bind 0.0.0.0
protected-mode no
daemonize no  #非后台运行
  • 启动 Redis 并验证角色
[root@redis-master ~]# systemctl start redis
[root@redis-master ~]# redis-cli -p 6379
127.0.0.1:6379> info replication
role:master #当前角色为主
connected_slaves:0
master_failover_state:no-failover
master_replid:b765b9a92e508c2b912f56d2f496e34d1431818f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

2.3 配置 Slave 节点

以 slave1 为例,slave2 配置类似:

  1. 关闭防火墙和 SELinux(同上)
  2. 安装 Redis 并修改配置文件
[root@redis-slave1 ~]# yum install redis -y
[root@redis-slave1 ~]# vim /etc/redis/redis.conf
bind 0.0.0.0
protected-mode no
daemonize no  
replicaof 192.168.2.20 6379  #指定主节点地址和端口
  1. 临时配置主节点(无需重启 Redis,但重启后失效)
[root@redis-slave1 ~]# redis-cli -p 6379
127.0.0.1:6379> REPLICAOF 192.168.2.20 6379  #新版本
# 旧版本使用:slaveof 192.168.2.20 6379
OK
  1. 验证从节点配置
127.0.0.1:6379> info replication
# Replication
role:slave  #当前从的角色调整为slave
master_host:192.168.2.20
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_read_repl_offset:28
slave_repl_offset:28
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:80538ce104caeda1fc19a6e0f5292612e1805974
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28

2.4 验证主从同步

  1. 在主节点添加数据
[root@redis-master ~]# redis-cli
127.0.0.1:6379> set master 192.168.2.20
OK
  1. 在从节点查看数据
[root@redis-slave1 ~]# redis-cli -p 6379
127.0.0.1:6379> get master
"192.168.2.20"

在这里插入图片描述

  1. 在主节点查看从节点连接情况
# 可以看到connected_slaves:2及两个从节点的信息
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.2.21,port=6379,state=online,offset=4421,lag=0
slave1:ip=192.168.2.22,port=6379,state=online,offset=4421,lag=0
master_failover_state:no-failover
master_replid:80538ce104caeda1fc19a6e0f5292612e1805974
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:4421
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:4421

在这里插入图片描述

三、主从切换实战

当主节点宕机后,需要将从节点提升为主节点,以保证服务继续运行。

3.1 模拟主节点宕机

[root@redis-master ~]# systemctl stop redis

3.2 将 slave1 提升为主节点

[root@redis-slave1 ~]# redis-cli
127.0.0.1:6379> REPLICAOF no one  #新版本
# 旧版本使用:slaveof no one
OK# 验证角色已变为master
127.0.0.1:6379> info replication
# 可以看到role:master

3.3 将 slave2 重新指向新的主节点

[root@redis-slave2 ~]# redis-cli
127.0.0.1:6379> replicaof 192.168.2.21 6379  #新版本
# 旧版本使用:slaveof 192.168.2.21 6379
OK# 验证数据已同步
127.0.0.1:6379> get master
"192.168.2.21"  #已更新为新主节点的数据

在这里插入图片描述

总结

Redis 主从复制通过将写操作集中在主节点,读操作分散到从节点,有效提高了 Redis 的并发处理能力。全量复制和增量复制机制保证了主从节点数据的最终一致性,而主从切换功能则提高了系统的可用性。

在实际生产环境中,除了手动进行主从切换,还可以结合 Redis Sentinel(哨兵)实现自动故障转移,进一步提高系统的稳定性和可靠性


文章转载自:

http://6abRLZ8W.rxcqt.cn
http://8ltcNZnj.rxcqt.cn
http://J9Dg13Df.rxcqt.cn
http://aIpPRqvh.rxcqt.cn
http://T4QR8WHE.rxcqt.cn
http://IOlMN0nd.rxcqt.cn
http://zfH8KIuE.rxcqt.cn
http://M4eOUxoc.rxcqt.cn
http://LWigFqx9.rxcqt.cn
http://BIxF6xtB.rxcqt.cn
http://gm22z9ff.rxcqt.cn
http://jOafU8JX.rxcqt.cn
http://GSGgqVAB.rxcqt.cn
http://V9x025ji.rxcqt.cn
http://jjrT5xBN.rxcqt.cn
http://G0FAnDSK.rxcqt.cn
http://wT2cOG3h.rxcqt.cn
http://JiLeAfBf.rxcqt.cn
http://rWQpy2cA.rxcqt.cn
http://8QChfNgQ.rxcqt.cn
http://cGwpQ37R.rxcqt.cn
http://YXZewjAd.rxcqt.cn
http://v3lUDc6F.rxcqt.cn
http://RuTJGSW2.rxcqt.cn
http://rGriVuY5.rxcqt.cn
http://KEL5bUUd.rxcqt.cn
http://JGnjVP8h.rxcqt.cn
http://fCGaTq3W.rxcqt.cn
http://uV2CDOb5.rxcqt.cn
http://8yOkhJfc.rxcqt.cn
http://www.dtcms.com/a/376047.html

相关文章:

  • Java锁机制全解析:从AQS到CAS,深入理解synchronized与ReentrantLock
  • 基于SpringBoot的天气预报系统的设计与实现
  • Android 14 servicemanager的前世今生
  • TC_Motion多轴运动-电子齿轮
  • webrtc弱网-DelayBasedBwe 类源码分析与算法原理
  • 【Floor报错注入】
  • Docker生产部署
  • 小型语言模型:智能体AI的未来?
  • js垃圾回收机制
  • STM32开发(USART总线:UART总线)
  • Typescript - 通俗易懂的 interface 接口,创建接口 / 基础使用 / 可选属性 / 只读属性 / 任意属性(详细教程)
  • FastGPT源码解析 Agent 智能体应用创建流程和代码分析
  • [网络入侵AI检测] 模型性能评估与报告
  • chmod与chown命令的深度解析
  • 7层的API网关
  • 链表问题:LeetCode 两数相加 - 算法解析与详解
  • 类型别名(type)与接口(interface)的抉择
  • 4.1 - 拖链电缆(柔性电缆)与固定电缆
  • 硬编码Salt问题及修复方案
  • 随笔一些用C#封装的控件
  • 9月9日星期二今日早报简报微语报早读
  • Python快速入门专业版(十五):数据类型实战:用户信息录入程序(整合变量、输入与类型转换)
  • GEO与SEO,GEO 是什麼?SEO + AI = GEO 生成式搜尋引擎優化 全解析
  • Asp .Net Core 系列:Asp .Net Core 集成 Hangfire+MySQL
  • 如果服务端有数据更新,浏览器缓存同时也没有过期,如何直接使用最新的数据
  • 使用java编写一个基础的彩票抽奖程序
  • 算法题 Day5---String类
  • 【靶场练习】--DVWA第二关Command Injection(命令执行)全难度分析
  • 什么是Adobe Analytics?数据驱动营销的关键工具​
  • 使用Docker搭建MaxKB智能体平台