Redis 學習筆記(十三)Redis Sentinel 介紹與部署_redis

來源:互聯網
上載者:User
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。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.