粮草机器人 Redis集群搭建与主从复制原理


在现代软件开发中,Redis凭借高性能和灵活的数据结构被广泛应用。但单台Redis服务器存在单点故障、

性能瓶颈和存储容量有限等问题,主从复制集群则成为解决这些问题的关键方案,它不仅能实现数据冗

余和故障恢复,还能通过读写分离提升系统并发能力,同时也是Redis哨兵模式和集群模式的基础。

一、Redis主从复制概述

(一)基本概念

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

过程,数据复制是单向的,只能从主节点流向从节点。默认情况下,每台Redis服务器都是主节点,一个主

节点可以有多个从节点,但每个从节点只能隶属于一个主节点。通常主节点负责处理写操作,从节点负责

处理读操作,以此实现读写分离。

(二)核心作用

  1. 数据冗余:实现数据的热备份,是持久化之外的另一种数据冗余方式,有效降低数据丢失风险。

  2. 故障恢复:当主节点出现故障时,从节点可暂时替代主节点提供服务,实现快速的故障恢复,保障服务连续性。

  3. 负载均衡:在读写分离架构下,主节点专注写操作,从节点分担读操作压力,尤其在读多写少场景下,

  4. 能显著提升Redis服务器的并发处理能力。

  5. 高可用基石:是Redis哨兵模式和集群模式的基础,为构建更高层次的高可用架构提供支撑。

(三)拓扑结构

  1. 一主一从:最简单的拓扑结构,主要用于主节点故障时的故障转移支持,适用于对数据可靠性要求较

  2. 高但并发需求相对较低的场景。

  3. 一主多从(星形拓扑):一个主节点连接多个从节点,可利用多个从节点实现读写分离,大幅提升读

  4. 操作的并发处理能力,适合读占比较大的业务场景。

  5. 树状主从:从节点不仅可以复制主节点数据,还能作为其他从节点的主节点继续向下层复制。通过引

  6. 入中间层,可有效降低主节点的同步压力和数据传输量,适用于从节点数量较多的大规模集群场景。

二、Redis主从复制原理

(一)复制流程

  1. 连接建立阶段从节点执行SLAVEOF(Redis4.0后可使用REPLICAOF)命令后,首先保存主节点的IP和端口

  2. 信息。随后从节点向主节点发送同步命令(SYNC或PSYNC)尝试建立连接,连接建立成功后,从节点发

  3. 送PING命令检测网络套接字是否可用以及主节点是否可处理命令。若主节点设置了密码验证,从节点需

  4. 提供正确密码才能通过验证。

  5. 数据同步阶段

  • 全量同步:当从节点初次连接主节点,或从节点重启后无法进行增量同步时,会触发全量同步。主节点

  • 执行bgsave命令生成RDB快照文件,同时将生成快照期间收到的写命令存储到复制缓冲区。RDB文件生

  • 成完成后,主节点将其发送给从节点,从节点清空原有数据并加载RDB快照。之后主节点再将复制缓冲

  • 区中的写命令发送给从节点,从节点执行这些命令,完成数据初始化。

  • 增量同步:全量同步完成后,主节点会将后续收到的每一条写命令实时发送给从节点,从节点接收并执

  • 行这些命令,保持与主节点数据的一致性。

  1. 命令传播阶段主节点与从节点建立长连接,主节点每执行一条写命令,就会通过该连接将命令发送给从

  2. 节点,从节点执行命令后,数据与主节点保持同步。

(二)断点续传机制

Redis2.8版本及以上支持断点续传功能。主节点会维护一个复制积压缓冲区,缓存最近一段时间的写命令,同

时主节点和从节点各自维护一个复制偏移量和主节点运行ID。当主从节点网络连接断开后重新连接时,从节点

会将自身记录的复制偏移量和主节点运行ID发送给主节点。若主节点运行ID一致,且从节点提供的偏移量在复

制积压缓冲区范围内,主节点会从该偏移量开始,将缓冲区中的写命令发送给从节点,实现断点续传;若不满

足条件,则触发全量同步。

三、Redis主从集群搭建

(一)环境准备

以在单台服务器上搭建一主二从的伪集群为例,需准备Redis安装包,将Redis配置文件(redis.conf)复制3份,

分别命名为6379.conf、6380.conf、6381.conf,对应三个不同端口的Redis实例。

(二)配置文件修改

分别修改三个配置文件中的以下内容:

  1. 端口号:将port参数分别设置为6379、6380、6381。

  2. PID文件名:修改pidfile参数,如/var/run/redis_6379.pid、/var/run/redis_6380.pid、/var/run/redis_6381.pid。

  3. 日志文件名:设置logfile参数,如"6379.log"、"6380.log"、"6381.log"。

  4. RDB文件名:修改dbfilename参数,如dump6379.rdb、dump6380.rdb、dump6381.rdb。

  5. 从节点只读配置:在从节点的配置文件中添加slave-read-only yes,开启从节点只读模式,避免从节点写操作导致数据不一致。

(三)启动实例与配置主从关系

  1. 分别启动三个Redis实例:

redis-server 6379.conf
redis-server 6380.conf
redis-server 6381.conf

  1. 配置主从关系: 使用redis-cli连接从节点(6380和6381),执行以下命令指定主节点:

# 连接6380端口的从节点
redis-cli -p 6380
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
# 连接6381端口的从节点
redis-cli -p 6381
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379

若需永久配置主从关系,可在从节点配置文件中添加slaveof 127.0.0.1 6379,然后重启从节点。

(四)验证集群状态

连接主节点(6379),执行info replication命令查看主从信息:

redis-cli -p 6379
127.0.0.1:6379> info replication

在输出信息中,connected_slaves字段会显示连接的从节点数量,同时可看到每个从节点的IP和端口,

以此验证主从集群是否搭建成功。

四、主从复制的不足与优化方向

(一)存在的不足

  1. 主节点故障需人工干预:主节点故障后,需手动将一个从节点晋升为主节点,同时修改应用程序

  2. 的主节点地址,并重新配置其他从节点复制新主节点,整个过程缺乏自动化能力。

  3. 主节点性能瓶颈:主节点的写能力和存储能力受单机限制,在写操作密集或数据量极大的场景下,

  4. 单主节点可能无法满足需求。

(二)优化方向

  1. 引入哨兵模式:通过哨兵节点自动监控主从节点状态,当主节点故障时,自动将从节点晋升为主节

  2. 点,并完成其他从节点的重新配置,实现故障转移的自动化。

  3. 采用集群模式:Redis集群模式将数据分片存储在多个主节点上,每个主节点可配备多个从节点,

  4. 不仅提升了系统的存储容量和写性能,还进一步增强了系统的高可用性和容错能力。