主从架构配置
在 save 节点中的 redis.conf 中修改:
replicaof 192.168.12.106 6379
masterauth xxxx
启动主从节点即可
主从复制原理
流程概述
slave 节点启动后会根据配置文件中的 master 节点信息,
与 master 节点建立 socket 网络连接,
然后发送 ping 命令给 master 节点,如果 master 设置了 requirepass,那么 salve 节点必须发送 masterauth 的口令过去进行认证,
刚开始是 Psync 命令,Psync ? -1,表示要求 master 主机同步数据
主机会向从机发送Replication ID
和offset
,因为 slave 并没有对应的 offset,所以会进行一次全量复制。
全量复制
1、从机向主机发送 PSYNC 指令,
2、主机会向从机发送Replication ID
和offset
,
3、从机 slave 会保存发过来的主机 master 信息
4、主节点收到全量复制的命令后,执行 bgsave(异步执行),在后台生成 RDB 文件(快照),并使用一个缓冲区(称为复制缓冲区)记录从现在开始执行的所有写命令
5、主机发送 RDB 文件给从机
6、发送缓冲区数据
7、刷新旧的数据。从节点在载入主节点的数据之前要先将老数据清除
8、加载 RDB 文件将数据库状态更新至主节点执行 bgsave 时的数据库状态和缓冲区数据的加载。
backlog
master 节点有一个 backlog,默认是 1MB 大小,master node 给 slave node 复制数据时,也会将数据在 backlog 中同步写一份
backlog 主要是用来做全量复制中断候的增量复制的。
Replication ID
info replication,可以看到 master_replid,master_replid2
master_replid: 复制 id1(后文简称:replid1),一个长度为 41 个字节(40 个随机串+’0’)的字符串,每个 redis 实例都有,和 runid 没有直接关联,但和 runid 生成规则相同。当实例变为从实例后,自己的 replid1 会被主实例的 replid1 覆盖。
master_replid2:复制 id2(后文简称:replid2),默认初始化为全 0,用于存储上次主实例的 replid1。
增量复制
如果全量复制过程中,master-slave 网络连接断掉,那么 salve 重新连接 master 时,会触发增量复制,msater 会根据 slave 发送的 psync 中的 offset 来从 backlog 中获取丢失的数据,然后发送给 slave node,默认 backlog 就是 1MB。