🍅 作者简介:王哥,CSDN2022博客总榜Top100🏆、博客专家💪
🍅 技术交流:定期更新Java硬核干货,不定期送书活动
🍅 王哥多年工作总结:Java学习路线总结, 点击 突击面试
🍅 数十万人的面试选择: 面试说人话系列《面试1v1》
我是 javapub,一名 Markdown
程序员从👨💻,八股文种子选手。
《面试1v1》 连载中…
我是 javapub,一名 Markdown
程序员从👨💻,八股文种子选手。
面试官: Redis主从架构是什么?它有什么用?
候选人: Redis 主从架构就是将一台 Redis 服务器设为主服务器,其他的 Redis 服务器设为从服务器。它的主要用途有:
- 高可用:当主服务器发生故障时,从服务器可以顶上继续提供服务,实现快速故障迁移。
- 负载均衡:主服务器处理写请求,从服务器处理读请求,分担服务器压力。
- 数据冗余:主服务器的数据可以在从服务器中备份,防止数据丢失。
面试官: Redis 主从复制的工作流程是怎样的?
候选人: Redis 主从复制的工作流程如下:
- 首次同步:从服务器连接主服务器,发送 sync 命令,主服务器执行 BGSAVE 生成 RDB 文件并发送给从服务器,从服务器载入 RDB 文件并获得数据集。同时主服务器也发送从服务器连接后产生的写命令给从服务器,使其状态与主服务器一致。
- 命令传播:主服务器继续接收写命令,并将写命令同步给从服务器。主从服务器保持数据一致。
- 断线重连:如果从服务器因网络故障与主服务器断开,会自动尝试重连。重连后再次执行同步操作,得到主服务器最新的数据。
主要的工作流程是:同步阶段+命令传播阶段,这两个阶段互相循环,实现主从复制和数据一致性的效果。
面试官: 主从复制的同步工作是如何实现的?能给出源码分析吗?
候选人: 主从复制的同步工作是在 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;
}
}
}
同步工作的流程如下:
- 从服务器连接主服务器,发送 sync 命令。
- 主服务器接收到 sync 命令,执行 BGSAVE,同时开始缓冲从服务器断开期间产生的写命令。
- BGSAVE 完成,主服务器将 RDB 文件发送给从服务器,同时也发送缓冲的写命令。
- 从服务器得到 RDB 文件后载入,执行写命令,数据同步完成。
这整个同步过程可以保证从服务器快速获取主服务器的数据,也为后续的命令传播阶段奠定基础,主从复制得以顺利进行。
面试官: 主从复制的同步实现,你解释得很详细,我现在全明白了!Redis 的主从架构以及同步原理,你都理解得非常透彻。
最近我在更新《面试1v1》系列文章,主要以场景化的方式,讲解我们在面试中遇到的问题,致力于让每一位工程师拿到自己心仪的offer,感兴趣可以关注JavaPub追更!
《面试1v1》 连载中…
🎁目录合集:
Gitee:https://gitee.com/rodert/JavaPub
GitHub:https://github.com/Rodert/JavaPub
http://javapub.net.cn