1. 程式人生 > >高效能網站架構設計之快取篇(4)- Redis 主從複製

高效能網站架構設計之快取篇(4)- Redis 主從複製

Redis 的主從複製配置非常容易,但我們先來了解一下它的一些特性。

  1. redis 使用非同步複製。從 redis 2.8 開始,slave 也會週期性的告訴 master 現在的資料量。可能只是個機制,用途應該不大。
  2. 一個 master 可以擁有多個 slave,廢話,這也是業界的標配吧。

  3. slave 可以接收來自其他 slave 的連線。意思是不是就是說 slave 在接收其他的slave的連線之後成為 master ?等下我們來驗證。

  4. redis 複製在 master 這一端是非阻塞的,也就是說在和 slave 同步資料的時候,master 仍然可以執行客戶端的操作命令而不受其影響。這點都不能保證,要你幹嘛?
  5. redis 複製在 slave 這一端也是非阻塞的。在配置檔案裡面有 slave-serve-stale-data 這一項,如果它為 yes ,slave 在執行同步時,它可以使用老版本的資料來處理查詢請求,如果是 no ,slave 將返回一個錯誤。在完成同步後,slave 需要刪除老資料,載入新資料,在這個階段,slave 會阻止連線進來。
  6. Replication can be used both for scalability, in order to have multiple slaves for read-only queries (for example, heavy 

    SORT operations can be offloaded to slaves), or simply for data redundancy.這句話我也沒理解什麼意思。

  7. 使用複製可以避免 master 因為需要把全部的資料集寫入磁碟而造成的開銷,因此可以把 master 中 save 配置項全部註釋掉,不讓它進行儲存,然後配置 slave ,讓 slave 儲存。雖然有這個特性,但是我們好像一般不這麼做。

好吧,我們做幾個例子練習一下。

先開啟三個終端,然後起三個例項,分別用三個 client 去連線它們:

zhaoguihuadediannao:src zhaogh$ ./redis-server --port 10000 --daemonize yes

zhaoguihuadediannao:src zhaogh$ 

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 10000

埠10000的做 master。

slave 01:

zhaoguihuadediannao:src zhaogh$ ./redis-server --port 10001 --daemonize yes

zhaoguihuadediannao:src zhaogh$ 

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 10001

slave 02:

zhaoguihuadediannao:src zhaogh$ ./redis-server --port 10002 --daemonize yes

zhaoguihuadediannao:src zhaogh$ 

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 10002

上面只是讓它們的例項啟動了並用客戶端去連線它,並沒有設定主從關係。在 slave 01 和 slave 02 上執行下面的命令:

127.0.0.1:10001> slaveof 127.0.0.1 10000

OK

127.0.0.1:10001> 

這樣就設定好了主從關係。我們來試試有沒有效果。

127.0.0.1:10001> get testkey001

(nil)

127.0.0.1:10001> 

這個時候是沒有值的。

master 上執行:

127.0.0.1:10000> set testkey001 testvalue001

OK

127.0.0.1:10000> 

然後看看 slave 上有沒有:

127.0.0.1:10001> get testkey001

"testvalue001"

127.0.0.1:10001> 

127.0.0.1:10002> get testkey001

"testvalue001"

127.0.0.1:10002> 

有了,是不是比***點讀機還 easy ?已經有了感性的認識,我們來介紹一下它的原理吧。

當你設定了主從關係後,slave 在第一次連線或者重新連線 master 時,slave 都會發送一條同步指令給 master ;

master 接到指令後,開始啟動後臺儲存程序儲存資料,接著收集所有的資料修改指令。後臺儲存完了,master 就把這份資料傳送給 slave,slave 先把資料儲存到磁碟,然後把它載入到記憶體中,master 接著就把收集的資料修改指令一行一行的發給 slave,slave 接收到之後重新執行該指令,這樣就實現了資料同步。

slave 在與 master 失去聯絡後,自動的重新連線。如果 master 收到了多個 slave 的同步請求,它會執行單個後臺儲存來為所有的 slave 服務。

一旦 master 和 slave 在失去聯絡並重新連線上,總是會重新進行一次完整的同步。不過從 redis 2.8 開始,只是部分重新同步也是可以的。具體請大家參考官方文件。

祝大家端午節快樂。

下一篇,redis 的叢集配置,敬請期待。