Redis主从架构概述
Redis主从架构是一种分布式数据库架构,它包括一个主节点(Master)和一个或多个从节点(Slave)。主节点处理所有写操作,从节点负责复制主节点的数据并处理读请求。以下是主从架构的核心组件:
主节点(Master):
- 主节点是Redis集群的核心,负责处理所有写操作。
- 客户端连接到主节点,并向其发送写请求。
- 主节点将写操作同步到所有连接的从节点,以保持数据一致性。
从节点(Slave):
- 从节点是主节点的复制品,其数据与主节点保持同步。
- 从节点可以处理读操作,但不允许进行写操作(只读)。
- 如果主节点不可用,可以将从节点提升为新的主节点。
主从同步步骤
具体步骤如下:
1、从节点根据自身状态,发送 psync
命令给 master:
- 如果从实例从未执行过
replicaof
,则从节点发送 psync ? -1,代表全量,从 -1 处开始复制。 - 如果从节点之前执行过
replicaof
,则取当前实例中记录下 runID和 offset,执行命令psync <runID> <offset>
, runID 是主节点 runID,offset 是复制偏移量。
2、主节点根据接收到的psync
命令及当前服务器状态,决定执行全量复制还是部分复制:
-
对比主、从节点的 runID 一致,且从节点发送
slave_repl_offset
之后的数据在repl_backlog_buffer
缓冲区中均存在(队列是环形的,有可能被擦除重写了),则回复 CONTINUE,代表以追加模式进行部分复制。 -
runID 与从节点发送的 runID 不同,或者从节点发送的
slave_repl_offset
之后的数据已不在主节点的repl_backlog_buffer
缓冲区中 (因为队列是环形的,所以等待时间太长或者有断连的情况,有可能被擦除重写了),则回复从节点FULLRESYNC <runid> <offset>
,表示要进行全量复制,同时记下主节点的 runID 和offset。日志如下:
repl_backlog_buffer
:它是为了从库断开之后,如何找到主从差异数据而设计的环形缓冲区,从而避免全量复制带来的性能开销。如果从库断开时间太久,repl_backlog_buffer环形缓冲区被主库的写命令覆盖了,那么从库连上主库后只能乖乖地进行一次全量复制,所以repl_backlog_buffer配置尽量大一些,可以降低主从断开后全量复制的概率 。而在repl_backlog_buffer
中找主从差异的数据后,如何发给从库呢?这就用到了replication buffer
。
replication buffer
:Redis和客户端通信也好,和从库通信也好,Redis都需要给分配一个 内存buffer进行数据交互,客户端是一个client,从库也是一个client,我们每个client连上Redis后,Redis都会分配一个client buffer,所有数据交互都是通过这个buffer进行的:Redis先把数据写到这个buffer中,然后再把buffer中的数据发到client socket中再通过网络发送出去,这样就完成了数据交互。所以主从在增量同步时,从库作为一个client,也会分配一个buffer,只不过这个buffer专门用来传播用户的写命令到从库,保证主从数据一致,我们通常把它叫做replication buffer
。
repl_backlog_size
环形缓冲区写满之后,从库是会丢失掉那部分被覆盖掉的数据,还是直接进行全量复制
- 一个从库如果和主库断连时间过长,造成它在主库
repl_backlog_buffer
的slave_repl_offset
位置上的数据已经被覆盖掉了,此时从库和主库间将进行全量复制。 - 每个从库会记录自己的
slave_repl_offset
,每个从库的复制进度也不一定相同。在和主库重连进行恢复时,从库会通过psync命令把自己记录的slave_repl_offset
发给主库,主库会根据从库各自的复制进度,来决定这个从库可以进行增量复制,还是全量复制。
主从架构的优势
Redis主从架构具有多个关键优势:
-
高可用性:通过故障转移机制,Redis主从架构提供了高可用性。如果主节点出现故障,可以快速切换到一个从节点,几乎没有停机时间。
-
读写分离:Redis主从架构允许从节点处理读操作,从而减轻了主节点的读负载,提高了整体性能。
-
数据冗余:从节点是主节点的复制,提供了数据冗余。即使主节点出现问题,数据仍然可用。
-
灵活性:可以根据需要扩展从节点,以处理更多的读请求,从而提高系统的扩展性。
如何搭建Redis主从架构
本地搭建可以参考:使用Docker Compose搭建Redis主从复制环境
要搭建Redis主从架构,需要执行以下步骤:
-
安装和配置Redis :在主节点和从节点上安装Redis,并配置它们的
redis.conf
文件,确保允许数据复制。 -
启动主节点:首先启动主节点,确保其正常运行。
-
启动从节点:启动从节点,并在配置文件中指定主节点的IP地址和端口。这个跟MySQL很类似。
bashreplicaof <masterip> <masterport>
-
数据同步 :从节点会自动连接到主节点并请求数据复制。可以使用
INFO replication
命令检查复制状态。 -
测试和监控:验证主从架构是否正常工作,监控主节点和从节点的性能和状态。
结论
Redis主从架构是一种强大的架构模式,可用于提高Redis数据库的可用性、性能和可扩展性。它通过将写操作集中在主节点上,同时允许多个从节点处理读操作,为应对高负载和故障提供了解决方案。通过了解Redis主从架构的工作原理和配置方法,可以更好地利用Redis来构建强大的应用程序和服务。