Redis主从复制深度解析

概述

Redis的主从复制(Master - Slave Replication)是实现数据备份、读写分离以及水平扩展的关键机制之一。借助主从复制,一个主节点能够将数据同步至多个从节点,并且从节点还能级联创建自身的从节点,从而构建出树状结构。需要注意的是,Redis的主从复制是达成高可用的基础,但它本身并非等同于高可用。

Redis主从复制的作用

数据冗余

主从复制实现了数据的热备份,这是除持久化之外的另一种数据冗余方式。

故障恢复

当主节点出现状况时,可由从节点提供服务,进而实现快速的故障恢复,这实际上是一种服务层面的冗余。

负载均衡

在主从复制的基础上,结合读写分离,能让主节点负责写服务,从节点负责读服务(即写Redis数据时应用连接主节点,读数据时连接从节点),以此分担服务器的负载;尤其在写少读多的场景下,通过多个从节点分担读负载,可大幅提升Redis服务器的并发量。

读写分离

可用于实现读写分离,主库进行写操作,从库进行读操作,读写分离不仅能提高服务器的负载能力,还能根据需求的变化调整从库的数量。

高可用根基

除上述作用外,主从复制是哨兵和集群得以实施的前提,所以主从复制是Redis高可用的基础。

Redis主从复制的搭建

搭建主服务器

可参考文章:Redis6.2.x版本安装

搭建从服务器

可参考上述Redis6.2.x版本安装文章。需留意从服务器配置文件的修改情况:

# 第75行,修改远程访问地址
75:bind 0.0.0.0
# 第98行,修改端口号
98:port 6379
# 第259行,守护进程运行,默认是前台运行,需修改为yes
259:daemonize yes
# 第304行,指定redis的日志
304:logfile "/var/log/redis/redis.log"
# 第329行,指定数据库的数量,默认是16个
329:databases 16
# 第433行,持久化的文件
433:dbfilename dump.rdb
# 第456行,设置redis的数据目录,要和之前创建的路径保持一致
456:dir /data00/data/redis/
# 第903行,设置密码,建议不要使用弱密码
903:requirepass 123456

# 第479行,主库的IP和端口
479:replicaof 127.0.0.1 6379
# 第486行,如果主服务器设置了密码,需要配置认证
486:masterauth !Xinxin123

# 其它配置
# 从服务器是否可写(默认只读)
replica-read-only yes
# 复制缓冲区大小
repl-backlog-size 1mb
# 复制超时时间(秒)
repl-timeout 60
# 当主从断开时,从服务器是否继续提供服务
replica-serve-stale-data yes

启动主库后再启动从库:

[root@node01 ~]# redis-server /data00/data/redis/redis.conf

[root@node01 ~]# ss -lntup | grep 6379
tcp   LISTEN 0      511                          127.0.0.1:6379       0.0.0.0:*    users:(("redis-server",pid=1001533,fd=6))
tcp   LISTEN 0      511                              [::1]:6379          [::]:*    users:(("redis-server",pid=1001533,fd=7))

验证主从复制是否成功

在主从分别执行INFO REPLICATION命令:

# 主库执行
127.0.0.1:6379> INFO REPLICATION
# Replication
role:master
connected_slaves:1
slave0:ip=10.37.99.63,port=6379,state=online,offset=98,lag=0
master_failover_state:no-failover
master_replid:2f61b8be8cbf19e45882f77bea61b55862bf74e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:98
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:98

# 从库执行
127.0.0.1:6379> INFO REPLICATION
# Replication
role:slave
master_host:10.37.97.56
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_read_repl_offset:238
slave_repl_offset:238
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:2f61b8be8cbf19e45882f77bea61b55862bf74e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:238
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:238

验证主库写入数据,从库是否能获取到:

# 主库写入数据
127.0.0.1:6379> set rep rep
OK

# 从库查询数据
127.0.0.1:6379> get rep
"rep"

验证从库写数据,预期会报错:

127.0.0.1:6379> set slave 1
(error) READONLY You can't write against a read only replica.

Redis主从复制原理

主从复制过程大致分为3个阶段:连接建立阶段(即准备阶段)、数据同步阶段、命令传播阶段。

当从节点执行slaveof命令后,复制过程便启动,通过下图可看出复制过程大致分为6个步骤。
image

  1. 保存主节点信息
    执行slaveof后Redis会打印出如下日志:
    image

  2. 从节点与主节点建立网络连接
    从节点内部通过每秒运行的定时任务维护复制相关逻辑,当定时任务发现有新的主节点时,会尝试与该节点建立网络连接。
    image

从节点会建立一个socket套接字,专门用于接收主节点发送的复制命令。从节点连接成功后会打印出如下日志:
image

若从节点无法建立连接,定时任务会无限重试,直到连接成功或执行slaveofnoone取消复制。

通过info replication查看master_link_down_since_seconds指标可了解连接失败情况,从节点连接主节点失败时会每秒打印日志以便发现问题:
image

  1. 发送ping命令
    连接建立成功后从节点发送ping请求进行首次通信,ping请求的目的是:
  2. 检测主从之间网络套接字是否可用;
  3. 检测主节点当前是否能接受并处理命令。

