共有三种模式:全量复制、基于长连接的命令传播、增量复制
1、全量复制
第一次同步采用全量复制,即将主服务器的所有数据同步给从服务器。
第一次同步分为三个阶段:
- 第一阶段是建立链接、协商同步;
- 第二阶段是主服务器同步数据给从服务器;为了保证主从服务器数据一致,将生成RDB文件过程中新的写操作命令记录到replication buffer缓冲区。
- 第三阶段是主服务器发送新的写操作命令给从服务器,将缓冲区的命令发送给从服务器。
2、基于长连接的命令传播
第一次同步后,主动服务器双方建立TCP连接,而且是长连接,避免频繁的TCP连接和断开带来性能开销。
3、增量复制
连接过程中,突然断开连接,然后又恢复连接。在这个过程中新的写操作命令将会采用增量复制的模式同步给从服务器。
那么主服务器如何知道要将哪些增量数据同步给从服务器呢?主要利用一下两个东西:
- repl_backlog_buffer,一个环形缓冲区,用于主从服务器断开连接后,找到差异数据;
- replication offset,标记环形缓冲区的同步进度,主从服务器都有各自的偏移量,主服务器标记写的位置,从服务器标记读的位置。
主服务器进行命令传播的同时,会将命令写入到环形缓冲区中,当连接断开又恢复后,从服务器会将自己的读的偏移量发送给主服务器,主服务器通过判断读写的差距,决定采用什么方式进行同步:
- 如果发现从服务器要读的数据还在缓冲区中,采用增量复制
- 如果不在,采用全量复制
所以缓冲区的大小会决定是否采用增量复制,一般情况下缓冲区大小设置为sencond * write_size_per_second(断开连接后再次连上主服务器的时间 * 主服务器每秒产生的写命令数据大小)