首页 > 代码库 > Redis之主从同步

Redis之主从同步

 同步

     Redis为什么要实现主从同步?

    主从同步,有以下好处:

  1.      实现数据的备份,减少单点故障带来的损失;
  2.      有利于实现负载均衡。本来一台服务器负责所有数据的读写,而通过主从同步,可以让多个从服务器负责数据的读,而主服务器主要负责数据的写,减轻了单点压力。


部分重同步

     Redis从2.8开始,引入了PSYNC,支持部分重同步:主服务器和从服务器断开连接这段时间,主服务器的数据可能只是发生了少量的变化,那么当从服务器重新连上主服务器时,就没有必要把主服务器里面的数据全部发给从服务器进行数据覆盖,只需要把不一致的数据发给从服务器,这样避免了主服务器进行数据备份、数据的网络传输。



同步的过程

下面使用两台机器,A(10.15.62.11 :6379)作为从服务器,B(10.15.62.12  :6380)作为主服务器,介绍一下A和B进行初次完全同步和部分重同步的过程。

  1. 通过客户端向A发送slaveof 10.15.62.12 6380的命令, A收到命令之后,会向客户端返回+OK;
  2. A和B之间建立套接字;
  3. A向B发送PING命令,有两个目的:1)验证AB之间的套接字有没有问题;2)B服务器能够处理命令,对外服务。
  4. B向A返回PONG;
  5. 如果A设置了masterauth,表示需要身份验证。那么A会向B发送AUTH命令,命令参数是masterauth的值。
  6. 如果A发送的值和B的requirepass值相同,则通过验证。
  7. A向B发送REPLCONF listening-port 6379,B会把A的端口保存起来,唯一的用途是:用户使用客户端向B发送INFO replication命令时,显示从服务器的端口。
  8. A向B发送PSYNC ? -1;
  9. B接受PSYNC命令后,把自己的run-id和自己的复制偏移量发给A,A会把B的运行id保存起来,并且把B的复制偏移量作为自己的复制偏移量;B然后执行BGSAVE操作,通过子进程生成一份RDB数据,同时把执行BGSAVE命令期间接收到的写命令保存起来。
  10. B把RDB数据发给A,A把自己的数据库清空,把B的RDB数据加载到内存里面;B把复制的写命令发给A。
  11. 同步完成;
  12. 然后向B写数据时,B会向A传递命令。
  13. A和B突然断开;
  14. A和B重新连接;
  15. A向B发送PSYNC <run-id>  <offset>……run-id是自己保存的主服务器的运行id,offset是自己的复制偏移量。
  16. B接收到PSYNC及其参数,发现运行id和自己的运行id相同;发现offset之后的数据在自己的复制积压缓冲区里面,只需要部分重同步,向A返回+CONTINUE。
  17. B把积压缓冲区里面的数据发给A。
  18. 再次同步。


代码实现:

未完待续。



参考资料:

《Redis设计与实现》第15章

Redis主从同步源码浅析-Slave端
















Redis之主从同步