• Redis 主从复制的核心原理


    介绍:

    通过 执⾏slaveof命令或设置slaveof选项 让⼀个服务器去复制另⼀个服务器的数据。主数据库可以进⾏读写操作,当写操作导致数据变化时会⾃动将数据同步给从数据库。⽽从数据库⼀般是只读的,并接受主数据库同步过来的数据。⼀个主数据库可以拥有多个从数据库,⽽⼀个从数据库只能拥有⼀个主数据库。

    全量复制:

    1. 主节点 通过bgsave命令fork⼦进程进⾏RDB持久化 ,该过程是⾮常消耗CPU内存(⻚表复制)、硬盘IO
    2. 节点清空⽼数据、载⼊新RDB⽂件的过程是阻塞的⽆法响应客户端的命令;如果从节点执⾏bgrewriteaof,也会带来额外的消耗
    3. 主节点通过⽹络将RDB⽂件发送给从节点,对主从节点的带宽都会带来很⼤的消耗

    部分复制:  

    1. 复制偏移量执⾏复制的双⽅,主从节点,分别会维护⼀个复制偏移量offset
    2. 复制积压缓冲区:主节点内部维护了⼀个固定⻓度的、先进先出(FIFO)队列 作为复制积压缓冲区,当主从节点offset的差距过⼤超过缓冲区⻓度时,将⽆法执⾏部分复制,只能执⾏全量复制。
    3. 服务器运⾏ID(runid):每个Redis节点,都有其运⾏ID,运⾏ID由节点在启动时⾃动⽣成,主节点会将⾃⼰的运⾏ID发送给从节点,从节点会将主节点的运⾏ID存起来。 从节点Redis断开重连的时候,就是根据运⾏ID来判断同步的进度:
      • 如果从节点保存的runid与主节点现在的runid相同,说明主从节点之前同步过,主节点会继续 尝试使⽤部分复制(到底能不能部分复制还要看offset和复制积压缓冲区的情况);
      • 如果从节点保存的runid与主节点现在的runid不同,说明从节点在断线前同步的Redis节点并不是当前的主节点,只能进⾏全量复制。

       

  • 相关阅读:
    UE4 通过重叠事件开启门
    云计算拼的是运维吗
    MySQL中将传参表名字符串转为sql语句执行
    机组运行约束对机组节点边际电价的影响研究(Matlab代码实现)
    五分钟搞懂python生成器迭代器
    通过 MSE 实现基于Apache APISIX的全链路灰度
    Flutter 绘制 3D 效果动画
    内核动态调试输出dev_info, dev_dbg
    零代码编程:用ChatGPT下载lexfridman的所有播客音频和文本
    vue keep-alive缓存组件
  • 原文地址:https://blog.csdn.net/m0_70734549/article/details/126561451