码迷,mamicode.com
首页 > 其他好文 > 详细

Redis的主从复制

时间:2021-01-25 10:50:21      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:ast   off   网络传输   自动   完全   连接   redis   comm   情况下   

本篇博客是对《Redis设计与实现》的学习和总结,以加深自己的印象,很多内容直接摘自原书,如需了解相关内容建议看原书
日期:2021-1-17
Redis版本:3.0.6

配置主从复制

参与复制的Redis分为主节点(master)和从节点(slave),默认情况下Redis都是主节点。复制方向是单向的,只能由从节点复制主节点的数据。一个从节点只能复制一个主节点,一个主节点可以被多个从节点复制。从节点是只读的,修改主节点的数据后,主节点会将修改命令发送给从节点,同步从节点的数据。
使用命令slaveof可以将该Redis节点设置为从节点,去复制指定的主节点。slaveof是一个异步命令,真正的复制工作在返回OK后才开始执行。

slaveof 127.0.0.1 6379

也可以用slaveof命令取消主从复制,该Redis节点的也会变为主节点

slaveof no one

复制原理

Redis的复制功能分为同步(sync)和命令传播(command propagate)两个操作。

同步

在从服务器执行slaveof命令之后,从服务器会发送sync命令对主服务器的数据库状态进行同步

  1. 主服务器接收到sync命令之后会执行bgsave命令生成一个RDB文件,并使用一个缓冲区记录在bgsave命令运行过程中主服务器执行的写命令(这个过程和执行bgrewriteaof命令相似)。主服务器bgsave命令执行完毕后,会将RDB文件发送给从服务器
  2. 从服务器接收到RDB文件后,从服务器会清除之前数据库中的所有数据,并载入RDB文件中的数据
  3. 主服务器将记录在缓冲区中的所有写命令发送给从服务器,从服务器执行这些写命令
  4. 到此从服务器就和主服务器的数据库状态就一致了

命令传播

在同步过程完成后,如果主服务器又接收到了写命令,那么主服务器和从服务器的数据库状态将不再一致。命令传播就是主服务器会将自己执行的写命令发送给从服务器,从服务器执行了相同的写命令后,主从再次保持一致。

部分重同步

在从服务器断线再次重连之后,如果重新执行上述的复制过程是非常不划算的,因为从服务器只缺少断线期间主服务器执行的写命令。所以就有了部分重同步。

部分重同步由下面三个部分组成

复制偏移量

主服务器和从服务器分别维护一个复制偏移量。当主服务器向从服务器发送N个字节的写命令数据时,主服务器的复制偏移量就会增加N,当从服务器接收到写命令数据时,从服务器的复制偏移量也会增加N。所以当主服务器和从服务器状态一致时,主从服务器的复制偏移量是一样的。

复制积压缓冲区

复制积压缓冲区是主服务器维护的一个固定长度的先进先出队列,固定长度的队列在添加一个元素时,如果长度超过了指定的长度,就会将最先添加的一个元素弹出,以保证长度不大于指定长度。当主服务器进行命令传播时,除了将写命令发送给所有从服务器,还会将写命令加入复制积压缓冲区。

这样如果从服务器断线重连,从服务器会将自己的复制偏移量offset发送到主服务器,如果接下来的写命令,也就是复制偏移量为offset + 1的写命令数据还存在于复制积压缓冲区中,那么只要将复制积压缓冲区中offset + 1到最新的写命令数据发送给从服务器,就可以完成部分同步。如果offset + 1已经不在复制积压缓冲区中了,那就只能再进行完全同步。

服务器运行ID

如果从服务器断线重连时只发送复制偏移量给主服务器,那么主服务器不能确定这个复制偏移量是复制自己的复制偏移量,还是复制其他主服务器的复制偏移量。所以需要服务器运行ID来判断。
服务器运行ID是在启动时自动生成的,在主从服务器第一次复制时,主服务器就会将运行ID发送给从服务器。当断线重连时,从服务器会将自己复制的主服务器运行ID和复制偏移量发送给主服务器,只有在从服务器发送来的服务器运行ID和自己一致,并且接下来的写命令复制偏移量存在于复制积压缓冲区时,才会进行部分同步,否则就要进行完全同步。

心跳检测

在命令传播阶段,从服务器每秒都要将自己的复制偏移量发送给主服务器,由下面三个作用

  1. 检测主从服务器的网络连接状态
    如果主服务器超过1秒没有接收到从服务器发送过来的复制偏移量,那么主服务器就会知道主从服务器之间的网络连接出现了问题。
  2. 辅助实现min-slaves
    下面两个配置选项,可以防止主服务器在不安全的情况下执行写命令
min-slaves-to-write 3
min-slaves-max-lag 10

上面配置的含义是:当从服务器数量少于3个,或者3个从服务器延迟大于等于10秒时,主服务器拒绝执行写命令
3. 检测命令丢失
如果从服务器发送过来的复制偏移量小于主服务器的复制偏移量,那么就有可能是写命令在网络传输中丢失了,这时主服务器就会从复制积压缓冲区中取出从服务器缺少的写命令,发送给从服务器。

参考资料

  • 《Redis设计与实现》
  • 《Redis开发与运维》

Redis的主从复制

标签:ast   off   网络传输   自动   完全   连接   redis   comm   情况下   

原文地址:https://www.cnblogs.com/mywuhao/p/14314291.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!