Redis主从同步的原理

发布时间:2026/5/26 20:07:49

Redis主从同步的原理 当主从第一次连接或断开重连时从节点会向主节点发送psync请求尝试数据同步主节点判断从节点是否是第一次来同步数据是主节点把自己所有数据通过RDB生成RDB文件发送给从节点否主节点把从节点缺少的数据的写命令发送给从节点每当主节点写数据时都将写命令发送给从节点保持数据一致性问题一主节点怎么知道从节点是第一次来同步数据答每个节点存在一个属性master_replid当未搭建主从集群时每个节点都认为自己是主节点master_replid不一致当搭建主从集群时主节点会向从节点发送master_replid从节点会保存这个master_replid。当主从第一次连接或断开重连时从节点会向psync请求中携带保存的master_replid主节点会判断从节点发送的master_replid是否与自己的master_replid一致一致说明是断开重连主节点把从节点缺少的数据的写命令发送给从节点不一致说明是第一次连接主节点把自己所有数据全发送给从节点。问题二主节点怎么把自己所有数据全发送给从节点全量同步答首先主节点会通过调用BGSAVE操作生成 RDB 快照在此过程中主节点会暂时冻结它的写操作对于持久化会有影响快照生成结束后就会解冻然后将当前数据库的所有数据序列化到磁盘生成RDB 文件。当RDB 文件生成完毕主节点就会通过网络将整个 RDB 文件包含数据库的完整数据传输给从节点。从节点收到 RDB 文件后会把它存储在内存中并在内存中重新加载该数据。在全量同步过程中主节点依然可以运行并处理新的写操作。此时主节点的写操作会记录在命令日志中如果启用了 AOF 持久化。从节点会继续保持与主节点的连接并通过发送复制偏移量replication offset来请求增量数据。即使在全量同步过程中主节点也可以继续接收新的写操作新的操作也会通过增量同步的方式发送给从节点。从节点接收到主节点发送的 RDB 文件后会立即删除自己的数据并加载 RDB 文件的数据将其应用到它自己的内存中。主从同步完成后从节点恢复为正常的增量同步状态持续从主节点接收增量数据确保数据的一致性。问题三增量同步时主节点怎么知道从节点缺少了什么数据答主节点会为自己维护一个 全局自增偏移量master_repl_offset和每个连接的从节点维护一个 复制偏移量slave_repl_offset并在主节点的复制积压缓冲区(repl_baklog)环形内存队列默认1MB记录每个写命令的内容和主节点的全局自增偏移量。当从节点发起增量同步请求时会携带slave_repl_offset主节点会比较在复制积压缓冲区master_repl_offset与slave_repl_offset相差的部分的命令主节点会把从节点与主节点的相差的部分的命令发送给从节点实现增量同步。优化主从集群无磁盘复制优化全量复制主节点的子进程通过 Copy-On-Write 生成 RDB 数据时初始存储于Redis 自身内存。父进程通过 write() 系统调用将 RDB 数据写入到 内核的 Socket 发送缓冲区内核的 Socket 发送缓冲区直接通过网络 Socket 发送给从节点从而避免传统两次写 RDB 文件和读 RDB 文件磁盘 I/O 带来的性能损耗。在 redis.conf 文件开启# 编辑 redis.conf vi /path/to/redis.conf # 修改以下配置 repl-diskless-sync yes # 启用无盘复制 # 重启 Redis 生效 systemctl restart redis-server提高 Redis 复制积压缓冲区大小# 编辑 redis.conf vi /path/to/redis.conf # 修改以下配置 repl-backlog-size 10mb # 支持单位kb, mb, gb # 重启 Redis 生效 systemctl restart redis-server

相关新闻