1部服,舊版本(redis2.8以前)復制實現
1)sync(同步) + command propagate(命令傳播)兩個操作铅搓。
2)當slave向master發(fā)送slaveof命令時,首先執(zhí)行sync同步操作陷寝。
sync執(zhí)行過程
從服務器向主發(fā)送sync命令
主服務器執(zhí)行bgsave命令生成rdb锅很,發(fā)送到從,后續(xù)命令記錄到緩沖區(qū)凤跑。
從服務器載入rdb爆安,主服務器發(fā)送緩沖區(qū)命令到從。
3)命令傳播
主服務器對從服務器執(zhí)行命令傳播
操作仔引,將自己執(zhí)行的命令扔仓,發(fā)送給從服務器執(zhí)行。
4)舊版本sync命令咖耘,對斷線重復制效率很低翘簇。斷線之后,會重新使用sync全量同步儿倒。
bgsave命令:耗費master大量的cpu版保、內存、磁盤I/O等
rdb傳輸:耗費網絡資源夫否,并且影響master的響應請求找筝。
2,新版本復制實現
1)使用psync命令替換sync慷吊。
psync分為:完整重同步(同sync)
和部分重同步(用于斷線后復制)
2)從服務器發(fā)送psync -> 主服務器返回+continue -> 主服務向從服務器發(fā)送斷線期間的寫命令袖裕。
3)部分重同步的實現
復制偏移量:replication offset,主溉瓶、從服務器分別維護offset急鳄。主服務器每次向從傳播n字節(jié)數據時谤民,偏移量+n;從服務器接收n字節(jié)數據疾宏,偏移量+n张足。(通過對比offset可以判斷主從同步狀態(tài))
復制積壓緩沖區(qū)(repl-backlog-size
):replication backlog,主服務器命令傳播時坎藐,寫命令發(fā)送給slave的同時为牍,寫入backlog中,并為每個字節(jié)標記offset岩馍。
斷線重同步:slave發(fā)送psync + 自身offset -> master對比offset和backlog -> backlog存在offset則發(fā)送+continue使用部分重同步碉咆。
runID:服務器啟動時生成run id,slave初次復制時蛀恩,master將自己的id發(fā)送給slave保存疫铜。
4)psync命令
slave發(fā)送:psync ? -1 master返回:+fullresync <runid> <offset>
slave發(fā)送:psync <runid> offset master返回:+continue執(zhí)行部分沖同步。
3双谆,slaveof命令的實現
1)client向從服務器執(zhí)行
slaveof 127.0.0.1 6379
壳咕,從服務器將master的ip和端口保存在redisServer結構的masterHost和masterport中,返回client OK顽馋,異步執(zhí)行復制工作谓厘。
2)從服務器創(chuàng)建連向主服務器的socket,主服務器accept后寸谜,將從服務器作為master的一個client對待庞呕。
3)從服務器發(fā)送ping命令
到主服務器,主服務器返回pong程帕。
4)根據從服務器的masterauth
選項和主服務器的requirepass
選項進行身份驗證住练。
5)從服務器發(fā)送replconf listening-port 12345,向master發(fā)送端口信息愁拭。master記錄在redisClient的slave_listening_port字段中讲逛。
6)從服務器執(zhí)行psync
命令,主服務器進行命令傳播岭埠。
7)從服務器發(fā)送心跳檢測(1s一次)replconf ack <replicaton_offfset>盏混,用于檢測主從網絡連接、輔助實現min-slaves惜论、檢測命令丟失许赃。
4,雜項
1)slaveof host port
丟棄舊數據集馆类,向新的服務器進行同步
slaveof no one關閉復制功能混聊, 不會丟棄舊數據
2)slave不會過期key,只會等待master過期key乾巧。模擬一條del命令發(fā)送給slave句喜。