redis如何實現數據同步 兩種,1全同步,2部分同步 全備份: 在slave啟動時會向master發送sync消息,master收到slave這條消息之后,將啟動后台備份進程,備份完成之后,將備份數據發送給slave 全備份機制 1.slave向master發送SYNC指令,master接收到該指令,調用syncCommand()函數進行處理 2.在syncCommand函數中,啟動一個備份進程用於數據同步,如果已有備份進程,就不再重新啟動 3.備份進程將執行rdbSave(),完成將redis全部數據保存為rdb文件 4.在redis時間事件函數serverCron中,校驗備份進程是否檢查完畢,如果備份完成,則調用backgroundSaveDoneHandler完成后續操作 5.在backgroundSaveDoneHandler中更新master各種狀態,如備份成功或失敗,備份時間等,然后調用updateSlavesWaitingBgsave,將備份的rdb數據發送給等待的slave 6.在updateSlavesWaitingBgsave中遍歷所有等待同步的slave,將rdb文件發送給每一個slave,並不是立即發送數據給slave,而是等slave注冊寫事件及響應函數sendBulkToSlave,當slave對應的socket能夠發送數據時就調用sendBulkToSlave 7.sendBulkToSlave將備份文件發送給slave
數據修改操作同步 首次啟動全同步,運行過程中進行更新操作(包括寫、刪除、更改操作)的同步,選一個單獨的slave進行數據備份操作 修改操作機制 1.master接收到用戶操作,將調用call函數執行的具體操作函數,在call中先通過proc執行函數操作,然后判斷該操作是否需要擴散到各slave,如果需要則調用函數propagate()來執行 2.propagate函數將操作指令記錄到aof中並擴散到slave,在propagate中調用feedAppendOnlyFile將操作指令記錄到aof中,並通過replicationFeedSlaves將操作擴散到各個slave中 3.feedAppendOnlyFile主要將操作保存到aof中,在該函數中將操作轉換為redis內部協議格式,並以字符串的形式存儲,追加到aof中 4.replicationFeedSlaves將操作擴散到每一個slave中,首先遍歷每一個slave,對每個slave執行以下操作,將slave切換到本操作對應的數據庫(根據數據庫id和當前數據id判斷),寫入切換數據庫的命令時將調用addReply;將命令和參數按照redis協議格式寫入到slave響應緩存中.寫入命令和參數時將調用addReplyMultiBulkLen和addReplyBulk,這兩個函數最終也將調用addReply 5.在函數addReply中將調用prepareClientToWrite,設置slave的socket寫入事件處理函數sendReplyClient(通過aeCreateFileEvent設置),這樣一旦slave對應的socket有空間寫入數據,就調用sendReplyClient進行處理 6.sendReplyClient主要功能是將slave中葯發送的數據通過socket發出去