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 的主觀下線狀態就會被移除。