主從同步流程(全量)
- slave與master建立socket連接;
- slave向master發(fā)送PSYNC命令請求復制數(shù)據(jù)(無論slave是否為第一次連接)硬耍;
- master收到PSYNC命令后缩焦,會在后臺進行數(shù)據(jù)持久化丸凭;
- 通過bgsave生成最新的rdb快照文件
- bgsave期間酥郭,將客戶端發(fā)送的命令(會修改數(shù)據(jù)集的)緩存到內存中;
- 持久化完畢后撮躁,master將這份RDB數(shù)據(jù)發(fā)送給slave;
- slave會把接收到的數(shù)據(jù)進行持久化生成RDB买雾,然后再加載到內存中把曼。
- master繼續(xù)將之前緩存在內存中的命令發(fā)送給slave杨帽。
需要注意的是,master與slave之間的連接由于某些原因斷開后嗤军,slave能夠自動重連master注盈,master收到了多個slave并發(fā)連接請求,他只會進行一次持久化叙赚,而不是一個連接一次当凡,然后再把這一份持久化的數(shù)據(jù)發(fā)送給多個并發(fā)連接的slave。
主從復制(全量復制)流程圖如下:

數(shù)據(jù)部分復制(斷點續(xù)傳)
當master與slave斷開連接重連后纠俭,在redis2.8版本以前沿量,會重新進行全量復制,在2.8版本開始冤荆,redis改用可以只吃部分數(shù)據(jù)復制的命令PSYNC去master同步數(shù)據(jù)朴则,slave與master能夠在網(wǎng)絡連接斷開后只進行部分數(shù)據(jù)復制(斷點續(xù)傳)。
master會在其內存中創(chuàng)建一個復制數(shù)據(jù)用的緩存隊列钓简,緩存最近一段時間的數(shù)據(jù)乌妒,master和它所有的slave都維護了復制和數(shù)據(jù)下標offset和master的進程id,因此當網(wǎng)絡連接斷開后外邓,slave會請求master繼續(xù)進行未完成的復制撤蚊,從所記錄的數(shù)據(jù)下標開始。如果master進程節(jié)點id變化损话,或者從節(jié)點數(shù)據(jù)下表offset太久侦啸,已經(jīng)不再master的緩存隊列里,則會進行一次全量數(shù)據(jù)復制丧枪。
主從復制(部分復制光涂、斷點續(xù)傳)流程圖:

如果有很多從節(jié)點,為了緩解主從復制風暴(多個從節(jié)點同事復制主節(jié)點導致主節(jié)點壓力過大)拧烦,可以做如下架構忘闻,讓部分從節(jié)點與從節(jié)點同步數(shù)據(jù)。
