這節介紹Redis的主從複製過程,包括創建和複製。redis
Redis支持主從模式以提供讀寫分離,能夠經過在從服務器的客戶端上執行以下命令以鏈接主服務器:數據庫
SLAVEOF IP PORT
或者在配置文件中配置SLAVEOF選項。服務器
SLAVEOF命令包括如下幾個步驟:性能
從服務設置主服務器的地址和端口,從服務器會保存客戶端上送的地址和端口。ui
從服務器同主服務器創建套接字鏈接。code
從服務器向主服務器發送PING命令,經過判斷響應是否爲PONG或者有沒超時,以檢查套接字鏈接是否正常和主服務器可否正常處理命令請求。blog
身份驗證。主服務器的requirepass選項和從服務器的masterauth選項用於身份驗證,必須同時設置或者同時去除,才能讓身份驗證經過(或者不進行身份證驗證)。隊列
發送端口信息。文檔
從服務器經過字符串
REPLCONF listening-port 從服務器端口
命令向主服務器發送本身的監聽端口號。主服務器收到命令後會將信息進行存儲,用於後續INFO replication命令的輸出。
執行同步。
從服務器向主服務器發送同步命令,複製主服務器上的數據使之保持一致。
命令傳播。
同步完成後,主服務器會一直將本身執行的寫命令發送給從服務器以保持同步。在這個過程,從節點會以每秒一次的頻率,向主節點發起心跳檢測,以保證鏈接的正常。
Redis的複製分爲同步和命令傳播兩個操做:
同步操做使用SYNC或者PSYNC命令將從服務器的數據庫狀態更新至主服務器當前所處的數據庫狀態。
命令傳播操做用於在主服務器的數據庫狀態被修改,致使主從服務器的數據庫狀態出現不一致時,主服務器會將該命令發送給從服務器執行,使主從服務器保持一致狀態。
SYNC命令會觸發全量同步,執行步驟包括:
從服務器向主服務器發送SYN命令
主服務器收到命令後執行BGSAVE命令,並將以後的寫命令記錄到一個緩衝區中。
主服務器會將生成的RDB文件傳給從服務器,從服務器接收到文件後會清空本身的本地的數據,而後載入該RDB文件。
主服務器將緩衝區中的記錄發送給從服務器。
SYNC命令的不足在於,從節點同主節點鏈接斷開從新鏈接後若是距離上一次的同步時間不久,數據量不大的狀況下也會執行全量同步,會影響性能。爲了處理這種狀況,Redis 2.8後的版本提供PSYNC命令。
PSYNC命令分爲增量同步和全量同步兩種狀況。全量同步用於初次複製的狀況,對於斷線重連後的狀況,主節點會判斷是否知足條件,若是知足則會執行增量同步,不然使用全量同步,這個條件依賴於PSYNC命令的實現,包括:
主從節點的複製偏移量
主節點的複製積壓緩衝區
服務器的運行ID。
複製偏移量:主節點在向從節點傳播N個字節的數據時,會將本身的複製偏移量加N;從節點收到數據後,也會更新本身的複製偏移量,該值能夠用於判斷主從節點是否狀態一致。
複製積壓緩衝區:固定長度的先進先出隊列,存儲着偏移量和字節值的關係。主節點在進行命令傳播時,將命令發送給從節點後,會同時將其寫入複製積壓緩衝區中。當斷線重連後,若是從節點上送的複製偏移量還存在隊列中,則執行增量同步,將緩衝區中,複製偏移量後的字節傳播給從節點,不然將執行全量同步。
服務器運行ID:長度40的16進制字符串,由Redis服務器在啓動後自動分配。主從節點創建鏈接後會互換ID,在斷線重連後,從節點可使用ID來判斷新鏈接上的主節點是否同上次的一致,若是不是直接執行全量同步,不然嘗試使用增量同步。
PSYNC的執行步驟以下:
關於過時鍵的複製,持久化對複製的影響,以及4.0後提供的從節點到從節點的複製等,能夠參考官方的文檔。
我的公衆號:啊駝