Redis Sentinel 模擬故障遷移

什么是redis sentinel

參考文檔:https://redis.io/topics/sentinel?

簡單的來說,就是Redis Sentinel 為redis 提供高可用性,主要體現在下面幾個方面:
1.監控:redis sentinel會不間斷的監控主服務器和從服務器是否正常工作
2.通知:當出現問題時,sentinel可以通過API通知系統管理員以及另外的服務器
3.自動故障轉移:如果主服務器出現故障,sentinel可以啟動故障轉移,將其中一臺從服務器升級為主服務器,其他的從服務器會重新配置為新主服務器 4.提供配置:sentinel充當客戶端發現權限來源,客戶端連接到sentinel詢問負責給定服務器當前redis主服務器地址,如果發生故障,sentinel將報告新地址

redis sentinel 模擬環境

模擬環境為:1主2從

?========redis=================sentinel==========

master:127.0.0.1 6379       127.0.0.1 26379
slave1:127.0.0.1 6380       127.0.0.1 26380
slave2:127.0.0.1 6381       127.0.0.1 26381

環境搭建

redis.conf配置

6379

# cat redis-6379.conf | grep -Ev "^$|^#"
bind 127.0.0.1
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/root/redis/redis-6379.log"
dbfilename dump-6379.rdb
dir /root/redis
...
#

6380

# cat redis-6380.conf | grep -Ev "^$|^#"
bind 127.0.0.1
port 6380
daemonize yes
pidfile /var/run/redis_6380.pid
logfile "/root/redis/redis-6380.log"
dbfilename dump-6380.rdb
dir /root/redis
...
#

6381

# cat redis-6381.conf | grep -Ev "^$|^#"
bind 127.0.0.1
port 6381
daemonize yes
pidfile /var/run/redis_6381.pid
logfile "/root/redis/redis-6381.log"
dbfilename dump-6381.rdb
dir /root/redis
...
#

sentinel.conf配置

6379/6380/6381

# cat sentinel-*.conf | grep -Ev "^#|^$"
port 26379
daemonize yes
logfile "/root/redis/sentinel-6379.log"
dir "/tmp"
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
#

啟動redis server 和 sentinel

redis:
# redis-server /etc/redis_6379.conf
# redis-server /etc/redis_6380.conf
# redis-server /etc/redis_6381.confsentinel:
# redis-sentinel /etc/sentinel-6379.conf
# redis-sentinel /etc/sentinel-6380.conf
# redis-sentinel /etc/sentinel-6381.conf

配置主從復制

# redis-cli -p 6380
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6380> exit# redis-cli -p 6381
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379
OK 
127.0.0.1:6381> exit

模擬故障遷移?

首先,kill 掉redis master進程?

# for n in `ps aux | grep redis-server | grep 6379 | awk '{print $2}'`;do kill -9 $n  ;done;

分析log

