redis如何實現數據同步


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發出去
        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM