?? 作者簡介:王哥,CSDN2022博客總榜Top100??、博客專家??
?? 技術(shù)交流:定期更新Java硬核干貨,不定期送書活動
?? 王哥多年工作總結(jié):Java學(xué)習(xí)路線總結(jié), 點擊 突擊面試
?? 數(shù)十萬人的面試選擇: 面試說人話系列《面試1v1》
我是 javapub,一名 Markdown
程序員從?????,八股文種子選手。
《面試1v1》 連載中…
我是 javapub,一名 Markdown
程序員從?????,八股文種子選手。
面試官: Redis主從架構(gòu)是什么?它有什么用?
候選人: Redis 主從架構(gòu)就是將一臺 Redis 服務(wù)器設(shè)為主服務(wù)器,其他的 Redis 服務(wù)器設(shè)為從服務(wù)器。它的主要用途有:
- 高可用:當(dāng)主服務(wù)器發(fā)生故障時,從服務(wù)器可以頂上繼續(xù)提供服務(wù),實現(xiàn)快速故障遷移。
- 負(fù)載均衡:主服務(wù)器處理寫請求,從服務(wù)器處理讀請求,分擔(dān)服務(wù)器壓力。
- 數(shù)據(jù)冗余:主服務(wù)器的數(shù)據(jù)可以在從服務(wù)器中備份,防止數(shù)據(jù)丟失。
面試官: Redis 主從復(fù)制的工作流程是怎樣的?
候選人: Redis 主從復(fù)制的工作流程如下:
- 首次同步:從服務(wù)器連接主服務(wù)器,發(fā)送 sync 命令,主服務(wù)器執(zhí)行 BGSAVE 生成 RDB 文件并發(fā)送給從服務(wù)器,從服務(wù)器載入 RDB 文件并獲得數(shù)據(jù)集。同時主服務(wù)器也發(fā)送從服務(wù)器連接后產(chǎn)生的寫命令給從服務(wù)器,使其狀態(tài)與主服務(wù)器一致。
- 命令傳播:主服務(wù)器繼續(xù)接收寫命令,并將寫命令同步給從服務(wù)器。主從服務(wù)器保持?jǐn)?shù)據(jù)一致。
- 斷線重連:如果從服務(wù)器因網(wǎng)絡(luò)故障與主服務(wù)器斷開,會自動嘗試重連。重連后再次執(zhí)行同步操作,得到主服務(wù)器最新的數(shù)據(jù)。
主要的工作流程是:同步階段+命令傳播階段,這兩個階段互相循環(huán),實現(xiàn)主從復(fù)制和數(shù)據(jù)一致性的效果。
面試官: 主從復(fù)制的同步工作是如何實現(xiàn)的?能給出源碼分析嗎?
候選人: 主從復(fù)制的同步工作是在 replicaofCommand()
方法中實現(xiàn)的:
void replicaofCommand(client *c) {
if (server.masterhost == NULL) { //如果是第一次同步
server.master = createClient(NULL); //連接主機(jī)
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) { // 發(fā)送sync命令
freeClient(server.master);
server.master = NULL;
}
}
}
同步工作的流程如下:
- 從服務(wù)器連接主服務(wù)器,發(fā)送 sync 命令。
- 主服務(wù)器接收到 sync 命令,執(zhí)行 BGSAVE,同時開始緩沖從服務(wù)器斷開期間產(chǎn)生的寫命令。
- BGSAVE 完成,主服務(wù)器將 RDB 文件發(fā)送給從服務(wù)器,同時也發(fā)送緩沖的寫命令。
- 從服務(wù)器得到 RDB 文件后載入,執(zhí)行寫命令,數(shù)據(jù)同步完成。
這整個同步過程可以保證從服務(wù)器快速獲取主服務(wù)器的數(shù)據(jù),也為后續(xù)的命令傳播階段奠定基礎(chǔ),主從復(fù)制得以順利進(jìn)行。
面試官: 主從復(fù)制的同步實現(xiàn),你解釋得很詳細(xì),我現(xiàn)在全明白了!Redis 的主從架構(gòu)以及同步原理,你都理解得非常透徹。
最近我在更新《面試1v1》系列文章,主要以場景化的方式,講解我們在面試中遇到的問題,致力于讓每一位工程師拿到自己心儀的offer,感興趣可以關(guān)注JavaPub追更!
《面試1v1》 連載中…
??目錄合集:
Gitee:https://gitee.com/rodert/JavaPub
GitHub:https://github.com/Rodert/JavaPub
文章來源:http://www.zghlxwxcb.cn/news/detail-512555.html
http://javapub.net.cn文章來源地址http://www.zghlxwxcb.cn/news/detail-512555.html
到了這里,關(guān)于《面試1v1》Redis主從架構(gòu)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!