首先,redis 從服務器首先發現redis master 服務器無法連接,報錯如下:
# tail -F redis-63*.log
==> redis-6380.log <==
2851:S 13 Nov 14:48:54.235 # Connection with master lost.
2851:S 13 Nov 14:48:54.235 * Caching the disconnected master state.==> redis-6381.log <==
3695:S 13 Nov 14:48:54.466 * Connecting to MASTER 127.0.0.1:6379
3695:S 13 Nov 14:48:54.466 * MASTER <-> SLAVE sync started
3695:S 13 Nov 14:48:54.467 # Error condition on socket for SYNC: Connection refused==> redis-6380.log <==
2851:S 13 Nov 14:48:54.781 * Connecting to MASTER 127.0.0.1:6379
2851:S 13 Nov 14:48:54.782 * MASTER <-> SLAVE sync started
2851:S 13 Nov 14:48:54.782 # Error condition on socket for SYNC: Connection refused
...
緊接著,redis sentinel 完成故障切換,從log來看,當6379主節點掛了之后,redis重新提了一個從節點6380為主節點,log 如下:?
# tail -F sentinel-63*.log
==> sentinel-6379.log <==
3225:X 13 Nov 14:49:24.322 # +sdown master mymaster 127.0.0.1 6379==> sentinel-6381.log <==
3235:X 13 Nov 14:49:24.327 # +sdown master mymaster 127.0.0.1 6379==> sentinel-6380.log <==
3230:X 13 Nov 14:49:24.332 # +sdown master mymaster 127.0.0.1 6379==> sentinel-6381.log <==
3235:X 13 Nov 14:49:24.386 # +odown master mymaster 127.0.0.1 6379 #quorum 2/2
3235:X 13 Nov 14:49:24.386 # +new-epoch 1
3235:X 13 Nov 14:49:24.386 # +try-failover master mymaster 127.0.0.1 6379==> sentinel-6380.log <==
3230:X 13 Nov 14:49:24.388 # +odown master mymaster 127.0.0.1 6379 #quorum 3/2
3230:X 13 Nov 14:49:24.388 # +new-epoch 1
3230:X 13 Nov 14:49:24.388 # +try-failover master mymaster 127.0.0.1 6379==> sentinel-6381.log <==
3235:X 13 Nov 14:49:24.409 # +vote-for-leader 06f94705a99df53e468af594737913ce7c6287d5 1==> sentinel-6380.log <==
3230:X 13 Nov 14:49:24.416 # +vote-for-leader 858e250193e7f985bd7d63569a158f52a9cb9e0c 1==> sentinel-6381.log <==
3235:X 13 Nov 14:49:24.416 # 858e250193e7f985bd7d63569a158f52a9cb9e0c voted for 858e250193e7f985bd7d63569a158f52a9cb9e0c 1==> sentinel-6380.log <==
3230:X 13 Nov 14:49:24.417 # 06f94705a99df53e468af594737913ce7c6287d5 voted for 06f94705a99df53e468af594737913ce7c6287d5 1==> sentinel-6379.log <==
3225:X 13 Nov 14:49:24.422 # +new-epoch 1
3225:X 13 Nov 14:49:24.432 # +vote-for-leader 06f94705a99df53e468af594737913ce7c6287d5 1==> sentinel-6381.log <==
3235:X 13 Nov 14:49:24.432 # d0e6638165ba8f8186562da586f4e0789dd4abd1 voted for 06f94705a99df53e468af594737913ce7c6287d5 1==> sentinel-6380.log <==
3230:X 13 Nov 14:49:24.432 # d0e6638165ba8f8186562da586f4e0789dd4abd1 voted for 06f94705a99df53e468af594737913ce7c6287d5 1==> sentinel-6381.log <==
3235:X 13 Nov 14:49:24.468 # +elected-leader master mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:24.468 # +failover-state-select-slave master mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:24.545 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:24.545 * +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:24.608 * +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:25.295 # +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:25.295 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:25.345 * +slave-reconf-sent slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379==> sentinel-6379.log <==
3225:X 13 Nov 14:49:25.345 # +config-update-from sentinel 06f94705a99df53e468af594737913ce7c6287d5 127.0.0.1 26381 @ mymaster 127.0.0.1 6379
3225:X 13 Nov 14:49:25.345 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380
3225:X 13 Nov 14:49:25.345 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
3225:X 13 Nov 14:49:25.345 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380==> sentinel-6380.log <==
3230:X 13 Nov 14:49:25.346 # +config-update-from sentinel 06f94705a99df53e468af594737913ce7c6287d5 127.0.0.1 26381 @ mymaster 127.0.0.1 6379
3230:X 13 Nov 14:49:25.346 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380
3230:X 13 Nov 14:49:25.346 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
3230:X 13 Nov 14:49:25.346 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380==> sentinel-6381.log <==
3235:X 13 Nov 14:49:25.561 # -odown master mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:25.814 * +slave-reconf-inprog slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:26.893 * +slave-reconf-done slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:26.954 # +failover-end master mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:26.954 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380
3235:X 13 Nov 14:49:26.955 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
3235:X 13 Nov 14:49:26.955 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380==> sentinel-6379.log <==
3225:X 13 Nov 14:49:55.349 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380==> sentinel-6380.log <==
3230:X 13 Nov 14:49:55.397 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380==> sentinel-6381.log <==
3235:X 13 Nov 14:49:57.014 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
再返回過來看redis server的log,此時可以看到6381為從節點已經向主節點6380請求并且完成了復制操作
==> redis-6380.log <==
2851:M 13 Nov 14:49:25.823 * Slave 127.0.0.1:6381 asks for synchronization
2851:M 13 Nov 14:49:25.823 * Partial resynchronization request from 127.0.0.1:6381 accepted. Sending 422 bytes of backlog starting from offset 124407.==> redis-6381.log <==
3695:S 13 Nov 14:49:25.823 * Successful partial resynchronization with master.
3695:S 13 Nov 14:49:25.823 # Master replication ID changed to 0288d040464ebccbb56dc56d54455434a406bcb2
3695:S 13 Nov 14:49:25.823 * MASTER <-> SLAVE sync: Master accepted a Partial Resynchronization.

當我們再啟動6379服務器時,sentinel會讓6379成為從庫并且連接6380服務器,log如下:?

