标签: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
命令对主服务器的数据库状态进行同步
sync
命令之后会执行bgsave
命令生成一个RDB文件,并使用一个缓冲区记录在bgsave
命令运行过程中主服务器执行的写命令(这个过程和执行bgrewriteaof
命令相似)。主服务器bgsave
命令执行完毕后,会将RDB文件发送给从服务器在同步过程完成后,如果主服务器又接收到了写命令,那么主服务器和从服务器的数据库状态将不再一致。命令传播就是主服务器会将自己执行的写命令发送给从服务器,从服务器执行了相同的写命令后,主从再次保持一致。
在从服务器断线再次重连之后,如果重新执行上述的复制过程是非常不划算的,因为从服务器只缺少断线期间主服务器执行的写命令。所以就有了部分重同步。
部分重同步由下面三个部分组成
主服务器和从服务器分别维护一个复制偏移量。当主服务器向从服务器发送N个字节的写命令数据时,主服务器的复制偏移量就会增加N,当从服务器接收到写命令数据时,从服务器的复制偏移量也会增加N。所以当主服务器和从服务器状态一致时,主从服务器的复制偏移量是一样的。
复制积压缓冲区是主服务器维护的一个固定长度的先进先出队列,固定长度的队列在添加一个元素时,如果长度超过了指定的长度,就会将最先添加的一个元素弹出,以保证长度不大于指定长度。当主服务器进行命令传播时,除了将写命令发送给所有从服务器,还会将写命令加入复制积压缓冲区。
这样如果从服务器断线重连,从服务器会将自己的复制偏移量offset
发送到主服务器,如果接下来的写命令,也就是复制偏移量为offset + 1
的写命令数据还存在于复制积压缓冲区中,那么只要将复制积压缓冲区中offset + 1
到最新的写命令数据发送给从服务器,就可以完成部分同步。如果offset + 1
已经不在复制积压缓冲区中了,那就只能再进行完全同步。
如果从服务器断线重连时只发送复制偏移量给主服务器,那么主服务器不能确定这个复制偏移量是复制自己的复制偏移量,还是复制其他主服务器的复制偏移量。所以需要服务器运行ID来判断。
服务器运行ID是在启动时自动生成的,在主从服务器第一次复制时,主服务器就会将运行ID发送给从服务器。当断线重连时,从服务器会将自己复制的主服务器运行ID和复制偏移量发送给主服务器,只有在从服务器发送来的服务器运行ID和自己一致,并且接下来的写命令复制偏移量存在于复制积压缓冲区时,才会进行部分同步,否则就要进行完全同步。
在命令传播阶段,从服务器每秒都要将自己的复制偏移量发送给主服务器,由下面三个作用
min-slaves-to-write 3
min-slaves-max-lag 10
上面配置的含义是:当从服务器数量少于3个,或者3个从服务器延迟大于等于10秒时,主服务器拒绝执行写命令
3. 检测命令丢失
如果从服务器发送过来的复制偏移量小于主服务器的复制偏移量,那么就有可能是写命令在网络传输中丢失了,这时主服务器就会从复制积压缓冲区中取出从服务器缺少的写命令,发送给从服务器。
标签:ast off 网络传输 自动 完全 连接 redis comm 情况下
原文地址:https://www.cnblogs.com/mywuhao/p/14314291.html