Redis主從模式部署文檔


Redis主從模式部署文檔

Redis複製概念

中文資料:http://www.redis.cn/topics/cluster-tutorial.html

在 Redis 複製的基礎上,使用和配置主從複製非常簡單,能使得從 Redis 服務器(下文稱 slave)能精確得複製主 Redis 服務器(下文稱 master)的內容。每次當 slave 和 master 之間的連接斷開時, slave 會自動重連到 master 上,並且無論這期間 master 發生了什麼, slave 都將嘗試讓自身成為 master 的精確副本。

這個系統的運行依靠三個主要的機制:

  • 當一個 master 實例和一個 slave 實例連接正常時, master 會發送一連串的命令流來保持對 slave 的更新,以便於將自身數據集的改變複製給 slave , :包括客戶端的寫入、key 的過期或被逐出等等。
  • 當 master 和 slave 之間的連接斷開之後,因為網絡問題、或者是主從意識到連接超時, slave 重新連接上 master 並會嘗試進行部分重同步:這意味著它會嘗試只獲取在斷開連接期間內丟失的命令流。
  • 當無法進行部分重同步時, slave 會請求進行全量重同步。這會涉及到一個更復雜的過程,例如 master 需要創建所有數據的快照,將之發送給 slave ,之後在數據集更改時持續發送命令流到 slave 。
當 master 關閉持久化時,複製的安全性

在使用 Redis 複製功能時的設置中,強烈建議在 master 和在 slave 中啟用持久化。當不可能啟用時,例如由於非常慢的磁盤性能而導致的延遲問題,應該配置實例來避免重置後自動重啟。

為了更好地理解為什麼關閉了持久化並配置了自動重啟的 master 是危險的,檢查以下故障模式,這些故障模式中數據會從 master 和所有 slave 中被刪除:

  • 我們設置節點 A 為 master 並關閉它的持久化設置,節點 B 和 C 從 節點 A 複製數據。
  • 節點 A 崩潰,但是他有一些自動重啟的系統可以重啟進程。但是由於持久化被關閉了,節點重啟後其數據集合為空。
  • 節點 B 和 節點 C 會從節點 A 複製數據,但是節點 A 的數據集是空的,因此複製的結果是它們會銷燬自身之前的數據副本。

當 Redis Sentinel 被用於高可用並且 master 關閉持久化,這時如果允許自動重啟進程也是很危險的。例如, master 可以重啟的足夠快以致於 Sentinel 沒有探測到故障,因此上述的故障模式也會發生。

任何時候數據安全性都是很重要的,所以如果 master 使用複製功能的同時未配置持久化,那麼自動重啟進程這項應該被禁用。

配置主從複製

第一種方法,在slave節點配置文件添加

$ cat redis-7001.conf
...
slaveof 192.168.0.23 7000
...

第一種方法需要重啟redis生效

第二中方法,在slave節點客戶端配置

$ redis-cli -p 7001
slaveof 192.168.0.23 7000

第二中方法實時生效,重啟後失效

7000端口代表master,7001端口代表slave

如果是生產環境建議兩種方法都配置

查看主從複製狀態

# master節點
redis-cli -p 7000 info
...
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.0.23,port=7001,state=online,offset=1737,lag=1
master_repl_offset:1737
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:1736
...
# slave節點
redis-cli -p 7001 info
...
# Replication
role:slave
master_host:192.168.0.23
master_port:7000
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:1821
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
...

最後特別注意的兩點

  • 一定要開啟持久化,防止故障數據丟失
  • slave實例建議開啟只讀性質


分享到:


相關文章: