Redis主從複製

參考地址:http://doc.redisfans.com/topic/replication.html

複製

Redis 使用異步複製。 從 Redis 2.8 開始, 從服務器會以每秒一次的頻率向主服務器報告複製流(replication stream)的處理進度。

一主可配多從,從可繼續有從服務器,構成圖狀結構。

複製功能不會阻塞主服務器: 即使有一個或多個從服務器正在進行初次同步, 主服務器也可以繼續處理命令請求。(將對數據集有影響的寫命令緩存起來,後續發送slave進行數據同步)

複製功能也不會阻塞從服務器: 只要在 redis.conf 文件中進行了相應的設置, 即使從服務器正在進行初次同步, 服務器也可以使用舊版本的數據集來處理命令查詢。
不過, 在從服務器刪除舊版本數據集並載入新版本數據集的那段時間內, 連接請求會被阻塞。

你還可以配置從服務器, 讓它在與主服務器之間的連接斷開時, 向客戶端發送一個錯誤。
複製功能可以單純地用於數據冗餘(data redundancy), 也可以通過讓多個從服務器處理只讀命令請求來提升擴展性(scalability): 比如說, 繁重的 SORT 命令可以交給附屬節點去運行。

可以通過複製功能來讓主服務器免於執行持久化操作: 只要關閉主服務器的持久化功能, 然後由從服務器去執行持久化操作即可。

複製功能原理

這裏寫圖片描述

1、無論是初次連接還是重新連接, 當建立一個從服務器時, 從服務器都將向主服務器發送一個 SYNC 命令。

2、接到 SYNC 命令的主服務器將開始執行 BGSAVE , 並在保存操作執行期間, 將所有新執行的寫入命令都保存到一個緩衝區裏面。

3、當 BGSAVE 執行完畢後, 主服務器將執行保存操作所得的 .rdb 文件發送給從服務器, 從服務器接收這個 .rdb 文件, 並將文件中的數據載入到內存中。

BGSAVE :在後臺異步(Asynchronously)保存當前數據庫的數據到磁盤。
BGSAVE 命令執行之後立即返回 OK ,然後 Redis fork 出一個新子進程,原來的 Redis 進程(父進程)繼續處理客戶端請求,而子進程則負責將數據保存到磁盤,然後退出。

4、之後主服務器會以 Redis 命令協議的格式, 將寫命令緩衝區中積累的所有內容都發送給從服務器。

你可以通過 telnet 命令來親自驗證這個同步過程: 首先連上一個正在處理命令請求的 Redis 服務器, 然後向它發送 SYNC 命令, 過一陣子, 你將看到 telnet 會話(session)接收到服務器發來的大段數據(.rdb 文件), 之後還會看到, 所有在服務器執行過的寫命令, 都會重新發送到 telnet 會話來。
即使有多個從服務器同時向主服務器發送 SYNC , 主服務器也只需執行一次 BGSAVE 命令, 就可以處理所有這些從服務器的同步請求。

從服務器可以在主從服務器之間的連接斷開時進行自動重連, 在 Redis 2.8 版本之前, 斷線之後重連的從服務器總要執行一次完整重同步(full resynchronization)操作, 但是從 Redis 2.8 版本開始, 從服務器可以根據主服務器的情況來選擇執行完整重同步還是部分重同步(partial resynchronization)。

這裏寫圖片描述

這裏寫圖片描述

部分重同步

從 Redis 2.8 開始, 在網絡連接短暫性失效之後, 主從服務器可以嘗試繼續執行原有的複製進程(process), 而不一定要執行完整重同步操作

主服務器爲被髮送的複製流創建一個內存緩衝區(in-memory backlog), 並且主從服務器之間都記錄一個複製偏移量(replication offset)和一個主服務器 ID (master run id), 當出現網絡連接斷開時, 從服務器會重新連接, 並且向主服務器請求繼續執行原來的複製進程:

  • 如果從服務器記錄的主服務器 ID 和當前要連接的主服務器的 ID 相同, 並且從服務器記錄的偏移量所指定的數據仍然保存在主服務器的複製流緩衝區裏面, 那麼主服務器會向從服務器發送斷線時缺失的那部分數據, 然後複製工作可以繼續執行。
  • 否則的話, 從服務器就要執行完整重同步操作。

Redis 2.8 的這個部分重同步特性會用到一個新增的 PSYNC 內部命令, 而 Redis 2.8 以前的舊版本只有 SYNC 命令, 不過, 只要從服務器是 Redis 2.8 或以上的版本, 它就會根據主服務器的版本來決定到底是使用 PSYNC 還是 SYNC :

  • 如果主服務器是 Redis 2.8 或以上版本,那麼從服務器使用 PSYNC 命令來進行同步。
  • 如果主服務器是 Redis 2.8 之前的版本,那麼從服務器使用 SYNC 命令來進行同步。

主從複製配置

配置一個從服務器非常簡單, 只要在配置文件中增加以下的這一行就可以了:
slaveof 192.168.1.1 6379
當然, 你需要將代碼中的 192.168.1.1 和 6379 替換成你的主服務器的 IP 和端口號。

另外一種方法是調用 SLAVEOF 命令, 輸入主服務器的 IP 和端口, 然後同步就會開始:
127.0.0.1:6379> SLAVEOF 192.168.1.1 10086
OK

這裏寫圖片描述

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章