redis學習筆記(九): replication
replication的代碼還沒完全看完,先記錄看到的一些東西:
1、master/slave之間的同步有兩種方式,一種full sync,一種partial sync
2、full sync也有兩種實現方式:
1). socket target,就是將rdb的內容通過socket回復給執行sync命令的slave
2). disk target,就是master這端先在後臺執行bgsave的過程生成rdb file,執行完成之後,再將rdb file的內容回復給slave
從上面兩種方式的實現可以看出一點區別:
比如,master收到一條sync命令,如果master正在執行socket target的bgsave工作,那麽這個新的sync命令必須等到當前socket target的bgsave做完,才能開始新一輪的bgsave工作。
但是,如果master正在執行的是disk target的bgsave工作,那麽這個新的sync命令有可能(還有一個capability的因素在裏面)可以直接利用這一輪bgsave得到的rdb file返回給slave。
3、partial sync的實現方式大致是這樣:當server第一次收到sync/psync命令時,server會新分配一個repl_backlog的buf(這塊buf的大小可以配置),一個隨機的串做為replid。
第一個psync的命令是當做full sync來做的。後面在一些特定的時候會往這個buf裏面寫入內容(可能是一些完整的命令)。client執行psync的時候會帶上相應的偏移,server就把repl_buf
中指定偏移開始的所有內容回復給client
4、對於full sync,不管是disk target還是socket target,在執行完bgsave之後,都會調用updateSlavesWaitingBgsave去查看是否需要開啟新的bgsave流程
幾個問題:
1、多個客戶端同時執行sync的話,server上的執行流程是怎麽樣的?
2、MULTI裏面能執行sync命令嗎?
redis學習筆記(九): replication