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