持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情
复制场合
-
初次复制:从服务器以前没有复制过任何服务器或者从服务器当前要复制的主服务器和上一次复制的服务器不一致。
-
断线后复制:处于命令传播状态阶段因为网络原因中断了复制,从服务器在此连接主服务器,继续复制主服务器。
旧版复制
-
同步操作作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态。
-
命令传播使得主从服务器的状态达到一致状态
同步
-
从服务器向主服务器发送SYNC命令。
-
主服务器收到SYNC命令后执行BGSAVE在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令。
-
当主服务器BGSAVE执行完后,主服务器将生成的RDB文件发送给从服务器,从服务器利用RDB文件更新自己的数据库数据。
-
主服务器将缓冲区重所有的命令发送给从服务器,从服务器执行完后指令后达到主从一致状态。
命令传播
为了让从服务器再次回到一致状态,主服务器需要对从服务器执行命令传播操作,主服务器会将自己执行的所有写操作发送给从服务器。
旧版缺陷
如果时由于网络中断从服务器再次复制主服务器,因为不知道复制的进度,所以会导致开始复制,造成资源的大量浪费。影响数据库的性能。
新版复制
新版使用PSYNC替代PSYNC来执行复制时的同步操作。 PSYNC有两种模式:
- 完成重同步:和SYNC执行的步骤一样。
- 部分重同步:记录了复制的进度,断线重连后只需继续上一次的进度即可。
具体实现
部分重同步 部分重同步的构成:
- 主服务器的复制偏移量,从服务器的复制偏移量
主服务器每次像从服务器传播N个字节数据,就将自己的复制偏移量的值添加N 从服务器每次收到主服务器传播来的N个字节数据后,就将自己的复制偏移量加上N(比较像TCP)
- 主服务器的复制积压缓存
是由主服务器维护的一个固定长度的先进先出队列,默认大小为1MB。 断线重连后,如果从服务器发来的偏移量仍然在缓冲区中,执行部分重同步,如果不在缓冲区中,执行完整重同步。
缓冲区的大小可以通过配置文件进行设置:
大小=断线重连数据库的平均时间*主服务器平均每秒写执行的数据量
一般设值为这个大小的2倍就可以保证大多数情况下使用部分重同步。
- 服务器的运行ID
主服务器在第一次复制的时候会将自己的ID发送给从服务器,从服务器会将ID进行保存,断线重连后,从服务器会将自己保存的ID发给主服务器,和主服务器匹配之后,才会考虑是否执行部分重同步,否则执行完整重同步。