高性能網站架構設計之緩存篇(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 的集群配置,敬請期待。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM