在Redis中,用户可以通过执行SALVEOF命令,让一个服务器去复制另一个服务器。
127.0.0.1:12345> SLAVEOF 127.0.0.1 6379 OK
Redis的复制功能分为同步(sync)和命令传播两个操作:
客户端向服务器发送SYNC命令,SYNC步骤:
在同步执行完毕之后,主从达到一致状态,但是当 主 执行客户端的命令时,主从再次不一致。
为了让主从再次回到一致状态,主 需要对 从 执行命令传播操作:主 会将自己执行的写命令发送给 从 ,这样就回
到主从一致了(迫真)。
对于第一次复制来说旧版是可以的,但是对于断线后重连效率是很低的,因为,断线重连的服务器保存的数据大部
分是相同的,发送SYNC命令传送RDB文件并不是非做不可的!
SYNC命令是一个非常耗费资源的操作。
为了解决旧版的问题,Redis从2.8开始,使用PSYNC代替SYNC。
PSYNC有完整重同步和部分重同步2个命令:
完整重同步:与同步命令是一样的。
部分重同步:如果条件允许,主 可以将主从服务器连接断开期间执行的写命令发送给 从。
部分重同步由以下三个部分构成:
主服务器的复制偏移量(replication offset)和从服务器的复制偏移量。
主服务器的复制积压缓冲区(replication backlog)。
服务器的运行ID(run ID)。
A断线后,从服务器向主服务器发送PSYNC,报告A的offset为10086。
缓冲区由主服务区维护的固定长度先进先出(fixed-size FIFO)队列,默认大小为1MB。
当主服务器进行命令传播时,不仅会将命令发送给从服务器,还会将写命令入队到缓冲区中。
因此,主服务器的缓冲区保存着最近传播的写命令,并且记录了每个字节的偏移量。
当从服务器重新连上主服务器,从服务器发送自己的offset,主服务器根据这个offset决定执行何种操作:
根据需要调整复制积压缓冲区大小
最小大小计算公式:second * write_size_per_second
second为从服务器重新连上主服务器的平均时间。
write_size_per_second是主服务器平均每秒产生的写命令数据量。
每个服务器运行后会自动生成40个随机十六进制字符的ID。
主 和 从 初次复制时,主 会将自己的ID给 从。
当从服务器断线并重新连上主服务器时,从服务器会发送之前保存的ID给 主,如果一致就可以部分重同步。
设置主服务器的地址和端口
建立套接字连接
发送PING
身份验证
发送端口信息
同步
值得一提的是,在同步之前,只有 从 是 主 的客户端,同步之后,主 也是 从 的客户端。主从服务器双方都是对方
的客户端,他们才可以互相发送命令,主 才可以发送写命令改变 从 的数据库状态。
《Redis设计与实现》