通過分析主從庫間次數(shù)據(jù)同步的過程,你可以看到,一次全量復(fù)制中,對于主庫來說,需要完成兩個(gè)耗時(shí)的操作:生成 RDB 文件和傳輸 RDB 文件。
如果從庫數(shù)量很多,而且都要和主庫進(jìn)行全量復(fù)制的話,就會(huì)導(dǎo)致主庫忙于 fork 子進(jìn)程生成 RDB 文件,進(jìn)行數(shù)據(jù)全量復(fù)制。fork 這個(gè)操作會(huì)阻塞主線程處理正常請求,從而導(dǎo)致主庫響應(yīng)應(yīng)用程序的請求速度變慢。此外,傳輸 RDB 文件也會(huì)占用主庫的網(wǎng)絡(luò)帶寬,同樣會(huì)給主庫的資源使用帶來壓力。那么,有沒有好的解決方法可以分擔(dān)主庫壓力呢?
其實(shí)是有的,這就是“主 - 從 - 從”模式。
在剛才介紹的主從庫模式中,所有的從庫都是和主庫連接,所有的全量復(fù)制也都是和主庫進(jìn)行的?,F(xiàn)在,我們可以通過“主 - 從 - 從”模式將主庫生成 RDB 和傳輸 RDB 的壓力,以級聯(lián)的方式分散到從庫上。
簡單來說,我們在部署主從集群的時(shí)候,可以手動(dòng)選擇一個(gè)從庫(比如選擇內(nèi)存資源配置較高的從庫),用于級聯(lián)其他的從庫。然后,我們可以再選擇一些從庫(例如三分之一的從庫),在這些從庫上執(zhí)行如下命令,讓它們和剛才所選的從庫,建立起主從關(guān)系。
這樣一來,這些從庫就會(huì)知道,在進(jìn)行同步時(shí),不用再和主庫進(jìn)行交互了,只要和級聯(lián)的從庫進(jìn)行寫操作同步就行了,這就可以減輕主庫上的壓力,如下圖所示:
級聯(lián)的“主-從-從”模式好了,到這里,我們了解了主從庫間通過全量復(fù)制實(shí)現(xiàn)數(shù)據(jù)同步的過程,以及通過“主 - 從 - 從”模式分擔(dān)主庫壓力的方式。那么,一旦主從庫完成了全量復(fù)制,它們之間就會(huì)一直維護(hù)一個(gè)網(wǎng)絡(luò)連接,主庫會(huì)通過這個(gè)連接將后續(xù)陸續(xù)收到的命令操作再同步給從庫,這個(gè)過程也稱為基于長連接的命令傳播,可以避免頻繁建立連接的開銷。