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