redis主从复制
Redis 主从复制
Redis主从结构
所有的数据修改只在主服务器上进行,然后将最新的数据同步给从服务器,这样就使得主从服务器的数据是一致的。
从连接主
从服务器请求连接主服务器
服务器 B 执行这条命令 replicaof <服务器 A 的 IP 地址> <服务器 A 的 Redis 端口号>
从服务器发送psync
命令
psync runID offset
其中:
- runID: 每个 Redis 服务器在启动时都会自动生产一个随机的 ID 来唯一标识自己。当从服务器和主服务器第一次同步时,因为不知道主服务器的 run ID,所以将其设置为 "?"。
- offset: 表示复制进度,第一次连接为-1
主服务器返回复制请求
fullresync runID offset
- runID: 主服务器的 run ID
- offset: 主服务器的复制偏移量
从服务器接收到后会保存runID和offset
全量复制
全量复制出现在第一次连接和连接断开后重新连接时。
主服务器执行bgsave
命令,fork一个子进程,将内存数据以rdb文件格式进行保存,然后发送给从服务器
注意三个时间间隙:
- 主服务器生成rdb文件时
- 主服务器发送rdb文件时
- 从服务器加载rdb文件时
在这三个时间段,写
请求会记录到 replication buffer
中,直到从服务器
完成加载rdb文件到内存中,主服务器
会将replication buffer
缓存的写命令发送给从服务器
,这样就保证了主从服务器的数据一致性。
命令传播
主从服务器连接会一直keep
,用于发送写操作,属于长连接
,叫做基于长连接的命令传播
目的是为了避免重复tcp连接造成的性能开销
增量复制
增量复制适用于主从连接建立后,网络波动导致断开,二者重新连接并进行数据同步
在2.8
版本添加
从服务器重新连接到主服务器后,会再次发送psync
命令,但这次发送,runID
和offset
是已知的
这里涉及到replication buffer
,repl_backlog_buffer
,replication offset
-
repl_backlog_buffer:这是一个环形缓冲区,一个主服务器只存在一个
repl_backlog_buffer
,写命令在执行结束后会记录在repl_backlog_buffer
在buffer满时,会重新头部命令,保证最新的命令在buffer中 -
replication buffer: 在全量复制阶段和增量复制阶段都会出现,主节点会给每个新连接的从节点,分配一个 replication buffer,满了,会导致连接断开,删除缓存,从节点重新连接,重新开始全量复制
-
replication offset: 用于
repl_backlog_buffer
偏移量记录
主服务器使用master_repl_offset
来记录自己「写」到的位置,从服务器使用slave_repl_offset
来记录自己「读」到的位置。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?