redis沒有像mysql那樣復制位置的概念,所以slave和master斷開連接再重新連接時,會全量取master的快照,slave的所有數據都會清除,重新建立整個內存表,這樣導致salve恢復數據特別慢,同時也給master帶來的壓力。
redis的主從復制策略是通過其持久化的rdb文件來實現的,其過程是先dump出rdb文件,將rdb文件全量傳輸給slave,然后再將dump后的操作實時同步到slave中。讓從服務器(slave server)成為主服務器(master server)的精確復制品。官方文檔ReplicationHowto中提到以下特點:(推薦學習:Redis視頻教程)
一個master支持多個slave,slave可以接受其他slave的連接,作為其他slave的master,從而形成一個master-slave的多級結構復制功能不會阻塞主服務器: 即使有一個或多個從服務器正在進行初次同步, 主服務器也可以繼續處理命令請求。復制功能不會阻塞從服務器: 只要在?redis.conf?文件中進行了相應的設置, 即使從服務器正在進行初次同步, 服務器也可以使用舊版本的數據集來處理命令查詢。不過, 在從服務器刪除舊版本數據集并載入新版本數據集的那段時間內, 連接請求會被阻塞。復制被利用來提供可擴展性,比如可以將slave端用作數據冗余,也可以將耗時的命令(比如sort)發往某些slave從而避免master的阻塞,另外也可以用slave做持久化,由從服務器去執行持久化操作,這只需要將master的配置文件中的save指令注釋掉。
Redis 使用異步復制。
Redis的主從復制分為兩個階段:
1)同步操作:將從服務器的數據庫狀態更新至主服務器當前所處的數據庫狀態。
2)命令傳播:在主服務器的數據庫狀態被修改,導致主從服務器的數據庫狀態出現不一致時,讓主從服務器重新回到一致狀態。
同步
當客戶端向從服務器發送?SLAVEOF?命令, 要求從服務器復制主服務器時, 從服務器首先需要執行同步操作, 也即是, 將從服務器的數據庫狀態更新至主服務器當前所處的數據庫狀態。
從服務器對主服務器的同步操作需要通過向主服務器發送?SYNC?命令來完成, 以下是?SYNC?命令的執行步驟:
從服務器向主服務器發送?SYNC?命令。收到?SYNC?命令的主服務器執行?BGSAVE?命令, 在后臺生成一個 RDB 文件, 并使用一個緩沖區記錄從現在開始執行的所有寫命令。當主服務器的?BGSAVE?命令執行完畢時, 主服務器會將?BGSAVE?命令生成的 RDB 文件發送給從服務器, 從服務器接收并載入這個 RDB 文件, 將自己的數據庫狀態更新至主服務器執行?BGSAVE?命令時的數據庫狀態。主服務器將記錄在緩沖區里面的所有寫命令發送給從服務器, 從服務器執行這些寫命令, 將自己的數據庫狀態更新至主服務器數據庫當前所處的狀態。
更多Redis相關技術文章,請訪問Redis視頻教程欄目進行學習!