1. 程式人生 > >5.redis主從複製

5.redis主從複製

redis主從複製

什麼是主從複製?

主從複製,是用來建立一個和主資料庫(master)完全一樣的資料庫環境,稱為從資料庫(slave)。

主從複製的作用和使用場合一般有幾個:

一是容災恢復,主資料庫伺服器故障後,可迅速從從資料庫恢復。

二是讀寫分離、主資料庫主要做寫的操作,從資料庫做讀的操作。

主從複製應用場景

電子商務網站上的商品,一般都是一次上傳,無數次瀏覽的,說專業點也就是”多讀少寫”。

對於這種場景我可以一使用主資料庫(master)做寫操作,所有的從伺服器做讀操作。

具體說明:

我們將一臺Redis伺服器作主庫(Matser),其他多臺作為從庫(Slave),主庫只負責寫資料,每次有資料更新都將更新的資料同步到它所有的從庫,而從庫只負責讀資料。這樣一來,就有了兩個好處:

  1. 讀寫分離,不僅可以提高伺服器的負載能力,並且可以根據讀請求的規模自由增加或者減少從庫的數量,棒極了;
  2. 資料被複製成了了好幾份,就算有一臺機器出現故障,也可以使用其他機器的資料快速恢復。

注意事項:在Redis主從模式中,一臺主庫可以擁有多個從庫,但是一個從庫只能隸屬於一個主庫

主從複製實現方式

一主二(多)僕:從字面上來理解就是,一個主資料庫(master)二(多)臺從資料庫(slave)。

在三臺機器上配置好redis環境,並修改相應的配置檔案。

只需要在從資料庫加配置如下程式碼:

slaveof 主資料庫地址 主資料庫埠

slaveof 127.0.0.1 6379

注意:可以通過info replication檢視當前主機狀態。

要模擬三臺機器需要:

  1. 拷貝多個redis.conf檔案。
  2. 開啟daemonize yes。
  3. pid檔名字。pidfile /var/run/redis_6379.pid
  4. 修改埠號。 port ????
  5. log檔名字。 logfile "????"
  6. dump.rdb的名字。dbfilename dump.rdb

預設情況下從伺服器只讀模式不可以寫入。如果執意要將從庫關閉只讀模式:

slave-read-only no#將yes修改為no

但是,因為從庫中修改的資料不會被同步到任何其他資料庫,並且一旦主庫修改了資料,從庫的資料就會因為自動同步被覆蓋,所以一般情況下,不建議將從庫設定為可寫

主庫宕機

當主庫意外關閉時,從庫是什麼情況?

  • 當主庫關閉時,從庫繼續保持從庫狀態,但是和主庫的連線丟失,不能在同步更新資料。如果主庫恢復,從庫也會恢復到連線狀態
  • 當從庫1關閉時,主庫和從庫N都不受影響。但是當從庫重新恢復時,丟失和主庫的連線狀態,必須重新關聯。

薪火相傳

上一個Slave可以是下一個slave的Master,Slave同樣可以接收其他slaves的連線和同步請求,那麼該slave作為了鏈條中下一個的master,可以有效減輕master的寫壓力

中途變更轉向:會清除之前的資料,重新建立拷貝最新的

實現方式:

slaveof 新主庫IP 新主庫埠

master->slave1->slave2

反客為主

字面上來看就是將從資料庫變成主資料庫

指令:

SLAVEOF no one
複製原理
  • 當一個從資料庫啟動時,會向主資料庫傳送sync命令。
  • Master接到命令啟動後臺的存檔程序,同時收集所有接收到的用於修改資料集命令,在後臺程序執行完畢之後,master將傳送整個資料檔案到slave,以完成一次完全同步。
  • 全量複製:而slave服務在接收到資料庫檔案資料後,將其存檔並載入到記憶體中。
  • 增量複製:Master繼續將新的所有收集到的修改命令依次傳給slave,完成同步。
  • 但是隻要是重新連線master,一次完全同步(全量複製)將被自動執行。
主從複製的問題

由於所有的寫操作是先在master上操作,然後更新到slave上,所以從master同步到slave機器有一定的延遲。

當系統很繁忙的時候,延遲問題會更加嚴重,Slave機器數量也會導致這個問題更加嚴重。