1. 程式人生 > >redis的主從切換的兩種方式

redis的主從切換的兩種方式

redis的主從(master-slave)就是為了資料冗餘備份、保證資料的安全、提高效能,在這裡主要講解一下其主從切換的兩種方式,有不對之處,還請各位指教。

  首先搭建一個簡單的master-slave,在linux下安裝編譯redis,分別複製兩份redis-master、redis-slave,修改redis.conf檔案daemonize yes,讓其在後臺執行,另外修改redis-slave下的redis.conf中port 6378 (修改埠)、slaveof 127.0.0.1 6379,指定其master。

   1.  啟動主redis: ./redis-master/src/redis-server  /redis-matser/redis.conf

        啟動客戶端: ./redis-master/src/redis.cli -p 6379

                          127.0.0.1:6379> set gender male
                           OK
                          127.0.0.1:6379> get gender
                           "male"
                           127.0.0.1:6379> 

  2. 啟動從redis:./redis-slave/src/redis-server /redis-slave/redis.conf

       啟動客戶端: ./redis-slave/src/redis-cli -p 6378

                          127.0.0.1:6378> get gender
                          "male"
                          127.0.0.1:6378> set gender
                           (error) ERR wrong number of arguments for 'set' command  //預設情況下,slave只允許讀

     到現在表示主從redis搭建完成

一、手動方式

       我們現在將主redis殺掉: ps -ef|grep redis
                        hollysp   6860     1  0 10:31 ?        00:00:02 ./redis-server *:6379       
                        hollysp   6983  6331  0 10:33 pts/1    00:00:00 ./redis-cli -p 6378
                        hollysp   8329     1  1 10:57 ?        00:00:00 ./src/redis-server *:6378    
                        hollysp   8334  1921  0 10:57 pts/0    00:00:00 grep redis

          然後:kill -9 6860

         此時:./redis-cli -p 6379
                 Could not connect to Redis at 127.0.0.1:6379: Connection refused
                  not connected>  表明主master已經結束

          而127.0.0.1:6378> set age 20
                  (error) READONLY You can't write against a read only slave.     仍然只允許讀取資料

         使用命令:127.0.0.1:6378> slaveof NO ONE
                           OK   slave變為master

                   127.0.0.1:6378> set age 20
                        OK    已經可以插入資料了

          此時切換已經完成,但是我們還需要啟動之前的主redis,但是這個時候我們已經進行過插入、刪除等操作,以前的主redis並沒有記錄這些,那麼就需要將之前從redis的dump.rdb替換之前redis 的dump.rdb檔案。

          首先進入redis-master 啟動 ./src/redis-server redis.conf

         然後127.0.0.1:6378> slaveof 127.0.0.1 6379
              OK

       表示又回到之前的狀態

二: sentinel自動方式

      sentinel就是監聽master,通過監聽其狀態,來完成主從之間的切換,  我們直接使用sentinel的預設配置,使用./src/redis-sentinel sentinel.conf  --sentinel啟動sentinel, 可以看到日誌資訊

[9866] 04 Feb 11:23:35.753 * +slave slave 127.0.0.1:6378 127.0.0.1 6378 @ mymaster 127.0.0.1 6379

現在我們kill掉主redis,觀察sentinel日誌資訊:

  [10697] 04 Feb 11:38:15.400 # +failover-end master mymaster 127.0.0.1 6379
[10697] 04 Feb 11:38:15.400 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6378
[10697] 04 Feb 11:38:15.401 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6378
[10697] 04 Feb 11:38:45.452 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6378

從redis已經自動切換成為主redis了,之前的主切換到從,此時

   127.0.0.1:6378> get age
   "20"
 127.0.0.1:6378> set hobby sleeping
  OK  

啟動之前的主redis,使用127.0.0.1:6379> set m m
                           (error) READONLY You can't write against a read only slave.  

到此全部完成。

一、Sentinel作用:
1):Master狀態檢測 
2):如果Master異常,則會進行Master-Slave切換,將其中一個Slave作為Master,將之前的Master作為Slave
3):Master-Slave切換後,master_redis.conf、slave_redis.conf和sentinel.conf的內容都會發生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換
二、Sentinel工作方式:
1):每個Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其他 Sentinel 例項傳送一個 PING 命令
2):如果一個例項(instance)距離最後一次有效回覆 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個例項會被 Sentinel 標記為主觀下線。
3):如果一個Master被標記為主觀下線,則正在監視這個Master的所有 Sentinel 要以每秒一次的頻率確認Master的確進入了主觀下線狀態。
4):當有足夠數量的 Sentinel(大於等於配置檔案指定的值)在指定的時間範圍內確認Master的確進入了主觀下線狀態, 則Master會被標記為客觀下線
5):在一般情況下, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有Master,Slave傳送 INFO 命令
6):當Master被 Sentinel 標記為客觀下線時,Sentinel 向下線的 Master 的所有 Slave 傳送 INFO 命令的頻率會從 10 秒一次改為每秒一次
7):若沒有足夠數量的 Sentinel 同意 Master 已經下線, Master 的客觀下線狀態就會被移除。 
若 Master 重新向 Sentinel 的 PING 命令返回有效回覆, Master 的主觀下線狀態就會被移除。