一、名词解释
1、全流同步和增量同步
2、SYNC和PSYNC (全量同步和增量同步)
3、PSYNC <runid> <offset> 增量同步方式
1)、runid:主服务器ID
2)、offset:从服务器最后接收命令的偏移量
Master成功发送N个字节的命令后会将Master的offset加上N
Slave在接收到N个字节命令后同样会将Slave的offset增加N
3)、复制积压缓冲区
复制积压缓冲区是由Master维护的一个固定长度的FIFO队列,它的作用是缓存已经传播出去的命令。
二、全量同步
1、全量同步场景
a.第一次连接时,进行全量同步
b.网络抖动时,从库发送PSYNC runid offset,请求增量同步时,master 判断如果runid和本机id不一致或者双方offset差距超过了复制积压缓冲区大小,那么就会返回FULLRESYNC runid offset,Slave将runid保存起来,并进行完整同步。
三、增量同步
1、客户端向服务器发送SLAVEOF命令,让当前服务器成为Slave;
2、当前服务器根据自己是否保存Master runid来判断是否是第一次复制,如果是第一次同步则跳转到3,否则跳转到4;
3、向Master发送PSYNC ? -1 命令来进行完整同步;
4、向Master发送PSYNC runid offset;
5、Master接收到PSYNC 命令后首先判断runid是否和本机的id一致,如果一致则会再次判断offset偏移量和本机的偏移量相差有没有超过复制积压缓冲区大小,如果没有那么就给Slave发送CONTINUE,此时Slave只需要等待Master传回失去连接期间丢失的命令;
6、如果runid和本机id不一致或者双方offset差距超过了复制积压缓冲区大小,那么就会返回FULLRESYNC runid offset,Slave将runid保存起来,并进行完整同步。
四、部分参数
1、repl-timeout
三种情况认为复制超时:
1)slave角度,如果在repl-timeout时间内没有收到master SYNC传输的rdb snapshot数据,
2)slave角度,在repl-timeout没有收到master发送的数据包或者ping。
3)master角度,在repl-timeout时间没有收到REPCONF ACK确认信息。
当redis检测到repl-timeout超时(默认值60s),将会关闭主从之间的连接,redis slave发起重新建立主从连接的请求。
对于内存数据集比较大的系统,可以增大repl-timeout参数。
2、slave ping period
redis slave会定期从master发送ping命令,时间间隔repl-ping-slave-period指定。
因而,设置参数时, repl-timeout > repl-ping-slave-period。
Slaves send PINGs to server in a predefined interval. The default value is 10 seconds.
repl-ping-slave-period 10
3、repl-backlog-size
当主服务器进行命令传播的时候,maser不仅将所有的数据更新命令发送到所有slave的replication buffer,还会写入replication backlog。
当断开的slave重新连接上master的时候,slave将会发送psync命令(包含复制的偏移量offset),请求partial resync。如果请求的offset不存在,那么执行全量的sync操作,相当于重新建立主从复制。
4、client-output-buffer-limit
client buffer是在server端实现的一个读取缓冲区。redis server在接收到客户端的请求后,把影响结果写入到client buffer中,而不是直接发送给客户端。
server把结果写入到client buffer中后,继续处理客户端的其他请求。这样异步处理方式使redis server不会因为网络原因阻塞其他请求的处理。之前的文章中replication buffer也是client buffer中的一种。
- "client-output-buffer-limit"
- "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"
具体参数含义如下:
class : 客户端种类,normal、slave、pubsub。
– mormal:普通的客户端
– slave: 从库的复制客户端
– pub/sub: 发布与订阅的客户端的
hard limit: 缓冲区大小的硬性限制。
soft limit: 缓冲去大小的软性限制。
soft seconds: 缓冲区大小达到了(超过)soft limit值的持续时间。
client-output-buffer-limit参数限制分配的缓冲区的大小,防止内存无节制的分配。参数的默认值都为0,意思是不做任何限制。
hard limit:当buffer的量达到硬限制之后,redis立即断开与client的连接
soft limit和soft seconds:当buffer的在soft seconds秒内超出了soft limit,redis不会关闭client连接。如果当buffer的在soft seconds秒之后,仍然超出了soft limit 的限制,则redis立即关闭client连接。