redis主從複製 Author:SimpleWu "GitHub redis" 什麼是主從複製? 主從複製,是用來建立一個和主資料庫(master)完全一樣的資料庫環境,稱為從資料庫(slave)。 主從複製的作用和使用場合一般有幾個: 一是容災恢復,主資料庫伺服器故障後,可迅速從從資料庫恢復。 ...
redis主從複製
Author:SimpleWu
GitHub-redis
什麼是主從複製?
主從複製,是用來建立一個和主資料庫(master)完全一樣的資料庫環境,稱為從資料庫(slave)。
主從複製的作用和使用場合一般有幾個:
一是容災恢復,主資料庫伺服器故障後,可迅速從從資料庫恢復。
二是讀寫分離、主資料庫主要做寫的操作,從資料庫做讀的操作。
主從複製應用場景
電子商務網站上的商品,一般都是一次上傳,無數次瀏覽的,說專業點也就是”多讀少寫”。
對於這種場景我可以一使用主資料庫(master)做寫操作,所有的從伺服器做讀操作。
具體說明:
我們將一臺Redis伺服器作主庫(Matser),其他多台作為從庫(Slave),主庫只負責寫數據,每次有數據更新都將更新的數據同步到它所有的從庫,而從庫只負責讀數據。這樣一來,就有了兩個好處:
- 讀寫分離,不僅可以提高伺服器的負載能力,並且可以根據讀請求的規模自由增加或者減少從庫的數量,棒極了;
- 數據被覆製成了了好幾份,就算有一臺機器出現故障,也可以使用其他機器的數據快速恢復。
註意事項:在Redis主從模式中,一臺主庫可以擁有多個從庫,但是一個從庫只能隸屬於一個主庫
主從複製實現方式
一主二(多)僕:從字面上來理解就是,一個主資料庫(master)二(多)台從資料庫(slave)。
在三台機器上配置好redis環境,並修改相應的配置文件。
只需要在從資料庫加配置如下代碼:
slaveof 主資料庫地址 主資料庫埠
slaveof 127.0.0.1 6379
註意:可以通過info replication查看當前主機狀態。
要模擬三台機器需要:
- 拷貝多個redis.conf文件。
- 開啟daemonize yes。
- pid文件名字。pidfile /var/run/redis_6379.pid
- 修改埠號。 port ????
- log文件名字。 logfile "????"
- 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機器數量也會導致這個問題更加嚴重。