二十五、redis主從複製

一.概念

主從複製,是指將一臺Redis服務器的數據,複製到其他的Redis服務器。前者稱爲主節點(master/leader),後者稱爲從節點(slave/follower);

數據的複製是單向的,只能由主節點到從節點。
Master以寫爲主,Slave 以讀爲主;
默認情況下,每臺Redis服務器都是主節點;
一個主節點可以有多個從節點(或沒有從節點),但一個從節點只能有一個主節點。


主從複製的作用主要包括:
1、數據冗餘:主從複製實現了數據的熱備份,是持久化之外的一種數據冗餘方式。
2、故障恢復:當主節點出現問題時,可以由從節點提供服務,實現快速的故障恢復;實際上是一種服務的冗餘。
3、負載均衡:在主從複製的基礎上,配合讀寫分離,可以由主節點提供寫服務,由從節點提供讀服務(即寫Redis數據時應用連接主節點,讀Redis數據時應用連接從節點),分擔服務器負載;尤其是在寫少讀多的場景下,通過多個從節點分擔讀負載,可以大大提高Redis服務器的併發量。
4、高可用(集羣)基石:除了上述作用以外,主從複製還是哨兵和集羣能夠實施的基礎,因此說主從複製是Redis高可用的基礎。

一般來說,要將Redis運用於工程項目中,只使用一臺Redis是萬萬不能的(宕機),原因如下:
1、從結構上,單個Redis服務器會發生單點故障,並且一臺服務器需要處理所有的請求負載,壓力較大;
2、從容量上,單個Redis服務器內存容量有限,就算一臺Redis服務器內存容量爲256G,也不能將所有內存用作Redis存儲內存,一般來說,單臺Redis最大使用內存不應該超過20G。
電商網站上的商品,一般都是一次上傳,無數次瀏覽的,說專業點也就是"多讀少寫"。
對於這種場景,我們可以使如下這種架構:

主從複製,讀寫分離! 80% 的情況下都是在進行讀操作!減緩服務器的壓力!架構中經常使用! 一主二從!
只要在公司中,主從複製就是必須要使用的,因爲在真實的項目中不可能單機使用Redis!

二.環境配置

只配置從庫,不用配置主庫!!!

127.0.0.1:6379> info replication  #查看當前庫的信息
# Replication
role:master   #角色 master
connected_slaves:0    #沒有從機
 

在單臺服務器上,製作三臺redis服務

複製3個配置文件,然後修改對應的信息
1、端口
2、pid 名字
3、log文件名字
4、dump.rdb 名字  appendonly.aof名稱

複製三分配置文件

1.修改端口

2.修改pid名字

3.修改log名稱

4.修改dump文件名稱  修改AOF文件名稱

修改完畢之後,啓動我們的3個redis服務器,可以通過進程信息查看!

三.一主兩從

默認情況下,每臺Redis服務器都是主節點; 我們一般情況下只用配置從機就好了!

原則就是認老大! 一主 (79)二從(80,81)

127.0.0.1:6380> SLAVEOF 127.0.0.1 6379 # SLAVEOF host 6379 找誰當自己的老大!

127.0.0.1:6380> info replication

role:slave # 當前角色是從機
master_host:127.0.0.1 # 可以的看到主機的信息

127.0.0.1:6379> info replication  # 在主機中查看!

role:master
connected_slaves:1 # 多了從機的配置
slave0:ip=127.0.0.1,port=6380,state=online,offset=42,lag=1 # 多了從機的配置

如果兩個都配置完了,就是有兩個從機

真實的從主配置應該在配置文件中配置,這樣的話是永久的,我們這裏使用的是命令,臨時的!

三.主從關係細節

主機可以寫,從機不能寫只能讀!主機中的所有信息和數據,都會自動被從機保存!

主機寫入:

從機只能讀取內容:

測試:主機斷開連接,從機依舊連接到主機的,但是沒有寫操作,這個時候,主機如果回來了,從機依舊可以直接獲取到主機寫的信息!

測試:如果是使用命令行,來配置的主從,這個時候如果重啓了,就會變回主機!只要變爲從機,立馬就會從主機中獲取值!

測試:如果主機斷開了連接,我們可以使用 SLAVEOF no one 讓自己變成主機!其他的節點就可以手動連接到最新的這個主節點(手動)!如果這個時候老大修復了,那就重新連接!

四.主從複製原理

Slave 啓動成功連接到 master 後會發送一個sync同步命令;

Master 接到命令,啓動後臺的存盤進程,同時收集所有接收到的用於修改數據集命令,在後臺進程執行完畢之後,master將傳送整個數據文件到slave,並完成一次完全同步。

全量複製:slave服務在接收到數據庫文件數據後,將其存盤並加載到內存中。

增量複製:Master 繼續將新的所有收集到的修改命令依次傳給slave,完成同步

但是隻要是重新連接master,一次完全同步(全量複製)將被自動執行! 我們的數據一定可以在從機中看到!