天天看點

redis的主從複制 讀寫分離 主從切換

當資料量變得龐大的時候,讀寫分離還是很有必要的。同時避免一個redis服務當機,導緻應用當機的情況,我們啟用sentinel(哨兵)服務,實作主從切換的功能。

redis提供了一個master,多個slave的服務。

準備三個redis服務,依次命名檔案夾子master,slave1,slave2.這裡為在測試機上,不幹擾原來的redis服務,我們master使用6000端口。

配置檔案(redis.conf)

master配置修改端口:

slave1修改配置:

 

<code>port 6001</code>

<code>slaveof 127.0.0.1 6000</code>

<code>masterauth 123456</code>

<code>requirepass 123456</code>

  

slave2修改配置:  

<code>port 6002</code>

requirepass是認證密碼,應該之後要作主從切換,是以建議所有的密碼都一緻, masterauth是從機對主機驗證時,所需的密碼。(即主機的requirepass)

啟動主機

<code>redis-server redis.conf  </code>

啟動從機:

輸入:

可以看到主從機的redis已經相應啟動。

我們來驗證下 主從複制。

master:

<code>[root@localhost master]</code><code># redis-cli -p 6000</code>

<code>127.0.0.1:6000&gt; auth 123456</code>

<code>OK</code>

<code>127.0.0.1:6000&gt; </code><code>set</code> <code>test</code> <code>chenqm</code>

slave1:

<code>[root@localhost slave2]</code><code># redis-cli -p 6001</code>

<code>127.0.0.1:6001&gt; auth 123456</code>

<code>127.0.0.1:6001&gt; get </code><code>test</code>

<code>"chenqm"</code>

slave2:

<code>[root@localhost slave2]</code><code># redis-cli -p 6002</code>

<code>127.0.0.1:6002&gt; auth 123456</code>

<code>127.0.0.1:6002&gt; get </code><code>test</code>

可以看到主機執行寫指令,從機能同步主機的值,主從複制,讀寫分離就實作了。

但是萬一主機挂了怎麼辦,這是個麻煩事情,是以redis提供了一個sentinel(哨兵),以此來實作主從切換的功能,類似與zookeeper.

我們配置兩個sentinel程序:

<code>port 26379</code>

<code>sentinel monitor mymaster 127.0.0.1 6000 2</code>

<code>&lt;br&gt;sentinel auth-pass mymaster 123456</code>

<code>vi</code> <code>sentinel.conf</code>

<code>port 26479</code>

<code>sentinel auth-pass mymaster 123456</code>

啟動sentinel服務(到對應的目錄執行相應的指令):

<code>redis-server sentinel.conf --sentinel</code>

檢視日志:

從對應的日志觀察到,一個master服務,兩個slave服務

我們現在來kill master程序

<code>[root@localhost slave1]</code><code># ps -ef|grep redis</code>

<code>root      6960     1  0 19:29 ?        00:00:02 redis-server *:6000   </code>

<code>root      6968     1  0 19:30 ?        00:00:01 redis-server *:6001    </code>

<code>root      6975     1  0 19:30 ?        00:00:01 redis-server *:6002    </code>

<code>root      7014  6570  0 19:42 pts</code><code>/0</code>    <code>00:00:01 redis-server *:26479                </code>

<code>root      7017  6789  0 19:42 pts</code><code>/5</code>    <code>00:00:01 redis-server *:26379                </code>

<code>root      7021  6729  0 19:46 pts</code><code>/3</code>    <code>00:00:00 </code><code>grep</code> <code>redis</code>

<code>[root@localhost slave1]</code><code># kill -9 6960</code>

 我們觀察日志:

<code>[7014] 11 Jan 19:43:41.463 </code><code># +sdown master mymaster 127.0.0.1 6000</code>

<code>[7014] 11 Jan 19:46:42.379 </code><code># +switch-master mymaster 127.0.0.1 6000 127.0.0.1 6001</code>

 master切換了,當6000端口的這個服務重新開機的時候,他會變成6001端口服務的slave。

  因為sentinel在切換master的時候,把對應的sentinel.conf和redis.conf檔案的配置修改。

期間我們還需要關注的一個問題:sentinel服務本身也不是萬能的,也會當機,是以我們還得部署sentinel叢集,象我這樣多啟動幾個sentinel。

關注這個配置:

<code>sentinel monitor mymaster 127.0.0.1 6000 2&lt;br&gt;&lt;br&gt;&lt;br&gt;這個後面的數字2,是指當有兩個及以上的sentinel服務檢測到master當機,才會去執行主從切換的功能。</code>

<code></code>

本文轉自 藍葉子Sheep 51CTO部落格,原文連結:http://blog.51cto.com/dellinger/1960069,如需轉載請自行聯系原作者

繼續閱讀