復(fù)制
slaveof master-ip master-port
SYNC
1灾锯、從服務(wù)器發(fā)送 SYNC命令同步數(shù)據(jù)庫數(shù)據(jù)
2种呐、主服務(wù)器收到SYNC命令后形入,執(zhí)行BGSAVE乞榨,生成RDB文件熔酷,再利用緩沖區(qū)記錄此后的命令
3孤紧、主服務(wù)器BGSAVE完成后,將RDB文件發(fā)送給從服務(wù)器拒秘,給其加載數(shù)據(jù)
4号显、主服務(wù)器將緩沖區(qū)里面的命令發(fā)送給從服務(wù)器執(zhí)行,兩者狀態(tài)一致躺酒。
SYNC命令是一個非常耗費(fèi)資源的命令押蚤,原來如果主從斷開連接,當(dāng)從服務(wù)器再次連接上主服務(wù)器時羹应,從服務(wù)器又會發(fā)送SYNC命令揽碘。
redis2.8 之后使用了PSYNC命令,初次主從同步操作跟上面一樣园匹。而斷線重連之后雳刺,依據(jù)以下數(shù)據(jù)同步數(shù)據(jù)庫。
-
主服務(wù)器的復(fù)制偏移量和從服務(wù)器的復(fù)制偏移量
? 主服務(wù)器每復(fù)制N個字節(jié)裸违,偏移量加上N煞烫,從服務(wù)器每接收N個字節(jié)偏移量加上N, 對比偏移量就可以知道主從同步是否一致累颂。不一致通過積壓緩沖區(qū)恢復(fù)主從服務(wù)器的不一致的數(shù)據(jù)
-
主服務(wù)器的復(fù)制積壓緩沖區(qū)
? 是一個默認(rèn)大小為1M的先進(jìn)先出隊列滞详。當(dāng)寫命令寫入主庫凛俱,積壓緩沖區(qū)就會寫入命令并且記錄偏移量,如果offset以后的數(shù)據(jù)存在復(fù)制后面的數(shù)據(jù)料饥,如果offset后面的數(shù)據(jù)不存在冰啃,那么完整復(fù)制工碾。
服務(wù)器的運(yùn)行ID
通過運(yùn)行ID來確認(rèn)斷線重連的從服務(wù)器是不是之前的從服務(wù)器没佑。
PSYNC <runid> <offset> runid:斷線前復(fù)制的主服務(wù)器ID offset:從服務(wù)器最后接收命令的偏移量抚恒。主服務(wù)器返回 +CONTINUE 執(zhí)行部分同步復(fù)制操作
復(fù)制的實現(xiàn)
? 1、設(shè)置主服務(wù)器的ip port:
? 2巡蘸、建立到主服務(wù)器的連接:
? 3奋隶、發(fā)送PING命令:主服務(wù)器返回PONG表示正常
? 4、身份驗證:
? 5悦荒、發(fā)送端口信息:主服務(wù)器 info REPLICATION 打印出從服務(wù)器的監(jiān)聽端口號信息
? 6唯欣、同步:PSYNC
? 7、命令傳播:接收主服務(wù)器的寫命令
心跳檢測
? 從服務(wù)器會以每秒一次的頻率發(fā)送REPLCONF ACK <replication_offset>給主服務(wù)器
? 1搬味、檢測主從的連接狀態(tài)
? 2境氢、輔助實現(xiàn)min-slaves選項
? 3、檢測命令丟失:如果從服務(wù)器發(fā)送的offset跟主服務(wù)器不一樣碰纬,主庫會同步數(shù)據(jù)