Redis主从同步的原理

  1. 当主从第一次连接或断开重连时,从节点会向主节点发送psync请求,尝试数据同步
  2. 主节点判断从节点是否是第一次来同步数据
  3. 是,主节点把自己所有数据通过RDB生成RDB文件发送给从节点
  4. 否,主节点把从节点缺少的数据的写命令发送给从节点
  5. 每当主节点写数据时,都将写命令发送给从节点,保持数据一致性

问题一:主节点怎么知道从节点是第一次来同步数据?

答:每个节点存在一个属性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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还是会想她

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值