Redis Sentinel 介紹與部署 1. Sentinel介紹 1.1 主從複製的問題
Redis主從複製可將主節點資料同步給從節點,從節點此時有兩個作用: 一旦主節點宕機,從節點作為主節點的備份可以隨時頂上來。 擴充主節點的讀能力,分擔主節點讀壓力。
但是問題來了: 一旦主節點宕機,從節點晉陞成主節點,同時需要修改應用方的主節點地址,還需要命令所有從節點去複製新的主節點,整個過程需要人工幹預。 主節點的寫能力受到單機的限制。 主節點的儲存能力受到單機的限制。
第一個問題,我們接下來講的Sentinel就可以解決。而後兩個問題,Redis也給出了方案Redis Cluster。 1.2 Redis Sentinel的高可用
Redis Sentinel是一個分布式架構,包含若干個Sentinel節點和Redis資料節點,每個Sentinel節點會對資料節點和其餘Sentinel節點進行監控,當發現節點不可達時,會對節點做下線標識。
如果被標識的是主節點,他還會選擇和其他Sentinel節點進行“協商”,當大多數的Sentinel節點都認為主節點不可達時,他們會選舉出一個Sentinel節點來完成自動容錯移轉工作,同時將這個變化通知給Redis應用方。
整個過程完全自動,不需要人工介入,所以可以很好解決Redis的高可用問題。
接下來我們就通過部署一個Redis Sentinel執行個體來瞭解整體架構。 2. Redis Sentinel部署
我們部署的拓撲結構如圖所示:
分別有3個Sentinel節點,1個主節點,2個從節點群組成一個Redis Sentinel。 role IP port master 127.0.0.1 6379 slave1 127.0.0.1 6380 slave2 127.0.0.1 6381 Sentinel1 127.0.0.1 26379 Sentinel2 127.0.0.1 26380 Sentinel3 127.0.0.1 26381 2.1 啟動主節點 配置:
port 6379daemonize yeslogfile "6379.log"dbfilename "dump-6379.rdb"dir "/var/redis/data/"
1 2 3 4 5 啟動主節點
➜ sudo redis-server redis-6379.conf
1 使用PING命令檢測是否啟動
➜ redis-cli -h 127.0.0.1 -p 6379 pingPONG
1 2 2.2 啟動兩個從節點 配置(兩個從節點配置相同,除了檔案名稱有區分)
port 6380daemonize yeslogfile "6380.log"dbfilename "dump-6380.rdb"dir "/var/redis/data/" slaveof 127.0.0.1 6379 // 從屬主節點
1 2 3 4 5 6 啟動兩個從節點
➜ sudo redis-server redis-6380.conf ➜ sudo redis-server redis-6381.conf
1 2 使用PING命令檢測是否啟動
➜ redis-cli -h 127.0.0.1 -p 6380 pingPONG➜ redis-cli -h 127.0.0.1 -p 6381 pingPONG
1 2 3 4 2.3 確認主從關係 主節點視角
➜ redis-cli -h 127.0.0.1 -p 6379 INFO replication# Replicationrole:masterconnected_slaves:2slave0:ip=127.0.0.1,port=6380,state=online,offset=85,lag=0slave1:ip=127.0.0.1,port=6381,state=online,offset=85,lag=0......
1 2 3 4 5 6 7 從節點視角(6380連接埠)
➜ redis-cli -h 127.0.0.1 -p 6380 INFO replication# Replicationrole:slavemaster_host:127.0.0.1master_port:6379master_link_status:up......
1 2 3 4 5 6 7
確立中從關係,如下圖所示:
2.4 部署Sentinel節點
3個Sentinel節點的部署方法是相同的(連接埠不同)。以26379為例。 配置
// Sentinel節點的連接埠port 26379 dir /var/redis/data/logfile "26379.log"// 當前Sentinel節點監控 127.0.0.1:6379 這個主節點// 2代表判斷主節點失敗至少需要2個Sentinel節點節點同意// mymaster是主節點的別名sentinel monitor mymaster 127.0.0.1 6379 2//每個Sentinel節點都要定期PING命令來判斷Redis資料節點和其餘Sentinel節點是否可達,如果超過30000毫秒且沒有回複,則判定不可達sentinel down-after-milliseconds mymaster 30000//當Sentinel節點集合對主節點故障判定達成一致時,Sentinel領導者節點會做容錯移轉操作,選出新的主節點,原來的從節點會向新的主節點發起複製操作,限制每次向新的主節點發起複製操作的從節點個數為1sentinel parallel-syncs mymaster 1//容錯移轉逾時時間為180000毫秒sentinel failover-timeout mymaster 180000
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 啟動(兩種方法)
redis-sentinel sentinel-26379.conf redis-server sentinel-26379.conf --sentinel
sudo redis-sentinel sentinel-26379.conf --sentinel
1 確認
➜ redis-cli -h 127.0.0.1 -p 26379 INFO Sentinel# Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=1 //sentinels=1表示啟動了1個Sentinel
1 2 3 4 5 6 7 8
部署三個Sentinel節點之後,真箇拓撲結構如圖所示:
當部署號Redis Sentinel之後,會有如下變化
Sentinel節點自動探索了從節點、其餘Sentinel節點。 去掉了預設配置,例如:parallel-syncs、failover-timeout。 新添加了紀元(epoch)參數。
我們拿連接埠26379的舉例,啟動所有的Sentinel和資料節點後,設定檔如下:
port 26379dir "/var/redis/data"sentinel myid 70a3e215c1a34b4d9925d170d9606e615a8874f2sentinel monitor mymaster 127.0.0.1 6379 2sentinel config-epoch mymaster 0sentinel leader-epoch mymaster 0daemonize yeslogfile "26379.log"// 發現了兩個從節點sentinel known-slave mymaster 127.0.0.1 6381sentinel known-slave mymaster 127.0.0.1 6380// 發送了連個Sentinel節點sentinel known-sentinel mymaster 127.0.0.1 26381 e1148ad6caf60302dd6d0dbd693cb3448e209ac2sentinel known-sentinel mymaster 127.0.0.1 26380 39db5b040b21a52da5334dd2d798244c034b4fc3sentinel current-epoch 0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 2.5 容錯移轉實驗
先查看一下節點的進程pid
➜ ps -aux | grep redisroot 18225 0.1 0.0 40208 11212 ? Ssl 22:10 0:05 redis-server 127.0.0.1:6379root 18234 0.0 0.0 38160 8364 ? Ssl 22:10 0:04 redis-server 127.0.0.1:6380root 18244 0.0 0.0 38160 8308 ? Ssl 22:10 0:04 redis-server 127.0.0.1:6381root 20568 0.1 0.0 38160 8460 ? Ssl 23:05 0:02 redis-sentinel *:26379 [sentinel]root 20655 0.1 0.0 38160 8296 ? Ssl 23:07 0:02 redis-sentinel *:26380 [sentinel]root 20664 0.1 0.0 38160 8312 ? Ssl 23:07 0:02 redis-sentinel *:26381 [sentinel]
1 2 3 4 5 6 7
我們幹掉連接埠6379的主節點。
➜ sudo kill -9 18225➜ ps -aux | grep redisroot 18234 0.0 0.0 38160 8364 ? Ssl 22:10 0:05 redis-server 127.0.0.1:6380root 18244 0.0 0.0 38160 8308 ? Ssl 22:10 0:05 redis-server 127.0.0.1:6381root 20568 0.1 0.0 38160 8460 ? Ssl 23:05 0:03 redis-sentinel *:26379 [sentinel]root 20655 0.1 0.0 38160 8296 ? Ssl 23:07 0:03 redis-sentinel *:26380 [sentinel]root 20664 0.1 0.0 38160 8312 ? Ssl 23:07 0:03 redis-sentinel *:26381 [sentinel]
1 2 3 4 5 6 7
此時,Redis Sentinel對主節點進行客觀下線(Objectively Down, 簡稱 ODOWN)的判斷,確認主節點不可達,則通知從節點中止複製主節點的操作。
當主節點下線時間長度超過配置的下線時間長度30000秒,Redis Sentinel執行容錯移轉操作。
此時,我們查看一下Sentinel節點監控的主節點資訊:
127.0.0.1:26379> sentinel masters 1) 1) "name" 2) "mymaster" 3) "ip" 4) "127.0.0.1" 5) "port" 6) "6380" //可以看到主節點已經成為6380連接埠的節點 7) "runid" 8) "084850ab4ff6c2f2502b185c8eab5bdd25a26ce2" 9) "flags" 10) "master" ..............
1 2 3 4 5 6 7 8 9 10 11 12
看一下Sentinel節點監控的從節點資訊:
127.0.0.1:26379> sentinel slaves mymaster1) 1) "name" 2) "127.0.0.1:6379" //ip:port 3) "ip" 4) "127.0.0.1" 5) "port" 6) "6379" 7) "runid" 8) "" 9) "flags" 10) "s_down,slave,disconnected" //連接埠6379的原主節點已經斷開了串連 ..............2) 1) "name" 2) "127.0.0.1:6381" 3) "ip" 4) "127.0.0.1" 5) "port" 6) "6381" 7) "runid" 8) "24495fe180e4fd64ac47467e0b2652894406e9e4" 9) "flags" 10) "slave" //本來的從節點,還是從節點的role ..............
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
由以上資訊可得,連接埠為6380的Redis資料節點成為新的主節點,連接埠為6379的舊主節點中斷連線。如圖所示:
我們在試著重啟連接埠6379的資料節點。
➜ sudo redis-server redis-6379.conf ➜ ps -aux | grep redis root 18234 0.1 0.0 40208 11392 ? Ssl 5月22 0:06 redis-server 127.0.0.1:6380root 18244 0.1 0.0 40208 10356 ? Ssl 5月22 0:07 redis-server 127.0.0.1:6381root 20568 0.1 0.0 38160 8460 ? Ssl 5月22 0:05 redis-sentinel *:26379 [sentinel]root 20655 0.1 0.0 38160 8296 ? Ssl 5月22 0:05 redis-sentinel *:26380 [sentinel]root 20664 0.1 0.0 38160 8312 ? Ssl 5月22 0:05 redis-sentinel *:26381 [sentinel]menwen 22475 0.0 0.0 14216 5920 pts/2 S+ 5月22 0:00 redis-cli -p 26379// 6379的資料節點已重啟root 22617 0.0 0.0 38160 8304 ? Ssl 00:00 0:00 redis-server 127.0.0.1:6379
1 2 3 4 5 6 7 8 9 10
看看發生什麼:
127.0.0.1:26379> sentinel slaves mymaster1) 1) "name" 2) "127.0.0.1:6379" //6379連接埠的節點重啟後,變成了"活"的從節點 3) "ip" 4) "127.0.0.1" 5) "port" 6) "6379" 7) "runid" 8) "de1b5c28483cf150d9550f8e338886706e952346" 9) "flags" 10) "slave" ..............2) 1) "name" //6381連接埠的節點沒有變化,仍是從節點 2) "127.0.0.1:6381" ..............
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
他被降級成為連接埠6380的從節點。
從上面的邏輯架構和容錯移轉實驗中,可以看出Redis Sentinel的以下幾個功能。 監控:Sentinel節點會定期檢測Redis資料節點和其餘Sentinel節點是否可達。 通知:Sentinel節點會將容錯移轉通知給應用方。 主節點容錯移轉:實現從節點晉陞為主節點並維護後續正確的主從關係。 配置提供者:在Redis Sentinel結構中,用戶端在初始化的時候串連的是Sentinel節點集合,從中擷取主節點資訊。 3. Sentinel配置說明
sentinel monitor mymaster 127.0.0.1 6379 2 當前Sentinel節點監控 127.0.0.1:6379 這個主節點 2代表判斷主節點失敗至少需要2個Sentinel節點節點同意 mymaster是主節點的別名
sentinel down-after-milliseconds mymaster 30000 每個Sentinel節點都要定期PING命令來判斷Redis資料節點和其餘Sentinel節點是否可達,如果超過30000毫秒且沒有回複,則判定不可達
sentinel parallel-syncs mymaster 1 當Sentinel節點集合對主節點故障判定達成一致時,Sentinel領導者節點會做容錯移轉操作,選出新的主節點,原來的從節點會向新的主節點發起複製操作,限制每次向新的主節點發起複製操作的從節點個數為1。
sentinel failover-timeout mymaster 180000 容錯移轉逾時時間為180000 sentinel auth-pass \ \
如果Sentinel監控的主節點配置了密碼,可以通過sentinel auth-pass配置通過添加主節點的密碼,防止Sentinel節點無法對主節點進行監控。 例如:sentinel auth-pass mymaster MySUPER--secret-0123passw0rd sentinel notification-script \ \
在容錯移轉期間,當一些警告層級的Sentinel事件發生(指重要事件,如主觀下線,客觀下線等)時,會觸發對應路徑的指令碼,想指令碼發送相應的事件參數。 例如:sentinel notification-script mymaster /var/redis/notify.sh sentinel client-reconfig-script \ \
在容錯移轉結束後,觸發應對路徑的指令碼,並向指令碼發送容錯移轉結果的參數。 例如:sentinel client-reconfig-script mymaster /var/redis/reconfig.sh。