聊聊redis的主从复制吧

  • 聊聊基础概念

主从复制与主从替换

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

从节点存在的意义:备份主节点数据+负载均衡(对外提供可读操作)

从节点配置主节点的信息(两种方式)

1、临时配置:启动从节点的redis-cli执行命令【slaveof host port】,host是主节点的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,在主从同步完rdb文件后,主节点还需要同步缓存中的这些’命令数据’给到从节点(或者在’命令数据’因网络问题丢失后,主节点也可以从backlog中复制备份的数据重新同步到从节点)

主从复制的过程

  • 主从复制默认使用rdb文件的原因?

    (1)rdb文件是二进制文件比较小,所以主节点向磁盘写入rdb的I/O效率以及主节点传输rdb文件给从节点的效率都比aof文件高

    (2)rdb文件是二进制文件比较小,所以从节点写入rdb文件恢复数据的效率也比aof文件高

  • 全量复制的过程?

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

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

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

    (4) 主节点发完fullresync命令后马上执行bgsave命令生成rdb文件(rdb保存在磁盘中、由redis主线程分出一个子线程执行bgsave),然后把rdb文件传送给从节点

    (5) 主节点在执行bgsave命令和发送rdb文件给从节点的时候,还会被外界写入数据(简称’命令数据’),主节点会将这些’命令数据’保存一份到backlog缓冲区中,同步完rdb文件后就会继续同步缓冲区中的这些’命令数据’

    (6) 从节点收到rdb文件后会先清空本地内存数据再加载rdb文件数据到本节点,加载完后再执行主节点推过来的’命令数据’相应的命令('命令数据’其实就是一些写命令)

image

  • 增量复制的过程?
    • 什么时候才会需要增量复制:在主从同步的整个过程中,所有的命令都可能发生网络中断的情况,这时候就需要增量同步。
    • 过程:
      不管在什么时候主节点都会将’写命令’记录在一个叫 repl_backlog_buffer的缓冲区中,该缓冲区是一个环形数组【在执行bgsave的时候写命令也会写入全量复制中的backlog,故此时会同时将写命令记录在这两个缓冲区】
      –>

      主节点在repl_backlog_buffer上用偏移量’主offerset’记录写命令的偏移量(上面全量复制中的’主offerset’就是这个值,理论上应为repl_backlog_buffer中最新的数据位置)

      –>

      从节点也有自己主从同步过程中最新数据的位置偏移’从offerset’,理论上这两个偏移值是相同的,但是在网络中断时,可能’主offerset’>‘从offerset’

      –>

      此时进行增量复制:从节点先发送【psync 主runid 从offset】给主节点,主节点收到后先判断该’主runid’是否是自身,若是则再去"repl_backlog_buffer缓冲区"中判断’从offset’偏移量之后的’写命令’数据是否存在,存在则先发送【continue】命令给从节点,然后发送 ‘从offset’~‘主offset’ 之间的写命令数据同步给从节点

image

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值