天天看點

Redis(10):Redis主從複制Redis主從複制

Redis主從複制

主從複制,是指将一台Redis伺服器的資料,複制到其他的Redis伺服器。前者稱為主節點(master),後者稱為從節點(slave);資料的複制是單向的,隻能由主節點到從節點。

預設情況下,每台Redis伺服器都是主節點;且一個主節點可以有多個從節點(或沒有從節點),但一個從節點隻能有一個主節點。

主從複制的作用

主從複制的作用主要包括:

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

一般來說,要将Redis運用于工程項目中,隻使用一台Redis是萬萬不能的(當機),原因如下:

1、從結構上,單個Redis伺服器會發生單點故障,并且一台伺服器需要處理所有的請求負載,壓力較 大;

2、從容量上,單個Redis伺服器記憶體容量有限,就算一台Redis伺服器記憶體容量為256G,也不能将所有 記憶體用作Redis存儲記憶體,一般來說,單台Redis最大使用記憶體不應該超過20G。 電商網站上的商品,一般都是一次上傳,無數次浏覽的,說專業點也就是"多讀少寫"。 對于這種場景,我們可以使如下這種架構:

Redis(10):Redis主從複制Redis主從複制

主從複制,讀寫分離! 80% 的情況下都是在進行讀操作!減緩伺服器的壓力!架構中經常使用! 一主 二從!

隻要在公司中,主從複制就是必須要使用的,因為在真實的項目中不可能單機使用Redis!

環境配置

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

127.0.0.1:6379> info replication # 檢視目前庫的資訊
# Replication
role:master # 角色 master
connected_slaves:0 # 沒有從機
master_replid:b63c90e6c501143759cb0e7f450bd1eb0c70882a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
           

複制3個配置檔案,然後修改對應的資訊

  1. 端口
  2. pid 名字
  3. log檔案名字
  4. dump.rdb 名字

一主二從

預設情況下,每台Redis伺服器都是主節點; 我們一般情況下隻用配置從機就好了! 認老大! 一主 (79)二從(80,81)

127.0.0.1:6380> SLAVEOF 127.0.0.1 6379 # SLAVEOF host 6379 找誰當自己的老大!
OK
127.0.0.1:6380> info replication
# Replication
role:slave # 目前角色是從機
master_host:127.0.0.1 # 可以的看到主機的資訊
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:a81be8dd257636b2d3e7a9f595e69d73ff03774e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
# 在主機中檢視!
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1 # 多了從機的配置
slave0:ip=127.0.0.1,port=6380,state=online,offset=42,lag=1 # 多了從機的配置
master_replid:a81be8dd257636b2d3e7a9f595e69d73ff03774e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:42
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:42
           

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

Redis(10):Redis主從複制Redis主從複制

真實的從主配置應該在配置檔案中配置,這樣的話是永久的,我們這裡使用的是指令,暫時的!

細節

主機可以寫,從機不能寫隻能讀!主機中的所有資訊和資料,都會自動被從機儲存!

主機寫:

Redis(10):Redis主從複制Redis主從複制

從機隻能讀取内容

Redis(10):Redis主從複制Redis主從複制

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

如果是使用指令行,來配置的主從,這個時候如果重新開機了,就會變回主機!隻要變為從機,立馬就會從 主機中擷取值!

複制原理

Slave 啟動成功連接配接到 master 後會發送一個sync同步指令

Master 接到指令,啟動背景的存盤程序,同時收集所有接收到的用于修改資料集指令,在背景程序執行 完畢之後,master将傳送整個資料檔案到slave,并完成一次完全同步。

全量複制:而slave服務在接收到資料庫檔案資料後,将其存盤并加載到記憶體中。

增量複制:Master 繼續将新的所有收集到的修改指令依次傳給slave,完成同步 但是隻要是重新連接配接master,一次完全同步(全量複制)将被自動執行! 我們的資料一定可以在從機中 看到!

層層鍊路

上一個M連結下一個 S!

Redis(10):Redis主從複制Redis主從複制

這時候也可以完成我們的主從複制!

如果沒有老大了,這個時候能不能選擇一個老大出來呢? 手動!

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

繼續閱讀