本文內容摘錄自同事Perry Zhang的講解,如需轉載須本人同意。
1.主從
命令:slaveof <IP><PORT>
redis主從配置:redis支持master-slave的主從配置,配置方法是在從機的配置文件中指定slaveof參數為主機的ip和port即可
將一台服務器(Slave)變成為另外一個服務器(Master)的復制品
復制過程:
1. Slave向Master發送 Sync命令
2. 接到 Sync命令的Master會調用BGSAVE ,創建一個 RDB 文件,並使用Backlog記錄接下來執行的所有寫命令
3. 當Master執行完 BGSAVE 命令時,它會向Slave發送 RDB 文件,而Slave則會接收並載入這個文件
4. Master將Backlog儲存的所有寫命令發送給Slave執行
Sync 命令同步后,主從會達到暫時的數據一致性。
數據不一致:Master執行了新的寫命令,則主從數據又將不一致
5. 在主從完成同步之后,Master每執行一個寫命令,它都會將被執行的寫命令發送給Slave執行,這個操作被稱為 “Command Propagate”
Command Propagate是持續的過程:只要復制仍在繼續,命令傳播就會一直進行,使得主從的狀態可以一直保持一致
之后每當有什么新的寫命令被執行了,比如 SET k7 v7、SET k8 v8 等等,Master也會繼續將命令傳播給Slave執行。
2.8之后,Redis使用PSync命令代替Sync
PSync最大特性:部分重同步(Partial Resync)
為什么采用部分重同步技術?
在主從斷線並且重新連接的時候,只要條件允許,PSYNC 可以讓Master只向Slave同步斷線期間缺失的數據,而不用重新向Slave同步整個庫
Sync斷線重連過程
PSync斷線重連過程
復制的數據一致性問題
理論上會出現復制不一致的情況:在Master執行完寫命令直到Slave執行完寫命令的這段時間里,如下例
Redis 目前的復制實現只保證最終一致性,而不是強一致性