《面试1v1》Redis主从架构

共 2267字,需浏览 5分钟

 ·

2023-06-26 19:38

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。

《面试1v1》 连载中...

面试官:Redis主从架构是什么?它有什么用?

候选人: Redis 主从架构就是将一台 Redis 服务器设为主服务器,其他的 Redis 服务器设为从服务器。它的主要用途有:

  1. 高可用:当主服务器发生故障时,从服务器可以顶上继续提供服务,实现快速故障迁移。
  2. 负载均衡:主服务器处理写请求,从服务器处理读请求,分担服务器压力。
  3. 数据冗余:主服务器的数据可以在从服务器中备份,防止数据丢失。

面试官:Redis 主从复制的工作流程是怎样的?

候选人: Redis 主从复制的工作流程如下:

  1. 首次同步:从服务器连接主服务器,发送 sync 命令,主服务器执行 BGSAVE 生成 RDB 文件并发送给从服务器,从服务器载入 RDB 文件并获得数据集。同时主服务器也发送从服务器连接后产生的写命令给从服务器,使其状态与主服务器一致。
  2. 命令传播:主服务器继续接收写命令,并将写命令同步给从服务器。主从服务器保持数据一致。
  3. 断线重连:如果从服务器因网络故障与主服务器断开,会自动尝试重连。重连后再次执行同步操作,得到主服务器最新的数据。

主要的工作流程是:同步阶段+命令传播阶段,这两个阶段互相循环,实现主从复制和数据一致性的效果。

面试官:主从复制的同步工作是如何实现的?能给出源码分析吗?

候选人: 主从复制的同步工作是在 replicaofCommand() 方法中实现的:

      
      void replicaofCommand(client *c) {
    if (server.masterhost == NULL) { //如果是第一次同步
        server.master = createClient(NULL); //连接主机
        if (server.master == NULL) {
            addReplyError(c,"Can't connect to MASTER: Connection refused");
            return;
        }
        /* AUTH with the master if required. */
        if (server.masteruser && server.masterauth) {
            ...
        }
        /* Send SYNC and receive BGSAVE response. */
        server.replstate = REDIS_REPL_WAIT_BGSAVE_START; 
        serverLog(REDIS_NOTICE,"Waiting BGSAVE from master");
        if (syncWithMaster() != REDIS_OK) {  // 发送sync命令
            freeClient(server.master);        
            server.master = NULL;
        }
    } 
}

同步工作的流程如下:

  1. 从服务器连接主服务器,发送 sync 命令。
  2. 主服务器接收到 sync 命令,执行 BGSAVE,同时开始缓冲从服务器断开期间产生的写命令。
  3. BGSAVE 完成,主服务器将 RDB 文件发送给从服务器,同时也发送缓冲的写命令。
  4. 从服务器得到 RDB 文件后载入,执行写命令,数据同步完成。

这整个同步过程可以保证从服务器快速获取主服务器的数据,也为后续的命令传播阶段奠定基础,主从复制得以顺利进行。

面试官:主从复制的同步实现,你解释得很详细,我现在全明白了!Redis 的主从架构以及同步原理,你都理解得非常透彻。

9c4588aaac88d79c3cc52c3c96fc9ce3.webp

最近我在更新《面试1v1》系列文章,主要以场景化的方式,讲解我们在面试中遇到的问题,致力于让每一位工程师拿到自己心仪的offer,感兴趣可以关注公众号JavaPub追更!


《面试1v1》 连载中...

浏览 31
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报