所谓的复制就是从一台机器复制到另外一台机器上,大部分都是我们经常听到到主从同步。或者从从同步。
同步到命令 slaveof 127.0.0.1
复制分为同步和命令传播
【旧版复制】
当从服务器向主服务器发送slaveof命令的时候主要是通过sync命令来完成的,以下介绍sync的执行步骤:
1、从服务器向主服务器发送sync命令
2、主服务器接收到sync命令后,会启动一个bgsave命令在后台生成一个rdb文件,并开辟一块缓冲区存储生成文件的过程中执行的命令
3、当主服务器生成rdb后,会推给从服务器,从服务器接收并下载。将自己的数据库更新为最新的状态
4、主服务器把记录在缓冲区里的所有命令发送给从服务器,达到数据一致。
命令传播:
即使把rdb文件同步后,仍然无法做到数据完全一致,此时就需要传播命令把新增的同步给从
弊端:
初次复制,没有任何问题,断线后重连,仍需要把rdb重新同步。这就会导致效率非常低。
【新版复制】
为了解决重复复制的低效问题。从2.8开始使用psync来代替sync的同步操作。它支持完整重同步和部分重同步。
部分重同步主要增加了
其实最主要的是在主、从中都增加了复制偏移量。这样主服务器每次发送多少字节,就像自己都的偏移量中加多少。从接收到后在自己的偏移量中也加n.
复制积压缓冲区:
主要是由主服务器维护的一个固定长度先进显出的队列。当主服务器进行命令传播的时候不仅会把命令发送给从服务器,还会把命令写入复制积压队列里。当从服务器重连后,发过来自己的偏移量在队列中,就进行部分重同步操作,相反就需要在完整重同步中操作了。
服务器运行ID:
主、从都会有个这样的id,彼此发给对方。
psync执行的流程图:
主要的命令psync <runid> <offset> ,首次psync ? -1,重连 psync 3bbd8n37n 10086
整个复制实现的步骤:
1、设置主服务器的地址和端口 slaveof 127.0.0.1 6379
2、建立套接字(socket)连接
3、向master发送Ping命令,如果收到pong,说明收发正常。
4、身份验证,如果从设置了对masterauth验证,就需要验证,不需要则不需要验证。
5、向主发送从监控的端口,以便把数据同步发到这个端口上。
6、真正开始同步
7、命令传播(同步)