Redis学习之复制
复制
slaveof master-ip master-port
SYNC
-
1、从服务器发送 SYNC命令同步数据库数据
-
2、主服务器收到SYNC命令后,执行BGSAVE,生成RDB文件,再利用缓冲区记录此后的命令
-
3、主服务器BGSAVE完成后,将RDB文件发送给从服务器,给其加载数据
-
4、主服务器将缓冲区里面的命令发送给从服务器执行,两者状态一致。
SYNC命令是一个非常耗费资源的命令,原来如果主从断开连接,当从服务器再次连接上主服务器时,从服务器又会发送SYNC命令。
redis2.8 之后使用了PSYNC命令,初次主从同步操作跟上面一样。而断线重连之后,依据以下数据同步数据库。
-
主服务器的复制偏移量和从服务器的复制偏移量
主服务器每复制N个字节,偏移量加上N,从服务器每接收N个字节偏移量加上N, 对比偏移量就可以知道主从同步是否一致。不一致通过积压缓冲区恢复主从服务器的不一致的数据
-
主服务器的复制积压缓冲区
是一个默认大小为1M的先进先出队列。当写命令写入主库,积压缓冲区就会写入命令并且记录偏移量,如果offset以后的数据存在复制后面的数据,如果offset后面的数据不存在,那么完整复制。
-
服务器的运行ID
通过运行ID来确认断线重连的从服务器是不是之前的从服务器。
PSYNC <runid> <offset> runid:断线前复制的主服务器ID offset:从服务器最后接收命令的偏移量。主服务器返回 +CONTINUE 执行部分同步复制操作
复制的实现
1、设置主服务器的ip port:
2、建立到主服务器的连接:
3、发送PING命令:主服务器返回PONG表示正常
4、身份验证:
5、发送端口信息:主服务器 info REPLICATION 打印出从服务器的监听端口号信息
6、同步:PSYNC
7、命令传播:接收主服务器的写命令
心跳检测
从服务器会以每秒一次的频率发送REPLCONF ACK <replication_offset>给主服务器
1、检测主从的连接状态
2、辅助实现min-slaves选项
3、检测命令丢失:如果从服务器发送的offset跟主服务器不一样,主库会同步数据