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