啟動6379服務器
# redis-server /root/redis/redis-6379.conf# tail -F sentinel-63*.log
...
==> sentinel-6379.log <==
3225:X 13 Nov 16:05:00.384 * +convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
...# tail -F redis-63*.log
...
==> redis-6379.log <==
7493:S 13 Nov 16:05:00.566 * MASTER <-> SLAVE sync: receiving 194 bytes from master
7493:S 13 Nov 16:05:00.566 * MASTER <-> SLAVE sync: Flushing old data
7493:S 13 Nov 16:05:00.566 * MASTER <-> SLAVE sync: Loading DB in memory
7493:S 13 Nov 16:05:00.566 * MASTER <-> SLAVE sync: Finished with success==> redis-6381.log <==
3695:S 13 Nov 16:05:36.467 * 1 changes in 900 seconds. Saving...
3695:S 13 Nov 16:05:36.468 * Background saving started by pid 7519
7519:C 13 Nov 16:05:36.486 * DB saved on disk
7519:C 13 Nov 16:05:36.487 * RDB: 8 MB of memory used by copy-on-write
3695:S 13 Nov 16:05:36.569 * Background saving terminated with success
...

未完待續。。。

?

轉載于:https://www.cnblogs.com/wang-li/p/9955303.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537497.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537497.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537497.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python2中文輸出代碼_解決vscode python print 輸出窗口中文亂碼的問題

解決vscode python print 輸出窗口中文亂碼的問題 發布時間&#xff1a;2020-09-17 23:53:25 來源&#xff1a;腳本之家 閱讀&#xff1a;119 一、搭建 python 環境 在 VSC 中點擊 F1 鍵&#xff0c;彈出控制臺&#xff0c;輸入 ext install 界面左側彈出擴展窗格&#xff0c;輸…

十二贊日志收集與報警系統一覽

先快速介紹一下十二贊的日志收集系統&#xff1a;十二贊的日志收集系統&#xff0c;分為兩塊&#xff0c;一塊是線上系統的各種報錯、異常的日志收集&#xff0c;主要是各種線上代碼運行期間產生&#xff0c;我們稱之為log-collect&#xff0c;一塊是用戶行為操作的日志收集&am…

招標投標法(摘錄)

黑色&#xff1a;原文 紅色&#xff1a;重點 藍色&#xff1a;博主批注 第三條 在中華人民共和國境內進行下列工程建設項目&#xff1a; &#xff08;一〉大型基礎設施、公用事業等關系社會公共利益、公眾安全的項目&#xff1b; &#xff08; 二〉全部或者部分使用國有資…

erp生產管理系統流程_企業生產管理好幫手——ERP智能管理系統

ERP企業管理軟件是為企業決策層及員工提供決策運行手段的管理平臺。在生產制造制造業中&#xff0c;盡管加工早已用于機械自動化&#xff0c;但在倉庫管理、人工管理工作&#xff0c;還必須erp公司智能管理系統協助管理方法。erp公司管理軟件是公司供應鏈管理的綜合性管理軟件&…

神經網絡的基本工作原理

神經網絡的基本工作原理 一、總結 一句話總結&#xff1a;先給一個初始值&#xff0c;然后依賴正確值&#xff08;真實值&#xff09;進行修復模型&#xff08;訓練模型&#xff09;&#xff0c;直到模型和真實值的誤差可接受 初始值 真實值 修復模型 1、神經網絡由基本的神經元…

政府采購法(摘錄)

黑色&#xff1a;原文 紅色&#xff1a;重點 藍色&#xff1a;博主批注 第七條 政府采購實行集中采購和分散采購相結合。集中采購的范圍由省級以上人民政府公布的集中采用目錄確定。 屬于中央預算的政府采用項目&#xff0c;其集中采用目錄由國務院確定并公布&#xff1b;屬…

jsonrpc aria2_拋棄迅雷,Aria2 新手入門

迅雷已經用了 10 年&#xff0c;一直把它看作是速度最快也最方便的下載工具。迅雷會員也是我必續的服務。但&#xff0c;迅雷墮落了。thunder: 迅雷專屬鏈接越來越少&#xff0c;基本都是磁力、BT 的天下迅雷會員加速不再給力&#xff0c;大量資源速度為 0。會員雖然還有一年多…

《招標投標法》和《招標投標實施條例》有什么關系?

招投標法是1999年頒布2000年正式執行的我國第一部關于招投標方面的法律&#xff0c;對我國的招投標起到指導性作用&#xff0c;而實施條例是于2012年2月1日正式執行的法律法規&#xff0c;是根據招投標法頒布10年以來一些不足做了進一步的補充和說明&#xff0c;更具有可操作性…

pytorch 測試每一類_2D-UNet腦膠質瘤分割BraTs + Pytorch實現

