在分布式系統(tǒng)中為了解決單點問題哼转,通常會把數(shù)據(jù)復制多個副本部署到其他機器覆劈,滿足故障恢復和負載均衡等需求荔睹。
參與復制等Redis實例劃分為主節(jié)點(master)和從節(jié)點(slave)揖盘。默認情況下楷力,Redis都是主節(jié)點喊式。每個從節(jié)點只能有一個主節(jié)點,而主節(jié)點可以同時具有多個從節(jié)點萧朝。復制的數(shù)據(jù)流是單向的岔留,只能由主節(jié)點復制到從節(jié)點。
(切換主節(jié)點會清空之前所有的數(shù)據(jù)检柬,線上人工操作時小心slaveof在錯誤的節(jié)點上執(zhí)行或者指向錯誤的主節(jié)點)
主從復制過程:
1)在從節(jié)點執(zhí)行slaveof命令后献联,保存主節(jié)點的地址信息(ip和port)就直接返回;
2)從節(jié)點(slave)內(nèi)部通過每秒運行的定時任務(wù)維護復制相關(guān)邏輯何址,當定時任務(wù)發(fā)現(xiàn)存在新的主節(jié)點后里逆,會嘗試與該節(jié)點建立網(wǎng)絡(luò)連接;
從節(jié)點會建立一個socket套接字用爪,專門用于接受主節(jié)點發(fā)送的復制命令原押。
如果從節(jié)點無法建立連接,定時任務(wù)會無限重試直到連接成功或者執(zhí)行slaveof no one取消復制偎血。
3)發(fā)送ping命令诸衔;
連接建立成功后從節(jié)點發(fā)送ping請求進行首次通信,ping請求的主要目的:(1)檢測主從之間網(wǎng)絡(luò)套接字是否可用颇玷;(2)檢測主節(jié)點當前是否可接受處理命令笨农。
如果發(fā)送ping命令后,從節(jié)點沒有收到主節(jié)點的pong回復或者超時帖渠,比如網(wǎng)絡(luò)延時或者主節(jié)點正在阻塞無法響應(yīng)命令谒亦,從節(jié)點會斷開復制連接,下次定時任務(wù)會發(fā)起重連阿弃。
4)權(quán)限驗證诊霹;
如果主節(jié)點設(shè)置了requirepass參數(shù),則需要密碼驗證渣淳,從節(jié)點必須配置masterauth參數(shù)保證與主節(jié)點相同的密碼才能通過驗證脾还。如果驗證失敗復制將終止,從節(jié)點重新發(fā)起復制流程入愧。
5)同步數(shù)據(jù)集鄙漏;
主從復制連接正常通信后嗤谚,對于首次建立復制的場景,主節(jié)點會把持有的數(shù)據(jù)全部發(fā)送給從節(jié)點怔蚌,這部分操作是耗時最久的步驟巩步。
6)命令持續(xù)復制。
當主節(jié)點把當前的數(shù)據(jù)同步給從節(jié)點后桦踊,便完成了復制的建立流程椅野。接下來主節(jié)點會持續(xù)地 把寫命令發(fā)送給從節(jié)點,保證主從數(shù)據(jù)一致性籍胯。
主從節(jié)點之間維護心跳和偏移量檢查機制竟闪,保證主從節(jié)點通信正常和數(shù)據(jù)一致。
Redis為了保證高性能杖狼,復制過程是異步的炼蛤,寫命令處理完后直接返回給客戶端,不等待從節(jié)點復制完成蝶涩。因此從節(jié)點數(shù)據(jù)集會有延遲情況理朋。
當使用從節(jié)點用于讀寫分離時會存在數(shù)據(jù)延遲、過期數(shù)據(jù)绿聘、從節(jié)點可用性等問題嗽上,需要根據(jù)自身業(yè)務(wù)提前做出規(guī)避。
在運維過程中斜友,主節(jié)點存在多個從節(jié)點或一臺機器上部署大量主節(jié)點等情況下炸裆,會有復制風暴的風險。