
先看兩個(gè)概念: replication buffer 和 repl_backlog_buffer
repl_backlog_buffer:它是為了從庫(kù)斷開(kāi)之后,如何找到主從差異數(shù)據(jù)而設(shè)計(jì)的環(huán)形緩沖區(qū),從而避免全量復(fù)制帶來(lái)的性能開(kāi)銷。如果從庫(kù)斷開(kāi)時(shí)間太久,repl_backlog_buffer環(huán)形緩沖區(qū)被主庫(kù)的寫(xiě)命令覆蓋了,那么從庫(kù)連上主庫(kù)后只能乖乖地進(jìn)行一次全量復(fù)制,所以repl_backlog_buffer配置盡量大一些,可以降低主從斷開(kāi)后全量復(fù)制的概率。而在repl_backlog_buffer中找主從差異的數(shù)據(jù)后,如何發(fā)給從庫(kù)呢?這就用到了replication buffer。
replication buffer:Redis和客戶端通信也好,和從庫(kù)通信也好,Redis都需要給分配一個(gè) 內(nèi)存buffer進(jìn)行數(shù)據(jù)交互,客戶端是一個(gè)client,從庫(kù)也是一個(gè)client,我們每個(gè)client連上Redis后,Redis都會(huì)分配一個(gè)client buffer,所有數(shù)據(jù)交互都是通過(guò)這個(gè)buffer進(jìn)行的:Redis先把數(shù)據(jù)寫(xiě)到這個(gè)buffer中,然后再把buffer中的數(shù)據(jù)發(fā)到client socket中再通過(guò)網(wǎng)絡(luò)發(fā)送出去,這樣就完成了數(shù)據(jù)交互。所以主從在增量同步時(shí),從庫(kù)作為一個(gè)client,也會(huì)分配一個(gè)buffer,只不過(guò)這個(gè)buffer專門(mén)用來(lái)傳播用戶的寫(xiě)命令到從庫(kù),保證主從數(shù)據(jù)一致,我們通常把它叫做replication buffer。