聊聊redis的主从复制吧

2021/6/19 2:26:51

本文主要是介绍聊聊redis的主从复制吧,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人。

文章不定期同步公众号,还有各种一线大厂面试原题、我的学习系列笔记。

  • 聊聊基础概念

主从复制与主从替换

主从复制不同于主从替换,主从复制是正常情况下主节点同步数据到从节点;主从替换是主节点挂了之后,把从节点替换为主节点

从节点配置主节点的信息

(1)临时配置:进入从节点的redis-cli执行【slaveof host port】,hosts是主节点的ip,port是主节点的端口号,结果总是返回ok

(2)永久配置:进入redis.conf,添加【slaveof host port】到文件中

runid和offset

runid:每个redis在启动或重启时都会生成一个唯一的runid;

offset:主从节点都有自己的主从复制偏移量,主节点复制数据到从节点时,从节点的偏移量的offset=原始offset+数据命令长度,同时从节点会把'从offset'发给主节点,所有主节点会同时保存'主offset'和'从offset',主节点可以通过判断'主offset'是否等于'从offset'来判断主从是否一致

backlog:是一个复制积压缓冲区,最大1M,主节点复制'命令数据'到从节点的时候,同时会把'命令数据'保存一份备份到backlog,在'命令数据'因网络问题丢失后,主节点仍可以从backlog中复制备份的数据到从节点

  • 主从复制的过程

全量复制:

(1) 一开始从节点执行slaveof命令,查找网络上的主节点,找到后发送ping给主节点,主节点返回pong,这样双方就建立了连接关系,建立了连接关系后就可以进行数据的复制了

(2) 从节点发送【psync ? -1】给主节点,'?'是因为从节点第一次不知道主节点的runid所以用?代替,-1表示从节点自己的偏移量(首次主从复制固定为-1)

(3) 主节点收到-1后知道这是第一次主从复制,返回【funllresync 主runid 主offset】给从节点,从节点收到后保存在自己的信息中

(4) 主节点发完fullresync命令后马上执行bgsave命令生成rdb文件,然后把rdb文件传送给从节点,同时这些'命令数据'备份一份到backlog缓冲区中;从节点收到rbd文件后将其保存到自己的数据库中

增量复制:

上面的(4)中,主节点在复制rdb文件给从节点时,若由于网络等问题导致全量复制过程中断时,可以采用增量复制来弥补,因为从节点从主节点处复制了一部分数据后有自己的offset,当网络恢复后,从节点发送【psync 主runid 从offset】给主节点,主节点收到后先判断该'runid'是否是自身,若是则再去backlog中判断'从offset'偏移量之后的'命令数据是否存在,存在则先发送【continue 主runid 主offset】给从节点,发完continue命令后,主节点再将'从offset'偏移量之后的'命令数据'真正地发给从节点,至此主从复制恢复正常。

OK,如果文章哪里有错误或不足,欢迎各位留言。
创作不易,各位的「三连」是二少创作的最大动力!我们下期见!



这篇关于聊聊redis的主从复制吧的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程