2D-UNet講解玖零猴&#xff1a;U-Net與FCN的區別醫學表現網絡詳解創新?zhuanlan.zhihu.comBraTs數據準備數據來源本文用的訓練集和驗證集均來自BraTs2018的訓練集(其中HGG:210個病人,LGG:75個病人)但由于BraTs只公開訓練集數據,沒有測試集數據,如果在訓練集中再拆一部分用來作…

電商必備6款商品詳情數據采集,一鍵批量下載淘貓拼和1688寶貝信息和鏈接!

當我們分析競品以及選款復制時&#xff0c;往往需要先將商品信息采集下載下來&#xff0c;然而一個個去尋找商品并手動下載&#xff0c;顯然是不現實的。 特別是做無貨源店群的賣家&#xff0c;可能需要在不同平臺采集商品信息&#xff0c;那么就需要用到適用不同平臺的商品采…

合同法摘錄

黑色&#xff1a;原文 紅色&#xff1a;重點 藍色&#xff1a;博主批注 第十條 當事人訂立合同&#xff0c;有書面形式、口頭形式和其他形式 。 &#xff08;口頭形式和其他形式&#xff0c;沒聽過吧&#xff09; 第十一條 書面形式是指合同書、信件和數據電文&#xff0…

vue.js的項目實戰

歡迎大家前往騰訊云社區&#xff0c;獲取更多騰訊海量技術實踐干貨哦~ 本文由蔡述雄發表于云社區專欄 需求背景 組件庫是做UI和前端日常需求中經常用到的&#xff0c;把一個按鈕&#xff0c;導航&#xff0c;列表之類的元素封裝起來&#xff0c;方便日常使用&#xff0c;調用方…

c++ 輸出二進制_Python入門3print格式化輸出的幾種方法

接《Python入門2》print格式化輸出的幾種方法⒂格式化輸出舉例【例】str_name"小明"num_age15print("我叫%s&#xff0c;今年%d歲"%(str_name,num_age))#注意print的前后兩部分用%間隔&#xff0c;不是逗號&#xff0c;后面的輸出列表加小括號【例】str&qu…

著作權法(摘錄)

黑色&#xff1a;原文 紅色&#xff1a;重點 藍色&#xff1a;博主批注 第十二條 改編、翻譯、注釋、整理己有作品而產生的作品&#xff0c;其著性權由改編、翻譯、注釋、整理人享有&#xff0c;但行使著作權時不得侵犯原作品 的著作權。 &#xff08;天下文章一大抄,看你…

判斷瀏覽器是否為IE和版本

var isIE8 false; var isIE9 false; var isIE10 false; isIE8 !!navigator.userAgent.match(/MSIE 8.0/); isIE9 !!navigator.userAgent.match(/MSIE 9.0/); isIE10 !!navigator.userAgent.match(/MSIE 10.0/); //判斷當前瀏覽器版本是否符合&#xff0c;符合為true轉載于…

485串口測試工具軟件下載_串口調試助手詳細講解(結合實操),通訊問題不再是問題...

經常會有學員問我&#xff0c;老師老師&#xff0c;我的plc和變頻器通訊不上了&#xff0c;不知道什么原因&#xff0c;您能幫我看看么。其實吧&#xff0c;這個一般遠程是幫不上你什么的&#xff0c;還是要你自己去測試&#xff0c;找出問題&#xff0c;那么怎么測試呢&#x…

img標簽里的value獲取

簡單描述&#xff1a;在img標簽里的value存放了需要用到的值&#xff0c;但是在js中獲取的時候&#xff0c;我直接寫的就是$("#imgStr").val(),結果發現是空&#xff0c;后來查了一下&#xff0c;才知道&#xff0c;img的value需要使用attr來獲取 代碼&#xff1a; /…

pycharm快捷鍵_春節快結束了回單位途中總結下pycharm快捷鍵

一、編輯(Editing)CtrlSpace 基本的代碼完成(類、方法、屬性)CtrlAltSpace 快速導入任意類 CtrlShiftEnter 語句完成CtrlP 參數信息(在方法中調用參數)CtrlQ 快速查看文檔F1 Web幫助文檔主頁ShiftF1 選中對象的Web幫助文檔Ctrl懸浮/單機鼠標左鍵 簡介/進入代碼定義CtrlZ 撤銷上…

掙值管理名詞(EV、AC、PV等)與公式詳解

概念 PV PLaned&#xff0c;計劃&#xff0c;Value&#xff0c;數值&#xff0c;計劃值&#xff0c;是指項目實施過程中某階段計劃要求完成的工作量所需的預算工時&#xff08;或費用&#xff09;。 是反應計劃&#xff0c;不是反映應消耗的工時或費用。 PVBCWS計劃工作量*…