Redis主从复制是Redis提供的一种高可用性和数据冗余的解决方案。通过复制功能,Redis可以将数据从主数据库同步到多个从数据库上,从而保证数据的可靠性和可用性。
Redis 使用主从复制模式,其中一个 Redis 实例会作为主节点(master),负责接收写操作并将数据同步到从节点(slave)。从节点只能接收来自主节点的复制数据,并且在复制完成后可以提供读服务。
Redis 主从复制的主要作用
1.数据冗余备份
使用主从复制可以将 Redis 主节点的数据完全复制到其他从节点,从而实现数据的冗余备份。在主节点出现故障或数据丢失时,可以通过从节点来恢复数据。
2.读写分离
由于从节点只能接收来自主节点的复制数据,并且在复制完成后可以提供读服务,因此可以将读操作分摊到多个从节点上,从而减轻主节点的负载,提高整个系统的性能和可用性。
第一次同步:
从服务器连接到主服务器后,从节点向主节点发送 SYNC 命令,请求进行复制。主节点收到从节点的复制请求后,会执行快照同步。主节点会在内存中生成一个 RDB 文件(快照),将快照文件发送给从节点。从节点接收并加载这个快照文件,将数据初始化为与主节点一致的状态。主服务器会将在 RDB 文件生成后收到的写操作命令,写入到 replication buffer 缓冲区里。在主服务器生成的 RDB 文件发送后,然后将 replication buffer 缓冲区里所记录的写操作命令发送给从服务器,然后从服务器重新执行这些操作。到这,主从服务器的第一次同步就完成了
命令复制
在数据同步完成后,主从服务器会维护一个 TCP 长连接,主服务器会将新接收的写命令发送给从服务器,从服务器则将执行这些命令,从而保持与主服务器数据的一致性。
断线重连
如果从节点与主节点的连接断开,从节点会尝试重新连接主节点,并请求进行复制。在重新连接之后,主节点会根据上次复制的偏移量来进行同步
偏移量(offset) :用来记录从节点已复制的主节点写操作命令的字节偏移量。通过偏移量,主节点可以知道从节点复制到哪个位置,从而可以将从该位置之后的新增写操作命令发送给从节点进行增量复制。
偏移量分为主节点偏移量和从节点偏移量
复制缓冲区(Replication Backlog) :Replication backlog 是一个固定长度的环形缓冲区,它记录了主节点最近一段时间内执行的写操作命令。当从节点重新连接到主节点时,它可以提供上次复制的偏移量,并请求主节点将断线期间的写操作命令发送给它。主节点会检查从节点提供的偏移量是否在复制 backlog 的范围内,如果在范围内,就会将相应的写操作命令发送给从节点,从而实现部分同步。
Replication backlog 的大小是通过 repl-backlog-size 参数进行配置的,默认值为 1MB。设置更大的复制 backlog 大小可以增加它记录的写操作命令的数量,从而提供更长时间的部分同步能力。但是,过大的复制 backlog 也会占用更多的内存。
同步策略
Redis主节点会根据主从服务器的复制偏移量之间的差距,来决定进行增量同步还是全量同步
如果判断出从服务器要读取的数据还在 repl_backlog_buffer 缓冲区里,那么主服务器将采用增量同步的方式;主节点会根据从节点提供的偏移量,将从该偏移量之后的新增的写操作命令发送给从节点。从节点会执行这些新增的写操作命令
如果判断出从服务器要读取的数据已经不存在repl_backlog_buffer 缓冲区里,那么主服务器将采用全量同步的方式。
1、启用主节点的复制功能:
在主节点的配置文件 redis.conf 中找到 replicaof 配置项,并将其设置为从节点的 IP 地址和端口。例如:
replicaof <从节点IP> <从节点端口>
或者,你可以使用 Redis 命令行客户端执行以下命令来设置复制关系:
REPLICAOF <从节点IP> <从节点端口>
2、启动从节点:
在从节点的配置文件 redis.conf 中,确保注释掉 replicaof 配置项(如果存在),以允许从节点成为主节点。
启动从节点的 Redis 服务。
验证
可以通过以下方式验证 Redis 复制是否正常工作:
在主节点上执行 INFO replication
命令,查看复制相关的信息,确保从节点已成功连接。
在从节点上执行 INFO replication
命令,检查复制的状态和配置信息。