Redis复制原理

176 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 16 天,点击查看活动详情

模拟场景

1、主机挂了,查看从机信息,主机恢复,再次查看信息

停掉主机后:

image.png

主机恢复:

image.png

image.png

总结:主机挂了,查看从机信息(从机配置信息不变),主机恢复,再次查看信息(主机还是有两个从机,从机配置不变)

2、从机挂了,查看主机信息,从机恢复,查看从机信息

我将6380服务停掉:

image.png

节点链路

image.png 上一个Slave 可以是下一个slave 和 Master,Slave 同样可以接收其他 slaves 的连接和同步请求,那么 该 slave 作为了链条中下一个的master,可以有效减轻 master 的写压力!

节点1节点2节点3
从 主

image.png

此时我们在6379服务上添加一个值。其他的两个服务都获取到了值。

image.png

从升主

一主二从的情况下,如果主机断了,从机可以使用命令 SLAVEOF NO ONE 将自己改为主机!

这个时候其余的从机链接到这个节点。对一个从属服务器执行命令 SLAVEOF NO ONE 将使得这个从属服务器 关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。

image.png

复制原理

可参考:blog.csdn.net/zhaohuodian…

复制过程

  1. 从节点执行 slaveof 命令。
  2. 从节点只是保存了 slaveof 命令中主节点的信息,并没有立即发起复制。
  3. 从节点内部的定时任务发现有主节点的信息,开始使用 socket 连接主节点。
  4. 连接建立成功后,发送 ping 命令,希望得到 pong 命令响应,否则会进行重连。
  5. 如果主节点设置了权限,那么就需要进行权限验证;如果验证失败,复制终止。
  6. 权限验证通过后,进行数据同步,这是耗时最长的操作,主节点将把所有的数据全部发送给从节点。
  7. 当主节点把当前的数据同步给从节点后,便完成了复制的建立流程。接下来,主节点就会持续的把写命令发送给从节点,保证主从数据一致性

image.png

全量复制

Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。

步骤如下(可了解):

  1. 从服务器连接主服务器,发送SYNC命令。
  2. 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令。
  3. 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令。
  4. 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照。
  5. 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令。
  6. 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令。

注意:如果master和slave之间的连接出现断开,slave可以自动重连到master。根据版本的不同,断连后同步的方式也不同:

2.8版本之前:重连成功之后,一次全量同步操作将被自动执行。 2.8版本之后:重连成功之后,进行部分同步操作。

只要是重新连接master,一次完全同步(全量复制)将被自动执行

增量复制

Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。 增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。

心跳

主从节点在建立复制后,他们之间维护着长连接并彼此发送心跳命令。

心跳的关键机制:

  1. 主从都有心跳检测机制,各自模拟成对方的客户端进行通信,通过 client list 命令查看复制相关客户端信息,主节点的连接状态为 flags = M,从节点的连接状态是 flags = S。

image.png

  1. 主节点默认每隔 10 秒对从节点发送 ping 命令,可修改配置 repl-ping-slave-period 控制发送频率。

  2. 从节点在主线程每隔一秒发送replconf ack{offset} 命令,给主节点上报自身当前的复制偏移量。

  3. 主节点收到 replconf 信息后,判断从节点超时时间,如果超过 repl-timeout 60秒,则判断节点下线。