若发送ping命令后从节点未收到主节点的pong回复或超时,会断开复制连接,下次定时任务会重连。
image

image
从节点发送的ping命令成功返回时,Redis会打印日志并继续后续复制流程:
image

  1. 权限验证
    若主节点设置了requirepass参数,需进行密码验证,从节点必须配置masterauth参数保证与主节点密码相同才能通过验证,验证失败则复制终止,从节点重新发起复制流程。

  2. 同步数据集
    主从复制连接正常通信后,首次建立复制时主节点会将持有的数据全部发送给从节点,此操作耗时较长。

  3. 命令持续复制
    主节点将当前数据同步给从节点后完成复制建立流程,接下来主节点持续向从节点发送写命令,保证主从数据一致。

主从复制数据同步原理

Redis支持主从复制,主从结构可采用一主多从或级联结构,主从复制可根据是否全量分为全量同步和增量同步。下图为级联结构。
image

全量同步阶段

Redis全量同步一般发生在Slave初始化阶段,此时Slave需复制Master上的所有数据,具体步骤如下:
- 从服务器配置主服务器连接信息(slaveof属性);
- 从服务器连接主服务器,发送SYNC命令;
- 主服务器判断是否全量复制,若是则进入下一步,否则查看增量复制子流程;
- 主服务器接收到SYNC命令后,执行BGSAVE命令生成RDB文件并记录此后执行的写命令;
- 主服务器BGSAVE执行完后,向从服务器发送快照文件并记录发送期间的写命令;
- 从服务器收到快照文件后丢弃旧数据,载入快照;
- 主服务器发送完快照后向从服务器发送缓冲区中的写命令;
- 从服务器完成快照载入,接收命令请求并执行缓冲区中的写命令;
image

增量同步阶段

Redis增量复制是Slave初始化后主服务器写操作同步到从服务器的过程,主服务器每执行一个写命令就向从服务器发送相同命令,从服务器接收并执行。

开启无磁盘同步

Redis与从数据库复制初始化时不将快照存磁盘,而是直接通过网络发送,避免IO性能差问题。

启动无磁盘复制:

repl-diskless-sync yes

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/12604.html

(0)
LomuLomu
上一篇 2025 年 6 月 21 日
下一篇 2025 年 6 月 21 日

相关推荐

  • 2025年最新DataGrip永久破解教程(附激活码/注册码)

    本文将详细介绍如何通过简单步骤永久激活DataGrip至2099年,适用于所有JetBrains系列IDE工具。 准备工作 首先确保已下载DataGrip官方安装包,若尚未安装可前往官网获取:https://www.jetbrains.com/zh-cn/datagrip/download/ 安装过程非常简单,只需设置安装路径和创建桌面快捷方式即可完成。 获…

    2025 年 5 月 9 日
    19900
  • 永久有效的IDEA激活破解教程(2024亲测有效!)

    【永久启用】IDEA 2024.1.2 完备激活指南:配有验证激活码与工具 IntelliJ IDEA 是一款前沿的 Java 集成开发环境,广泛认为是顶级的 Java 工具之一。这篇文章将指导您如何利用脚本来免费激活 IDEA 和整个 Jetbrains 工具套件,适用于 2021 年及之后的版本,包括最新版。 安装 IntelliJ IDEA 您可以从 …

    未分类 2024 年 7 月 10 日
    7.8K00
  • 2025年最新IDEA激活码分享 | 永久破解IDEA至2099年教程(支持JetBrains全家桶)

    一、前言 本教程适用于JetBrains旗下所有开发工具,包括但不限于IDEA、PyCharm、DataGrip、Goland等,一站式解决您的开发工具激活问题! 先展示最新IDEA版本成功破解的效果图,可以看到授权有效期已延长至2099年,完全满足长期开发需求! 下面将详细介绍如何通过简单几步实现IDEA永久激活,该方法同样适用于历史版本,无论您使用Win…

    IDEA破解教程 2025 年 7 月 25 日
    7800
  • 零障碍体验KingbaseES平台,轻松掌握Oracle基础操作

    零障碍体验KingbaseES平台,轻松掌握Oracle基础操作 金仓数据库概览 金仓数据库管理系统KingbaseES(简称KES)是由中电科金仓(北京)科技股份有限公司自主研发的数据库产品,拥有自主知识产权与原创资质认证。该公司作为国内数据库领域的领军企业,专注于自主创新,助力国家关键行业的信息化及数字化转型,是国产数据库替代国外产品的重要力量。 电科金…

    2025 年 7 月 23 日
    5400
  • 2025年最新DataGrip激活码与永久破解教程(支持2099年)

    Jetbrains全家桶完美破解方案 本教程将详细讲解如何获取最新DataGrip激活码并实现永久破解,同时适用于PyCharm、IDEA、Goland等Jetbrains系列开发工具。先展示破解成功后的效果图: 按照本教程操作,无论您使用Windows、MacOS还是Linux系统,都能轻松完成破解,有效期直达2099年! 第一步:下载DataGrip官方…

    DataGrip激活码 2025 年 8 月 6 日
    4400

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信