一、 原理
Redis的主從複製功能非常強大,一個master可以擁有多個slave,而一個slave又可以擁有多個slave,如此下去,形成了強大的多級伺服器叢集架構。下面是關於redis主從複製的一些特點:
1.master可以有多個slave
2.除了多個slave連到相同的master外,slave也可以串連其他slave形成圖狀結構
3.主從複製不會阻塞master。也就是說當一個或多個slave與master進行初次同步資料時,master可以繼續處理client發來的請求。相反slave在初次同步資料時則會阻塞不能處理client的請求。
4.主從複製可以用來提高系統的延展性,我們可以用多個slave 專門用於client的讀請求,比如sort操作可以使用slave來處理。也可以用來做簡單的資料冗餘
5.可以在master禁用資料持久化,只需要注釋掉master 設定檔中的所有save配置,然後只在slave上配置資料持久化。
下面介紹下主從複製的過程
當設定好slave伺服器後,slave會建立和master的串連,然後發送sync命令。無論是第一次同步建立的串連還是串連斷開後的重新連 接,master都會啟動一個後台進程,將資料庫快照集儲存到檔案中,同時master主進程會開始收集新的寫命令並緩衝起來。後台進程完成寫檔案 後,master就傳送檔案給slave,slave將檔案儲存到磁碟上,然後載入到記憶體恢複資料庫快照集到slave上。接著master就會把緩衝的命 令轉寄給slave。而且後續master收到的寫命令都會通過開始建立的串連發送給slave。從master到slave的同步資料的命令和從 client發送的命令使用相同的協議格式。當master和slave的串連斷開時slave可以自動重建立立串連。如果master同時收到多個 slave發來的同步串連命令,只會使用啟動一個進程來寫資料庫鏡像,然後發送給所有slave。
二、 配置
下面我示範下怎樣在多台伺服器上進行Redis資料主從複製。我假設有兩台伺服器,一台是Linux作業系統(區域網路IP:192.168.1.4,master伺服器),一台是Linux作業系統(區域網路IP:192.168.1.5,slave伺服器)
配置slave伺服器很簡單,只需要在設定檔(redis.conf)中加入如下配置
bind 192.168.1.5(從伺服器,此處預設是127.0.0.1,請修改成原生IP地址,要不然,用戶端無法進行訪問)
slaveof 192.168.1.4 6379 (映射到主伺服器上)
如果是在一台機器上面配置主從關係,那麼還需要修改從伺服器的預設連接埠號碼,同樣也在redis.conf中進行修改。
其中還有些redis自身的配置請參見我的另一篇文章
三、 測試
當啟動master機器後,寫入資料到master後,這時啟動slave機器,可以發現slave上:
會發送一個SYNC請求,從Master上面進行相應,而且它支援自動重連,即當master掉線的情況下,它會處於等待請求的狀態。
而Master上:
兩台機器的dump檔案大小一樣:
192.168.1.5(slave):
192.168.1.4(master):
從Redis源碼中,可以發現rdb檔案採用的是lzf壓縮演算法進行實現,預設lzf壓縮演算法是開啟的。
這樣你可以通過其他的用戶端程式或者Web平台去讀取Slave磁碟資料庫的資料,真正達到了讀寫分離的目的。