粮草机器人 Redis集群搭建与主从复制原理
在现代软件开发中,Redis凭借高性能和灵活的数据结构被广泛应用。但单台Redis服务器存在单点故障、
性能瓶颈和存储容量有限等问题,主从复制集群则成为解决这些问题的关键方案,它不仅能实现数据冗
余和故障恢复,还能通过读写分离提升系统并发能力,同时也是Redis哨兵模式和集群模式的基础。
一、Redis主从复制概述
(一)基本概念
主从复制是指将一台Redis服务器(主节点,Master)的数据复制到其他Redis服务器(从节点,Slave)的
过程,数据复制是单向的,只能从主节点流向从节点。默认情况下,每台Redis服务器都是主节点,一个主
节点可以有多个从节点,但每个从节点只能隶属于一个主节点。通常主节点负责处理写操作,从节点负责
处理读操作,以此实现读写分离。
(二)核心作用
数据冗余:实现数据的热备份,是持久化之外的另一种数据冗余方式,有效降低数据丢失风险。
故障恢复:当主节点出现故障时,从节点可暂时替代主节点提供服务,实现快速的故障恢复,保障服务连续性。
负载均衡:在读写分离架构下,主节点专注写操作,从节点分担读操作压力,尤其在读多写少场景下,
能显著提升Redis服务器的并发处理能力。
高可用基石:是Redis哨兵模式和集群模式的基础,为构建更高层次的高可用架构提供支撑。
(三)拓扑结构
一主一从:最简单的拓扑结构,主要用于主节点故障时的故障转移支持,适用于对数据可靠性要求较
高但并发需求相对较低的场景。
一主多从(星形拓扑):一个主节点连接多个从节点,可利用多个从节点实现读写分离,大幅提升读
操作的并发处理能力,适合读占比较大的业务场景。
树状主从:从节点不仅可以复制主节点数据,还能作为其他从节点的主节点继续向下层复制。通过引
入中间层,可有效降低主节点的同步压力和数据传输量,适用于从节点数量较多的大规模集群场景。
二、Redis主从复制原理
(一)复制流程
连接建立阶段从节点执行
SLAVEOF(Redis4.0后可使用REPLICAOF)命令后,首先保存主节点的IP和端口信息。随后从节点向主节点发送同步命令(
SYNC或PSYNC)尝试建立连接,连接建立成功后,从节点发送
PING命令检测网络套接字是否可用以及主节点是否可处理命令。若主节点设置了密码验证,从节点需提供正确密码才能通过验证。
数据同步阶段
全量同步:当从节点初次连接主节点,或从节点重启后无法进行增量同步时,会触发全量同步。主节点
执行
bgsave命令生成RDB快照文件,同时将生成快照期间收到的写命令存储到复制缓冲区。RDB文件生成完成后,主节点将其发送给从节点,从节点清空原有数据并加载RDB快照。之后主节点再将复制缓冲
区中的写命令发送给从节点,从节点执行这些命令,完成数据初始化。
增量同步:全量同步完成后,主节点会将后续收到的每一条写命令实时发送给从节点,从节点接收并执
行这些命令,保持与主节点数据的一致性。
命令传播阶段主节点与从节点建立长连接,主节点每执行一条写命令,就会通过该连接将命令发送给从
节点,从节点执行命令后,数据与主节点保持同步。
(二)断点续传机制
Redis2.8版本及以上支持断点续传功能。主节点会维护一个复制积压缓冲区,缓存最近一段时间的写命令,同
时主节点和从节点各自维护一个复制偏移量和主节点运行ID。当主从节点网络连接断开后重新连接时,从节点
会将自身记录的复制偏移量和主节点运行ID发送给主节点。若主节点运行ID一致,且从节点提供的偏移量在复
制积压缓冲区范围内,主节点会从该偏移量开始,将缓冲区中的写命令发送给从节点,实现断点续传;若不满
足条件,则触发全量同步。
三、Redis主从集群搭建
(一)环境准备
以在单台服务器上搭建一主二从的伪集群为例,需准备Redis安装包,将Redis配置文件(redis.conf)复制3份,
分别命名为6379.conf、6380.conf、6381.conf,对应三个不同端口的Redis实例。
(二)配置文件修改
分别修改三个配置文件中的以下内容:
端口号:将
port参数分别设置为6379、6380、6381。PID文件名:修改
pidfile参数,如/var/run/redis_6379.pid、/var/run/redis_6380.pid、/var/run/redis_6381.pid。日志文件名:设置
logfile参数,如"6379.log"、"6380.log"、"6381.log"。RDB文件名:修改
dbfilename参数,如dump6379.rdb、dump6380.rdb、dump6381.rdb。从节点只读配置:在从节点的配置文件中添加
slave-read-only yes,开启从节点只读模式,避免从节点写操作导致数据不一致。
(三)启动实例与配置主从关系
分别启动三个Redis实例:
redis-server 6379.conf
redis-server 6380.conf
redis-server 6381.conf
配置主从关系: 使用
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和端口,
以此验证主从集群是否搭建成功。
四、主从复制的不足与优化方向
(一)存在的不足
主节点故障需人工干预:主节点故障后,需手动将一个从节点晋升为主节点,同时修改应用程序
的主节点地址,并重新配置其他从节点复制新主节点,整个过程缺乏自动化能力。
主节点性能瓶颈:主节点的写能力和存储能力受单机限制,在写操作密集或数据量极大的场景下,
单主节点可能无法满足需求。
(二)优化方向
引入哨兵模式:通过哨兵节点自动监控主从节点状态,当主节点故障时,自动将从节点晋升为主节
点,并完成其他从节点的重新配置,实现故障转移的自动化。
采用集群模式:Redis集群模式将数据分片存储在多个主节点上,每个主节点可配备多个从节点,
不仅提升了系统的存储容量和写性能,还进一步增强了系统的高可用性和容错能力。