Redis2.8之后的版本使用PSYNC命令来执行复制时的同步操作,包括完整重同步 和 部分重同步 两种模式:
完整重同步:通过让主服务器创建并发送RDB文件,以及向从服务器发送保存在缓存区里面的写命令在进行同步。
部分重同步:用于处理断线后重复制的情况。当从服务器在断线后重新连接主服务器时,如果条件允许,主服务器可以将主从服务器连接断开期间执行的写命令发送给从服务器,从服务器只要接收并执行这些写命令,就可以将数据库更新至主服务器当前所处的状态。
部分重同步涉及到以下三点
(1) 复制偏移量
(2) 复制积压缓冲区
(3) 服务器运行ID
1、复制偏移量
执行复制的主从双方会分别维护一个复制偏移量,主服务器每次向从服务器发送N个字节数据时,就将自己的复制偏移量的值加上N,从服务器每接收到主服务器发送过来的N个字节数据时,也会将自己的偏移量加上N。
这样,如果主从服务器处于一致的状态时,那么主从服务器的复制偏移量总是相同的。
2、复制积压缓冲区
如果由于断线后,主从服务器重新进行连接时,发现复制偏移量不一致了,这时就需要用到复制积压缓冲区了。
复制积压缓冲区是由主服务器维护的一个固定长度、先进先出的队列,默认大小是 1MB。当主服务器进行命令传播时,它不仅会将写命令发送给所有从服务器,还会将写命令写入复制积压缓冲区里面。这样主服务器的复制积压缓冲区就会保存着最近传播的写命令,并且记录着相应的复制偏移量。
当从服务器重新连接上主服务器时,如果发现复制偏移量不一致,就会在复制积压缓冲区中寻找对应偏移量之后的数据。
如果该偏移量也不存在复制积压缓冲区中,那么只能进行完整重同步操作了。
由以上描述可知,复制积压缓冲区的大小在网络不稳定的环境中,会大大影响集群的性能。所以合理设置复制积压缓冲区是调优的一种手段,对应的具体参数是:repl-backlog-size
3、服务器运行ID
每一个Redis服务器,无论主从,都有一个由40个随机的十六进制的字符组成的运行ID。该ID在复制的时候,用于识别主服务器是否已经更改:如果主服务器的ID跟之前复制的不一致,则说明主服务器已经发生变更。这时需要进行完整重同步。
网友评论