)
四、主從復(fù)制單機(jī) Redis 存在單點(diǎn)風(fēng)險機(jī)器宕機(jī)服務(wù)即中斷數(shù)據(jù)也可能丟失。主從復(fù)制通過建立多個相同數(shù)據(jù)的副本為讀寫分離與故障轉(zhuǎn)移提供基礎(chǔ)。4.1 配置在從節(jié)點(diǎn)執(zhí)行 slaveof 命令即可建立復(fù)制關(guān)系新版可使用 replicaof本機(jī)示例把 6380 端口實(shí)例設(shè)為 6379 的從節(jié)點(diǎn)# 從節(jié)點(diǎn) 6380 執(zhí)行 127.0.0.1:6380 slaveof 127.0.0.1 6379 OK 127.0.0.1:6380 info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:up建立復(fù)制的完整過程大致分為六個步驟從保存主節(jié)點(diǎn)信息到命令持續(xù)復(fù)制保存主節(jié)點(diǎn)信息從節(jié)點(diǎn)只記錄主節(jié)點(diǎn)地址此時復(fù)制流程尚未開始master_link_status 為 down主從建立連接從節(jié)點(diǎn)內(nèi)部定時任務(wù)發(fā)現(xiàn)新主節(jié)點(diǎn)后建立基于 TCP 的網(wǎng)絡(luò)連接失敗會持續(xù)重試發(fā)送 ping確認(rèn)主節(jié)點(diǎn)應(yīng)用層工作正?;貜?fù)超時則斷開重連權(quán)限驗(yàn)證主節(jié)點(diǎn)要求認(rèn)證時從節(jié)點(diǎn)發(fā)送密碼同步數(shù)據(jù)集進(jìn)入數(shù)據(jù)同步階段命令持續(xù)復(fù)制同步完成后主節(jié)點(diǎn)把后續(xù)寫命令持續(xù)發(fā)給從節(jié)點(diǎn)4.2 拓?fù)浣Y(jié)構(gòu)復(fù)制拓?fù)渲С謫螌踊蚨鄬雨P(guān)系常見的三種結(jié)構(gòu)各有適用場景一主一從最簡單的拓?fù)渲鞴?jié)點(diǎn)宕機(jī)時從節(jié)點(diǎn)提供故障轉(zhuǎn)移支持。寫并發(fā)高且需要持久化時可以只在從節(jié)點(diǎn)開啟 AOF避免持久化干擾主節(jié)點(diǎn)性能一主多從應(yīng)用端利用多個從節(jié)點(diǎn)實(shí)現(xiàn)讀寫分離讀比重大的場景可以把讀命令均衡到不同從節(jié)點(diǎn)耗時讀命令可以指定專門的從節(jié)點(diǎn)執(zhí)行樹形主從結(jié)構(gòu)從節(jié)點(diǎn)既能復(fù)制數(shù)據(jù)也能作為下層從節(jié)點(diǎn)的主節(jié)點(diǎn)繼續(xù)向下復(fù)制4.3 原理1復(fù)制偏移量與數(shù)據(jù)集標(biāo)識主從節(jié)點(diǎn)各自維護(hù)復(fù)制偏移量主節(jié)點(diǎn)發(fā)送命令后累加自身偏移量從節(jié)點(diǎn)接收執(zhí)行后累加自身偏移量。對比兩個偏移量可以判斷數(shù)據(jù)是否一致replid 與 offset 共同標(biāo)識一個數(shù)據(jù)集兩個節(jié)點(diǎn)的 replid 和 offset 都相同說明持有的數(shù)據(jù)一致。偏移量可以類比“學(xué)習(xí)進(jìn)度”——主節(jié)點(diǎn)準(zhǔn)備了多少內(nèi)容、從節(jié)點(diǎn)學(xué)到哪里一目了然。2psync 與同步流程Redis 使用 psync 命令完成數(shù)據(jù)同步分為全量復(fù)制與部分復(fù)制兩類。psync 攜帶 replid 與 offset 參數(shù)從節(jié)點(diǎn)的響應(yīng)分支有幾種情況回復(fù) FULLRESYNC replid offset進(jìn)入全量復(fù)制流程回復(fù) CONTINUE進(jìn)入部分復(fù)制流程回復(fù) -ERR主節(jié)點(diǎn)版本過低不支持 psync可回退使用 syncpsync 由 Redis 在主從模式下自動調(diào)用一般不需要手動執(zhí)行與舊版 sync 相比sync 會阻塞服務(wù)器處理其他請求psync 則不會。3全量復(fù)制全量復(fù)制是主從第一次建立復(fù)制時的必經(jīng)階段代價也最高主節(jié)點(diǎn) bgsave 生成快照、RDB 文件網(wǎng)絡(luò)傳輸、從節(jié)點(diǎn)清空舊數(shù)據(jù)并加載 RDB期間耗時隨數(shù)據(jù)集增大而拉長。2.8.18 版本起支持無磁盤復(fù)制主節(jié)點(diǎn)不落盤直接把生成的 RDB 數(shù)據(jù)通過網(wǎng)絡(luò)發(fā)送給從節(jié)點(diǎn)省去一輪磁盤讀寫。4部分復(fù)制部分復(fù)制針對網(wǎng)絡(luò)閃斷或命令丟失的場景。從節(jié)點(diǎn)斷線重連后攜帶之前的 replid 與 offset 請求補(bǔ)發(fā)主節(jié)點(diǎn)依據(jù) offset 在復(fù)制積壓緩沖區(qū)中查找數(shù)據(jù)緩沖區(qū)是先進(jìn)先出的定長隊(duì)列能保存最近已復(fù)制的數(shù)據(jù)5心跳機(jī)制主從之間的長連接靠應(yīng)用層心跳維護(hù)區(qū)別于 TCP 自帶心跳。主從節(jié)點(diǎn)彼此模擬對方的客戶端進(jìn)行通信主節(jié)點(diǎn)定期向從節(jié)點(diǎn)發(fā)送 ping從節(jié)點(diǎn)定期上報(bào)復(fù)制偏移量用于監(jiān)控連接狀態(tài)與數(shù)據(jù)一致性。