Redis主從復制過程
? 當一個Redis節點(Slave節點)接受到類似slaveof 127.0.0.1 6380的指令直到其可以從master持續復制數據,大致經歷如下過程:
1、保存master地址
? 當slave接收到slaveof命令后,slave會立即將新的master地址保存下來。
2、建立連接
? slave中維護著一個定時任務,該任務會嘗試與該master建立socket連接。如果連接無法建立,則其會不斷定時重試,直到連接成功或接收到 slaveof no one 指令。
3、slave發送ping命令
? 連接建立成功后,slave 會發送 ping 命令進行首次通信。如果 slave 沒有收到 master 的回復,則 slave 會主動斷開連接,下次的定時任務會重新嘗試連接。
4、對slave身份驗證
? 如果 master 收到了 slave 的 ping 命令,并不會立即對其進行回復,而是會先進行身份驗證。如果驗證失敗,則會發送消息拒絕連接;如果驗證成功,則向 slave 發送連接成功響應
5、master持久化
? 首次通信成功后,slave 會向 master 發送數據同步請求。當 master 接收到請求后,會 fork出一個子進程,讓子進程以異步方式立即進行持久化。
6、數據發送
? 持久化完畢后 master 會再 fork 出一個子進程,讓該子進程以異步方式將數據發送給slave。slave 會將接收到的數據不斷寫入到本地的持久化文件中。
? 在 slave 數據同步過程中,master 的主進程仍在不斷地接受著客戶端的寫操作,且不僅將新的數據寫入到了 master 內存,同時也寫入到了同步緩存。當 master 的持久化文件中的數據發送完畢后,master 會再將同步緩存中新的數據發送給 slave,由 slave 將其寫入到本地持久化文件中。數據同步完成
7、slave恢復內存數據
? 當 slave 與 master 的數據同步完成后,slave 就會讀取本地的持久化文件,將其恢復到本地內存,然后就可以對外提供讀服務了。
8、持續增量復制
? 在 slave 對外提供服務過程中,master 會持續不斷的將新的數據以增量方式發送給 slave,以保證主從數據的一致性。