復(fù)制
- 建立復(fù)制: 默認(rèn)redis 都是主節(jié)點(diǎn)。每個(gè)從節(jié)點(diǎn)只能復(fù)制到從節(jié)點(diǎn),而每個(gè)主節(jié)點(diǎn)可以同時(shí)具有多個(gè)從節(jié)點(diǎn)凸舵。復(fù)制的數(shù)據(jù)是單向的,只能有主節(jié)點(diǎn)到從節(jié)點(diǎn)锣披。配置復(fù)制:
- 配置文件中加入 slaveof {masterHost}{masterPort},重啟redis
- 啟動redis命令后加入 --slaveof {masterHost}{masterPort}
- redis直接使用命令 slaveof {masterHost}{masterPort}
- 斷開復(fù)制: 從節(jié)點(diǎn)執(zhí)行slaveof no one 來斷開與主節(jié)點(diǎn)的復(fù)制關(guān)系
- 斷開復(fù)制流程:
1) 斷開與主節(jié)點(diǎn)復(fù)制關(guān)系
2) 從節(jié)點(diǎn)晉升為主節(jié)點(diǎn) - 切主操作流程:
1) 斷開與舊主節(jié)點(diǎn)復(fù)制關(guān)系
2) 與新主節(jié)點(diǎn)建立復(fù)制關(guān)系
3) 刪除從節(jié)點(diǎn)當(dāng)前所有數(shù)據(jù)
4) 對新主節(jié)點(diǎn)進(jìn)行復(fù)制操作 - 只讀:從節(jié)點(diǎn)使用 slave-read-only=yes 配置為只讀模式贞间。
- 傳輸延遲 參數(shù) repl-disable-tcp-nodelay 控制是否關(guān)閉TCP_NODELAY, 默認(rèn)no 及開 tcp-nodelay 功能,主節(jié)點(diǎn)會合并較小的TCP數(shù)據(jù)包從而節(jié)省帶寬雹仿。默認(rèn)發(fā)送實(shí)際取決于Liunx的內(nèi)核增热,這種配置會增大主從之間的延遲。當(dāng)關(guān)閉時(shí)胧辽,主節(jié)點(diǎn)產(chǎn)生的命令數(shù)據(jù)都會及時(shí)的發(fā)送給從節(jié)點(diǎn)峻仇,這樣主從延遲會變小,但增加網(wǎng)絡(luò)帶寬消耗
- 拓?fù)洌?br>
1. 一主一從結(jié)構(gòu)
2. 一主多從結(jié)構(gòu)
3. 樹形主從結(jié)構(gòu) - 復(fù)制過程:
1. 保存主節(jié)點(diǎn)信息
2. 從節(jié)點(diǎn)內(nèi)部通過每秒運(yùn)行的定時(shí)任務(wù)維護(hù)復(fù)制相關(guān)邏輯邑商,當(dāng)定時(shí)任務(wù)發(fā)現(xiàn)存在新的主節(jié)點(diǎn)后摄咆,會嘗試與該節(jié)點(diǎn)建立網(wǎng)絡(luò)連接,如果無法建立連接人断,定時(shí)任務(wù)會無限重試直到連接或者執(zhí)行slaveof no one取消復(fù)制
3. 發(fā)送ping命令: ping命令沒有響應(yīng)會斷開連接等待下次定時(shí)任務(wù)發(fā)起重連
4. 權(quán)限驗(yàn)證:主節(jié)點(diǎn)通過設(shè)置requirepass 參數(shù)進(jìn)行密碼驗(yàn)證吭从,從節(jié)點(diǎn)的復(fù)制連接通過一個(gè)特殊標(biāo)識的客戶端來完成,因此需要配置從節(jié)點(diǎn)的masterauth 參數(shù)與主節(jié)點(diǎn)密碼保持一致
5. 同步數(shù)據(jù)集:主節(jié)點(diǎn)會把持有的數(shù)據(jù)全部發(fā)送給從節(jié)點(diǎn)
6. 命令持續(xù)復(fù)制:主節(jié)點(diǎn)會持續(xù)地把命令發(fā)送個(gè)從節(jié)點(diǎn)恶迈,保證主從數(shù)據(jù)一致 - 數(shù)據(jù)同步
- 復(fù)制偏移量:參與復(fù)制的主節(jié)點(diǎn)會維護(hù)自身復(fù)制偏移量涩金。主節(jié)點(diǎn)處理完寫入命令后,會把命令的字節(jié)長度做累加記錄,統(tǒng)計(jì)信息在 info replication 中的 master_repl_offset中步做,從節(jié)點(diǎn)每秒鐘會上報(bào)自身復(fù)制偏移量副渴,主節(jié)點(diǎn)會報(bào)存從節(jié)點(diǎn)偏移量。從節(jié)點(diǎn)接受到命令后也會累加自身偏移量全度。
- 復(fù)制積壓緩存區(qū):當(dāng)主節(jié)點(diǎn)發(fā)送命令給從節(jié)點(diǎn)時(shí)煮剧,還會寫入復(fù)制積壓緩沖區(qū),緩沖區(qū)先進(jìn)先出将鸵,能保存最近已復(fù)制數(shù)據(jù)勉盅,用于部分復(fù)制命令丟失補(bǔ)救
- 主節(jié)點(diǎn)運(yùn)行ID:每個(gè)redis節(jié)點(diǎn)啟動都會有一個(gè)動態(tài)分配的40位十六進(jìn)制字符串作為運(yùn)行ID,用來唯一標(biāo)示redis 節(jié)點(diǎn)顶掉。當(dāng)運(yùn)行ID變化后從節(jié)點(diǎn)將做全量復(fù)制菇篡。
- psync 命令:從節(jié)點(diǎn)使用psync 命令完成部分復(fù)制和全量復(fù)制功能
- 心跳:
- 主節(jié)點(diǎn)默認(rèn)每隔10s對從節(jié)點(diǎn)發(fā)送ping命令,判讀從節(jié)點(diǎn)的存活性和連接狀態(tài)一喘。
- 從節(jié)點(diǎn)在主線程中每隔1秒給主節(jié)點(diǎn)上報(bào)自身復(fù)制偏移量
- 異步復(fù)制:主節(jié)點(diǎn)自身處理完寫命令直接返回給客戶端驱还,并不等待從節(jié)點(diǎn)復(fù)制完成。主從復(fù)制過程是異步的凸克,會造成主從延遲议蟆,正常情況下延遲在1s左右
- 讀寫分離遇到問題:
- 數(shù)據(jù)延遲 監(jiān)控偏移量,及時(shí)下線延遲大的節(jié)點(diǎn)
- 讀到過期數(shù)據(jù) 當(dāng)采樣速度跟不上過期速度萎战,redis 3.2 后解決了這個(gè)問題:從節(jié)點(diǎn)讀取數(shù)據(jù)后會檢查鍵的過期時(shí)間來決定是否返回咐容。
- 從節(jié)點(diǎn)故障 監(jiān)控延遲,及時(shí)下線
- 惰性刪除 主節(jié)點(diǎn)每次處理讀取命令是檢查鍵是否超時(shí)蚂维,如果超時(shí)則執(zhí)行del命令刪除對象戳粒,之后同步給從庫。
- 定時(shí)刪除 redis 主節(jié)點(diǎn)內(nèi)部定時(shí)任務(wù)會循環(huán)采樣一定數(shù)量的鍵虫啥,當(dāng)發(fā)現(xiàn)采樣的鍵過期時(shí)蔚约,執(zhí)行del命令,之后同步給從庫涂籽。
- 復(fù)制風(fēng)暴 :大量從節(jié)點(diǎn)對同一主節(jié)點(diǎn)或同一臺機(jī)器的多個(gè)主節(jié)點(diǎn)短時(shí)間內(nèi)發(fā)起全量復(fù)制苹祟,規(guī)避方式對應(yīng)單節(jié)點(diǎn)復(fù)制風(fēng)暴采用樹狀復(fù)制結(jié)構(gòu),對應(yīng)單機(jī)器復(fù)制風(fēng)暴评雌,部署時(shí)打散主節(jié)點(diǎn)到多臺機(jī)器上树枫,主節(jié)點(diǎn)所在機(jī)器故障后提供故障轉(zhuǎn)移機(jī)制。