《面試1v1》Redis主從架構(gòu)
我是 javapub,一名 Markdown 程序員從?????,八股文種子選手。
《面試1v1》 連載中...
面試官:Redis主從架構(gòu)是什么?它有什么用?
候選人: Redis 主從架構(gòu)就是將一臺 Redis 服務(wù)器設(shè)為主服務(wù)器,其他的 Redis 服務(wù)器設(shè)為從服務(wù)器。它的主要用途有:
- 高可用:當(dāng)主服務(wù)器發(fā)生故障時,從服務(wù)器可以頂上繼續(xù)提供服務(wù),實(shí)現(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),實(shí)現(xiàn)主從復(fù)制和數(shù)據(jù)一致性的效果。
面試官:主從復(fù)制的同步工作是如何實(shí)現(xiàn)的?能給出源碼分析嗎?
候選人: 主從復(fù)制的同步工作是在 replicaofCommand() 方法中實(shí)現(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ù)制的同步實(shí)現(xiàn),你解釋得很詳細(xì),我現(xiàn)在全明白了!Redis 的主從架構(gòu)以及同步原理,你都理解得非常透徹。
最近我在更新《面試1v1》系列文章,主要以場景化的方式,講解我們在面試中遇到的問題,致力于讓每一位工程師拿到自己心儀的offer,感興趣可以關(guān)注公眾號JavaPub追更!
《面試1v1》 連載中...

