java_redis 主從復(fù)制
從以下幾個(gè)方面進(jìn)行記錄:
1.什么是主從復(fù)制;
2.為什么需要進(jìn)行主從復(fù)制;
3.主從復(fù)制的模式有哪些;
4.主從復(fù)制的工作原理;
\5. 相關(guān)名詞;
6.復(fù)制流程;
1.什么是主從復(fù)制============================================================
主從復(fù)制:是指有一臺(tái)redis 做為主節(jié)點(diǎn)(master)局装,配置其他redis 作為該主節(jié)點(diǎn) 的從節(jié)點(diǎn)(slave),主節(jié)點(diǎn)redis 可進(jìn)行讀寫(xiě)劳殖,寫(xiě)操作后將數(shù)據(jù)分發(fā)到從節(jié)點(diǎn)進(jìn)行數(shù)據(jù)同步,從節(jié)點(diǎn)redis 只負(fù)則讀拨脉,從節(jié)點(diǎn)的數(shù)據(jù)從主節(jié)點(diǎn)復(fù)制過(guò)來(lái)哆姻,數(shù)據(jù)的復(fù)制是單向的,只能由主節(jié)點(diǎn)流向從節(jié)點(diǎn),
2.為什么需要進(jìn)行主從復(fù)制=====================================================
背景: 在日常開(kāi)發(fā)中玫膀,經(jīng)常會(huì)用到redis,如果部署的是單節(jié)點(diǎn)redis ,當(dāng)該redis 服務(wù)掛了之后矛缨,大量的請(qǐng)求會(huì)直接打到數(shù)據(jù)庫(kù),造成數(shù)據(jù)庫(kù)壓力過(guò)大,cpu 飆升,嚴(yán)重可能會(huì)導(dǎo)致服務(wù)器掛掉箕昭,這就是一般說(shuō)的單節(jié)點(diǎn)故障灵妨,為了解決這一問(wèn)題,主從復(fù)制模式出現(xiàn)了落竹,主從復(fù)制模式有以下特點(diǎn):
\1. 數(shù)據(jù)冗余泌霍;2.單點(diǎn)故障;3.讀寫(xiě)分離述召;4.負(fù)載均衡朱转;5.高可用
3.主從復(fù)制的模式有哪些=====================================================
復(fù)制的模式有:增量復(fù)制和全量復(fù)制;
全量復(fù)制一般發(fā)生在slave 節(jié)點(diǎn)初始化的時(shí)候积暖,slave 要將master 的數(shù)據(jù)全部復(fù)制一遍藤为;增量復(fù)制發(fā)生在主節(jié)點(diǎn)進(jìn)行寫(xiě)操作之后,主節(jié)點(diǎn)將更新的命令發(fā)生給從節(jié)點(diǎn)進(jìn)行數(shù)據(jù)同步
4.主從復(fù)制的工作原理=====================================================
\1. 當(dāng)從節(jié)點(diǎn)第一次鏈接主節(jié)點(diǎn)時(shí)夺刑,會(huì)發(fā)送一個(gè)psync 命令到主節(jié)點(diǎn)觸發(fā)全量復(fù)制缅疟,主節(jié)點(diǎn)接收到該命令后,會(huì)fork 一個(gè)后臺(tái)進(jìn)程遍愿,該進(jìn)程開(kāi)始生成一個(gè)rdb快照窿吩,同時(shí)將外來(lái)的寫(xiě)命令寫(xiě)入緩沖區(qū),rdb文件生成完之后主節(jié)點(diǎn)將其發(fā)生給從節(jié)點(diǎn)错览,從節(jié)點(diǎn)拿到rdb 先寫(xiě)入磁盤(pán)纫雁,再寫(xiě)入內(nèi)存,接著master 會(huì)將緩沖區(qū)的寫(xiě)命令同步到slave,slave 執(zhí)行寫(xiě)命令開(kāi)始同步數(shù)據(jù)倾哺,如果master 和slave 中間因?yàn)榫W(wǎng)絡(luò)原因斷開(kāi)轧邪,會(huì)自動(dòng)重連,master 會(huì)將復(fù)制缺少的數(shù)據(jù)給slave;
5.相關(guān)名詞==============================================================
runId -----主節(jié)點(diǎn)的運(yùn)行id
redis 在啟動(dòng)時(shí)會(huì)生成的隨機(jī)id,唯一標(biāo)識(shí)該節(jié)點(diǎn)羞海,40長(zhǎng)度的16進(jìn)制字符
offset -----復(fù)制偏移量
指命令的字節(jié)長(zhǎng)度忌愚,比如16000,通過(guò)對(duì)比主從節(jié)點(diǎn)的復(fù)制偏移量却邓,來(lái)判斷主從節(jié)點(diǎn)數(shù)據(jù)是否一致硕糊,增量復(fù)制的時(shí)候用到
replication buffer-----內(nèi)部隊(duì)列緩沖區(qū)
主從節(jié)點(diǎn)連接的緩沖區(qū),主從節(jié)點(diǎn)之間復(fù)制命令的傳輸經(jīng)過(guò)這個(gè)緩沖區(qū)腊徙,每個(gè)主從節(jié)點(diǎn)之間獨(dú)有的简十,當(dāng)主從節(jié)點(diǎn)連接斷開(kāi),這個(gè)緩沖區(qū)會(huì)被刪除
repl_backlog_buffer -----環(huán)形緩沖區(qū)
salve之間共享的緩沖區(qū)撬腾,開(kāi)始執(zhí)行命令之前螟蝙,會(huì)建立這個(gè)緩沖區(qū),這個(gè)緩沖區(qū)記錄了master 接收到的新的命令民傻,和master 的offset,slave 發(fā)送psync 到主節(jié)點(diǎn)之后胰默,主節(jié)點(diǎn)會(huì)發(fā)送新的寫(xiě)命令和offset 到slave,slave 通過(guò)對(duì)比offset 來(lái)判斷自己是否要執(zhí)行寫(xiě)命令進(jìn)行增量復(fù)制
\6. 復(fù)制流程============================================================
1.全量復(fù)制:
步驟:
1.從節(jié)點(diǎn)發(fā)送psync 到主節(jié)點(diǎn)场斑;
2.主節(jié)點(diǎn)接受到psync 命令,fork子進(jìn)程開(kāi)始執(zhí)行bgsave命令生成rdb快照牵署,并使用replication buffer 緩沖區(qū)記錄此后執(zhí)行的所有寫(xiě)命令漏隐;
3.主節(jié)點(diǎn)執(zhí)行完bgsave命令,向所有服務(wù)器發(fā)送rdb快照奴迅,在此期間青责,寫(xiě)命令仍然進(jìn)入replication buffer中;
4.從服務(wù)器收到快照半沽,丟棄舊數(shù)據(jù)爽柒,載入新數(shù)據(jù);
5.主節(jié)點(diǎn)發(fā)送完rdb 快照者填,接著發(fā)送緩沖區(qū)的寫(xiě)命令浩村;
6.從節(jié)點(diǎn)載入新數(shù)據(jù)完成后,接收寫(xiě)命令并執(zhí)行占哟;
增量復(fù)制流程:
1.從redis 2.8開(kāi)始心墅,因網(wǎng)絡(luò)原因主從連接斷開(kāi),再次連接時(shí)可從中斷處復(fù)制榨乎,而不是全量復(fù)制怎燥;
2.主從斷開(kāi)重連之后, 主節(jié)點(diǎn)會(huì)根據(jù)從節(jié)點(diǎn)發(fā)送的runId和offset 來(lái)判斷進(jìn)行全量還是增量復(fù)制蜜暑,判斷邏輯如下:
增量復(fù)制:
如果runId和主節(jié)點(diǎn)的 id相同铐姚,并且主從的offset差距沒(méi)有超過(guò)repl_backlog_buffer緩沖區(qū)的長(zhǎng)度,主節(jié)點(diǎn)就會(huì)復(fù)制offset 之間的repl_backlog_buffer的命令給slave肛捍。
全量復(fù)制:
如果runId 和主節(jié)點(diǎn)的 id 不同或者主從的 offset差距超過(guò)repl_backlog_buffer緩沖區(qū)的長(zhǎng)度隐绵,則進(jìn)行全量復(fù)制。