天天看點

Redis主從(Master-Slave)複制(Replication)設定

1、複制(Replication)

Redis 支援簡單且易用的主從複制(master-slave replication)功能, 該功能可以讓從伺服器(slave server)成為主伺服器(master server)的精确複制品。

以下是關于 Redis 複制功能的幾個重要方面:

  1. Redis 使用異步複制。 從 Redis 2.8 開始, 從伺服器會以每秒一次的頻率向主伺服器報告複制流(replication stream)的處理進度。
  2. 一個主伺服器可以有多個從伺服器。
  3. 不僅主伺服器可以有從伺服器, 從伺服器也可以有自己的從伺服器, 多個從伺服器之間可以構成一個圖狀結構。
  4. 複制功能不會阻塞主伺服器: 即使有一個或多個從伺服器正在進行初次同步, 主伺服器也可以繼續處理指令請求。
  5. 複制功能也不會阻塞從伺服器: 隻要在 redis.conf 檔案中進行了相應的設定, 即使從伺服器正在進行初次同步, 伺服器也可以使用舊版本的資料集來處理指令查詢。
  6. 不過, 在從伺服器删除舊版本資料集并載入新版本資料集的那段時間内, 連接配接請求會被阻塞。
  7. 你還可以配置從伺服器, 讓它在與主伺服器之間的連接配接斷開時, 向用戶端發送一個錯誤。
  8. 複制功能可以單純地用于資料備援(data redundancy), 也可以通過讓多個從伺服器處理隻讀指令請求來提升擴充性(scalability): 比如說, 繁重的 SORT 指令可以交給附屬節點去運作。
  9. 可以通過複制功能來讓主伺服器免于執行持久化操作: 隻要關閉主伺服器的持久化功能, 然後由從伺服器去執行持久化操作即可。

2、複制功能的運作原理

無論是初次連接配接還是重新連接配接, 當建立一個從伺服器時, 從伺服器都将向主伺服器發送一個 SYNC 指令。

接到 SYNC 指令的主伺服器将開始執行 BGSAVE , 并在儲存操作執行期間, 将所有新執行的寫入指令都儲存到一個緩沖區裡面。

當 BGSAVE 執行完畢後, 主伺服器将執行儲存操作所得的 .rdb 檔案發送給從伺服器, 從伺服器接收這個 .rdb 檔案, 并将檔案中的資料載入到記憶體中。

之後主伺服器會以 Redis 指令協定的格式, 将寫指令緩沖區中積累的所有内容都發送給從伺服器。

你可以通過 telnet 指令來親自驗證這個同步過程: 首先連上一個正在處理指令請求的 Redis 伺服器, 然後向它發送 SYNC 指令, 過一陣子, 你将看到 telnet 會話(session)接收到伺服器發來的大段資料(.rdb 檔案), 之後還會看到, 所有在伺服器執行過的寫指令, 都會重新發送到 telnet 會話來。

即使有多個從伺服器同時向主伺服器發送 SYNC , 主伺服器也隻需執行一次 BGSAVE 指令, 就可以處理所有這些從伺服器的同步請求。

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

3、部分重同步

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

這個特性需要主伺服器為被發送的複制流建立一個記憶體緩沖區(in-memory backlog), 并且主伺服器和所有從伺服器之間都記錄一個複制偏移量(replication offset)和一個主伺服器 ID (master run id), 當出現網絡連接配接斷開時, 從伺服器會重新連接配接, 并且向主伺服器請求繼續執行原來的複制程序:

  1. 如果從伺服器記錄的主伺服器 ID 和目前要連接配接的主伺服器的 ID 相同, 并且從伺服器記錄的偏移量所指定的資料仍然儲存在主伺服器的複制流緩沖區裡面, 那麼主伺服器會向從伺服器發送斷線時缺失的那部分資料, 然後複制工作可以繼續執行。
  2. 否則的話, 從伺服器就要執行完整重同步操作。

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

  1. 如果主伺服器是 Redis 2.8 或以上版本,那麼從伺服器使用 PSYNC 指令來進行同步。
  2. 如果主伺服器是 Redis 2.8 之前的版本,那麼從伺服器使用 SYNC 指令來進行同步。

4、配置

配置一個從伺服器非常簡單, 隻要在配置檔案中增加以下的這一行就可以了:

另外一種方法是調用 SLAVEOF 指令, 通過redis用戶端工具連接配接到從(slave)伺服器,輸入主伺服器的 IP 和端口, 然後同步就會開始:

5、隻讀從伺服器

從 Redis 2.6 開始, 從伺服器支援隻讀模式, 并且該模式為從伺服器的預設模式。

隻讀模式由 redis.conf 檔案中的 slave-read-only 選項控制, 也可以通過 CONFIG SET 指令來開啟或關閉這個模式。

隻讀從伺服器會拒絕執行任何寫指令, 是以不會出現因為操作失誤而将資料不小心寫入到了從伺服器的情況。

