首頁 > 科技

Redis高可用之主從複製實踐

2021-08-26 03:04:04

前言

Redis支援多種高可用方案如Redis Sentinel 叢集和 Redis 資料叢集,但是今天我們的主題是Redis的主從複製。而且今天我們重點在於如何搭建Redis的主從複製,不著重與主從複製的原理。廢話不多說,那麼我們就來實踐Redis主從複製的搭建。

什麼是主從複製

開始動手之前,我們先簡單聊一聊什麼是主從複製?主從複製是指將一個Redis伺服器的資料,複製到其他的Redis伺服器,這就叫做主從複製。在這個現象中前者稱之為主節點(master),後者稱之為從節點(slave);資料的複製是單向的,只能由主節點到從節點。

預設情況下,每臺Redis伺服器都是主節點;且一個主節點可以有0個或者有1個以上的從節點,但一個從節點只能有一個主節點。

主從複製的作用

當我們知道了什麼是主從複製,那我們肯定也要知道為啥需要主從複製了,不然只知道怎麼去做,不知道為啥去做,也是蠻煩惱的。Redis的主從複製到底有啥用,這個我們就可以看看如果只有單機情況下的Redis宕機,我們到底會面臨啥問題,自然就能得出Redis的主從複製的作用,這裡我們就不展開說,直接給出結論。Redis的主從複製主要有以下幾種作用:

  • 資料備份。單個Redis一旦宕機,就有可能丟失所有資料,主從複製實現了資料的熱備份,即使master宕機丟失資料,只要有slave存在我們就可以找回資料。
  • 負載均衡。搭建好了主從,我們就可以只讓主負責寫服務,其他從負責讀服務,這樣在讀多寫少的場景下,通過多個從節點的分擔讀請求,就可以實現提高Redis的併發量,從而提高系統的效能。
  • 高可用基礎。Redis這種主從複製在master發生故障時不能自動從slave中選舉、切換master,需要人工干預。總的來說不夠智慧,後續的哨兵模式、Redis叢集能夠解決這些問題,但是又建立在Redis這種主從複製上,所以說他是高可用的基礎。 後面我們就來說一說,如何搭建Redis的主從複製。

伺服器準備

目前手裡買的伺服器都已經過期了,只能拿自己的電腦做實驗,所以直接把Redis目錄複製三份,並將每一份的配置檔案redis.conf中埠號port配置進行修改。

# 將埠號6379分別修改成下表中的樣子port 6379

建立複製的相關命令

需要注意的是,Redis主從複製的開啟,完全是在從節點發起的;不需要我們在主節點做任何事情。

從節點開啟主從複製,有以下三種方式:

  • 通過配置檔案開啟

在從伺服器的配置檔案中指定具體的master的地址,配置格式如下:

slaveof <masterip> <masterport># 如果master有密碼masterauth <master-password>

在配置檔案redis.conf中新增以下配置:

slaveof 192.168.1.103 6379  # 如果master有密碼masterauth 2021

  • 啟動從伺服器時開啟

redis-server啟動命令後加入參數 --slaveof <masterip> <masterport>,如果master有密碼,則需要加入密碼參數。 --requirepass <password> 最終的啟動命令如下:

redis-server.exe  ./redis.conf  --slaveof 127.0.0.1 6379 --masterauth 2021

  • 客戶端處執行命令開啟 在Redis客戶端如redis-cli 中執行命令 slaveof <masterip> <masterport>來指定主伺服器,如果master有密碼則需要緊接著執行下面的命令: config set masterauth 2021 複製程式碼

上述3種方式最終的效果都是一樣的的,大家可以自己試一試。這裡以第二種方式為例,看一下當執行了slaveof後,Redis主節點和從節點的變化。

觀察效果

在master的客戶端上執行命令info replication 和client list 可以看到下圖所示的資訊:

在埠號為6381的slave上執行 info replication命令可以看到下面的資訊:

由兩張圖的資訊可以看出,埠號為6379的伺服器角色是master,埠號6380和6381的伺服器角色是slave,那麼接下來我們試試到底他們之間能不能同步資料。

從下圖可以看出master和slave都是沒有資料的(6380的機器也是一樣我就沒有放上來)

那麼我們接下來就開始測試:

  1. 在master上執行命令:

set test 123

  1. 到對應的slave去查詢這個key

從節點已經有了資料,讀取出來資料也是正確的。

  1. 接下來我們在master上刪除這個key。
  2. 再到對應的slave上讀取這個key,可以發現數據已經沒有了。
  3. 我們在master在增加一些資料,然後將slave6381和master斷開主從關係,看看有什麼現象。

在確保slave6381已經有了上述資料之後,我們執行下面的命令斷開主從關係。

slaveof no one

記住我們在前文說到過「Redis主從複製的開啟,完全是在從節點發起的;不需要我們在主節點做任何事情」,所以這個命令是在slave6381上執行的,大家千萬別搞錯了!

slave6381執行命令之後資訊如圖所示,我們發現斷開了關係,但是slave6381上從master上同步過來的資料仍然存在。因為從節點斷開復制後,不會刪除已有的資料,只是不再同步主節點新的資料變化。

主節點列印的日誌如下圖所示,顯示slave6381已經下線。

下面是redis主從複製場景的一些可調參數,需要根據實際環境調整

  • slave-serve-stale-data yes : 是否可以把不新鮮的資料服務與客戶端
  • slave-read-only yes : 從節點只讀,啟用slaveof定義後才生效
  • repl-diskless-sync no :是否同時向多個從節點同時發資料
  • repl-diskless-sync-delay 5 :傳送的延遲時間
  • repl-ping-slave-period 10 探測從節點狀態
  • repl-timeout 60 探測節點超時時間
  • repl-disable-tcp-nodelay no : 啟用nodelay
  • repl-backlog-size 1mb
  • slave-priority 100 : 從節點優先順序,複製叢集中,主節點故障時,sentinel應用場景中的主節點選舉時使用的優先順序;數字越小優先順序越高,但0表示不參與選舉;
  • min-slaves-to-write 3:主節點僅允許其能夠通訊的從節點數量大於等於此處的值時接受寫操作;
  • min-slaves-max-lag 10:從節點延遲時長超出此處指定的時長時,主節點會拒絕寫入操作

總結

綜上所述,簡單的Redis主從複製就搭建好了。另外提一下,slave 可以接受其他 slave 的連線。除了多個 slave 可以連線到同一個 master 之外, slave 之間也可以像層疊狀的結構(cascading-like structure)連線到其他 slave 。自 Redis 4.0 起,所有的 sub-slave 將會從 master 收到完全一樣的複製流。本文這裡呢只是簡單搭建一下主從複製,有興趣的同學可以自己試一試。

作者:山姆劉
連結:https://juejin.cn/post/6999831397296766989
來源:掘金


IT145.com E-mail:sddin#qq.com