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 SORT operations can be offloaded to slaves), or simply for data redundancy.這句話我也沒理解什么意思。
- 使用復制可以避免 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 的集群配置,敬請期待。