即使從伺服器是隻讀的, DEBUG 和 CONFIG 等管理式指令仍然是可以使用的, 是以我們還是不應該将伺服器暴露給網際網路或者任何不可信網絡。 不過, 使用 redis.conf 中的指令改名選項, 我們可以通過禁止執行某些指令來提升隻讀從伺服器的安全性。

你可能會感到好奇, 既然從伺服器上的寫資料會被重同步資料覆寫, 也可能在從伺服器重新開機時丢失, 那麼為什麼要讓一個從伺服器變得可寫呢?

原因是, 一些不重要的臨時資料, 仍然是可以儲存在從伺服器上面的。 比如說, 用戶端可以在從伺服器上儲存主伺服器的可達性(reachability)資訊, 進而實作故障轉移(failover)政策。

6、從伺服器相關配置

如果主伺服器通過 requirepass 選項設定了密碼, 那麼為了讓從伺服器的同步操作可以順利進行, 我們也必須為從伺服器進行相應的身份驗證設定。

對于一個正在運作的伺服器, 可以使用用戶端輸入以下指令:

config set masterauth <password>
           

要永久地設定這個密碼, 那麼可以将它加入到配置檔案中:

另外還有幾個選項, 它們和主伺服器執行部分重同步時所使用的複制流緩沖區有關, 詳細的資訊可以參考 Redis 源碼中附帶的 redis.conf 示例檔案。

7、主伺服器隻在有至少 N 個從伺服器的情況下,才執行寫操作

從 Redis 2.8 開始, 為了保證資料的安全性, 可以通過配置, 讓主伺服器隻在有至少 N 個目前已連接配接從伺服器的情況下, 才執行寫指令。

不過, 因為 Redis 使用異步複制, 是以主伺服器發送的寫資料并不一定會被從伺服器接收到, 是以, 資料丢失的可能性仍然是存在的。

以下是這個特性的運作原理:

  1. 從伺服器以每秒一次的頻率 PING 主伺服器一次, 并報告複制流的處理情況。

    主伺服器會記錄各個從伺服器最後一次向它發送 PING 的時間。

  2. 使用者可以通過配置, 指定網絡延遲的最大值 min-slaves-max-lag , 以及執行寫操作所需的至少從伺服器數量 min-slaves-to-write 。
  3. 如果至少有 min-slaves-to-write 個從伺服器, 并且這些伺服器的延遲值都少于 min-slaves-max-lag 秒, 那麼主伺服器就會執行用戶端請求的寫操作。

你可以将這個特性看作 CAP 理論中的 C 的條件放寬版本: 盡管不能保證寫操作的持久性, 但起碼丢失資料的視窗會被嚴格限制在指定的秒數中。

另一方面, 如果條件達不到 min-slaves-to-write 和 min-slaves-max-lag 所指定的條件, 那麼寫操作就不會被執行, 主伺服器會向請求執行寫操作的用戶端傳回一個錯誤。

以下是這個特性的兩個選項和它們所需的參數:

min-slaves-to-write <number of slaves>
min-slaves-max-lag <number of seconds>
           

詳細的資訊可以參考 Redis 源碼中附帶的 redis.conf 示例檔案。

以上内容摘自:http://doc.redisfans.com/topic/replication.html

8、Redis主從複制實戰

安裝兩台虛拟機,虛拟機ip位址分别為:192.168.199.126,192.168.199.249(具體情況具體分析,以實際虛拟機ip位址為準)

在兩台虛拟機中下載下傳并安裝Redis,具體可參考http://blog.csdn.net/zyhlwzy/article/details/78366265

将192.168.199.126上的Redis配置成master,是以配置很簡單,我們開啟守護程序即可。

進入redis配置檔案目錄(/data/redis/redis-4.0.1/redis.conf)。

設定如下

将192.168.199.249上的Redis配置成slave。

進入redis配置檔案目錄(/data/redis/redis-4.0.1/redis.conf)。

設定如下:

daemonize yes
slaveof  
           

Master我們沒設定密碼,是以這兒也就不用設定Master的密碼。

啟動兩台虛拟機中的Redis,成功啟動之後,用Redis用戶端工具連接配接到Master伺服器。輸入info replication指令可檢視主從配置資訊。

:> info replication
# Replication
role:master
connected_slaves:
slave0:ip=,port=,state=online,offset=,lag=
master_replid:e110e1acfcc89bcba0f204138f615d3d61
master_replid2:
master_repl_offset:
second_repl_offset:-
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen:
           

我們在master伺服器上寫入一條資料:

:> set tfs 'hello replication'
OK
:> get tfs
"hello replication"
           

在從(Slave)伺服器上,我們通過get指令,也可以get到資料:

[[email protected] bin]# ./redis-cli -h 192.168.199.249 -p 6379
:> get tfs
"hello replication"
           

繼續閱讀