redis2.8之后开始支持主从短线后数据的断点重传,使用psync代替sync。
当从服务器执行slave of 命令后,主服务器开始创建RDB文件,然后把RDB文件发送给从服务器,在创建以及发送RDB文件的过程中,如果有写redis的操作,主服务器会将写命令保存在缓冲区中,在发送完RDB文件后,将缓冲区中的命令再发送给从服务器,从而达到主从状态一致。在达到主从状态一致后的某个时间,主从意外断开了连接又重连后,主从是通过互相保存的offset来进行断点重传。
举例:一主两从redis服务器A和B,在A和B从服务器连接到主redis服务器开始同步的时候,offset的值都是0,假设在全部同步结束后,三台服务器offset都是1000. 这时从服务器A断开了连接,主服务器继续向AB传输数据20字节,主服务器offset变成1020,B也变成了1020。A重新连接上之后,将自己的offset发送给主服务器,主服务器发现自己的offset与A服务器的offset不同,则从A的offset开始的位置,将数据重新传给A服务器。
那么重传的这部分数据是存储在哪里的呢?也是一段缓冲区当中,叫复制积压缓冲区,它是一个先进先出的固定长度的队列。缓冲区的大小可以通过repl-backlog-size配置,如果主从服务器断开时间过长,而复制积压缓冲区的大小又太小,不足以保存断线这段时间的数据,则需要全部重传。所以缓冲区的大小最好设置为每秒的写入量 * 恢复连接需要的时间 * 2。
整体主从服务器同步的过程:
1,主从建立socket连接。
2,从服务器发送ping命令测试网络连接情况,主服务器回复pong命令表示网络良好。
3,如果需要,主从配置的密码,则进行身份验证。
4,从服务器发送psync命令开始同步,主设备进行相应的命令回复。