高效能網站架構設計之快取篇(4)- Redis 主從複製
Redis 的主從複製配置非常容易,但我們先來了解一下它的一些特性。
- redis 使用非同步複製。從 redis 2.8 開始,slave 也會週期性的告訴 master 現在的資料量。可能只是個機制,用途應該不大。
-
一個 master 可以擁有多個 slave,廢話,這也是業界的標配吧。
-
slave 可以接收來自其他 slave 的連線。意思是不是就是說 slave 在接收其他的slave的連線之後成為 master ?等下我們來驗證。
- redis 複製在 master 這一端是非阻塞的,也就是說在和 slave 同步資料的時候,master 仍然可以執行客戶端的操作命令而不受其影響。這點都不能保證,要你幹嘛?
- redis 複製在 slave 這一端也是非阻塞的。在配置檔案裡面有 slave-serve-stale-data 這一項,如果它為 yes ,slave 在執行同步時,它可以使用老版本的資料來處理查詢請求,如果是 no ,slave 將返回一個錯誤。在完成同步後,slave 需要刪除老資料,載入新資料,在這個階段,slave 會阻止連線進來。
-
Replication can be used both for scalability, in order to have multiple slaves for read-only queries (for example, heavy
- 使用複製可以避免 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 的叢集配置,敬請期待。