redis-主从断线重传

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命令开始同步,主设备进行相应的命令回复。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容