1. 程式人生 > >企業級Redis開發運維從入門到實踐 (21)— 全量複製和部分複製

企業級Redis開發運維從入門到實踐 (21)— 全量複製和部分複製

全量複製

對於一個儲存了很多資料的 master(主節點),slave(從節點)去做一個複製,想要的想過是把 master 的資料全部同步過來,在同步過程中 master 寫入的新資料也需要同步過來,這樣才可以達到資料完整同步的效果。

全量複製可以完成上述功能,首先將當前的 RDB 檔案同步給 slave,寫入命令單獨記錄;當 RDB 檔案載入完後,通過偏移量的對比將這期間產生寫入的值同步給 slave。

全量複製過程如下:

  1. 首次同步時 slave 不知道 master 的 runid 和 偏移量,slave將傳送 psync ? -1 (psync是同步命令,2.8版之前是sync;可實現全量和部分,有兩個引數 runid
    offset(偏移量) ;?表示 runid,-1表示offset)來同步資料;
  2. master 將執行一個全量複製,同時返回自己的 runid 和 offset 給slave;
  3. slave 儲存 master 的基本資訊;
  4. master 執行 bgsave 命令做一個 RDB 的生成,在生成 RDB 和 RDB 傳輸過程中寫入的新命令將被推入 repl_back_buffer(複製緩衝區)
  5. master 將 RDB 檔案傳給 slave;
  6. master 將 repl_back_buffer(複製緩衝區) 傳給 slave;
  7. slave 清除舊的資料;
  8. slave 根據 RDB 檔案和 repl_back_buffer(複製緩衝區)
    載入新的資料。 在這裡插入圖片描述

全量複製的開銷

  1. bgsave 耗費的時間;
  2. RDB 檔案網路傳輸耗費的時間;
  3. 從節點清空資料耗費時間(根據從節點的資料規模來定);
  4. 從節點載入 RDB 的耗費時間;
  5. 可能的 AOF 重寫耗費時間;

部分複製

全量複製的問題

除了上述的開銷以外還存在一個問題; 假如說 master 和 slave 之間的網路發生了抖動,那麼一段時間內這些資料就會進行一個丟失,這段時間內 master 更新的資料 slave 是不知道的,最簡單的方法是再做一次全量複製來拉取最新的資料。 這樣將大大的提升了裝置效能的消耗,所以2.8版以後 Redis 提供了部分複製的功能。

部分複製過程如下:

  1. 因為網路抖動導致 master 和 slave 斷開連線;
  2. master 寫命令時會向 repl_back_buffer(複製緩衝區) 寫一份‘’;
  3. 網路抖動結束,slave 再次成功連上 master;
  4. slave 向 master 傳送 pysnc {offset} {runid} 命令,把自己當前的 offset (偏移量)和 runid 傳給 master;
  5. 當 slave 傳輸的 offset 在 master 的 buffer (buffer預設大小是1MB)的範圍內(即在偏移量佇列中),master 返回 contiune;
  6. master 返回 buffer 中的資料給 slave;

在這裡插入圖片描述