集群
主从同步
主从同步的过程?
1、从节点与主节点建立连接
slave: replicaof
2、从节点向主节点请求同步数据
slave: psync
3、主节点判断是增量同步还是全量同步
全量同步两种情况
a.slave传入的runID与master的不一致
b.slave传入的runID与master的一致,但是replica offset不在复制缓冲区内
增量同步一种情况
a.slave传入的runID与master的一致,并且replica offset在复制缓冲区内
4、主节点异步生产RDB文件并发送给从节点
master: bgsave
5、从节点清空内存然后执行RDB文件
6、主节点会将上述3个时间段的写命令记录到 replication buffer 缓冲区里
- 主服务器生成 RDB 文件期间;
- 主服务器发送 RDB 文件给从服务器期间;
- 从服务器加载 RDB 文件期间;
7、主节点等从节点加载完RDB后,发送新写操作命令给从服务器
master如何判断是全量复制还是增量复制?
runID
在进行初次复制时,主服务器将会将自己的runID发送给从服务器,让其保存起来。
当从服务器断线重连后,从服务器会将这个runID发送给刚连接上的主服务器。
若当前服务器的runID与之相同,说明从服务器断线前复制的服务器就是当前服务器,主服务器可以尝试执行部分同步;若不同则说明从服务器断线前复制的服务器不是当前服务器,主服务器直接执行完整重同步
repl_backlog_buffer 复制积压缓冲区
复制积压缓冲区是一个固定长度,先进先出的队列,默认 1MB。
当主服务器进行命令传播时,不仅会将命令发送给从服务器,还会发送给这个缓冲区。
当从服务器向主服务器发送 psync 命令时,还需要将自己的复制偏移量带上,主服务器就可以通过这个复制偏移量和复制积压缓冲区的偏移量进行对比。
若复制积压缓冲区存在从服务器的复制偏移量 + 1 后的数据,则进行部分重同步,否则进行完整重同步。
replication offset 复制偏移量
执行复制的主从服务器都会分别维护各自的复制偏移量:
主服务器每次向从服务器传播 n 个字节数据时,都会将自己的复制偏移量加 n。
从服务器接受主服务器传来的数据时,也会将自己的复制偏移量加 n
命令传播
主从服务器在完成第一次同步后,双方之间就会维护一个 TCP 连接。
后续主服务器可以通过这个连接继续将写操作命令传播给从服务器,然后从服务器执行该命令,使得与主服务器的数据库状态相同。
而且这个连接是长连接的,目的是避免频繁的 TCP 连接和断开带来的性能开销。
上面的这个过程被称为基于长连接的命令传播,通过这种方式来保证第一次同步后的主从服务器的数据一致性。
下面两个缓冲区repl_backlog_buffer与replica_buffer的区别?
那 repl_backlog_buffer 缓冲区是什么时候写入的呢?
在主服务器进行命令传播时,不仅会将写命令发送给从服务器,还会将写命令写入到 repl_backlog_buffer 缓冲区里,因此 这个缓冲区里会保存着最近传播的写命令。
网络断开后,当从服务器重新连上主服务器时,从服务器会通过 psync 命令将自己的复制偏移量 slave_repl_offset 发送给主服务器,主服务器根据自己的 master_repl_offset 和 slave_repl_offset 之间的差距