新聞中心
Redis Sentinel是Redis官方推薦的高可用性(HA)解決方案,當用Redis做Master-slave的高可用方案時,假如master宕機了,Redis本身(包括它的很多客戶端)都沒有實現(xiàn)自動進行主備切換,而Redis-sentinel本身也是一個獨立運行的進程,它能監(jiān)控多個master-slave集群,發(fā)現(xiàn)master宕機后能進行自懂切換。

創(chuàng)新互聯(lián)長期為上千家客戶提供的網站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網生態(tài)環(huán)境。為獲嘉企業(yè)提供專業(yè)的成都網站設計、網站建設,獲嘉網站改版等技術服務。擁有10年豐富建站經驗和眾多成功案例,為您定制開發(fā)。
1. Redis主從配置
1.1. 設置主從復制
Master
10.24.6.5:6379
1.2. 取消主從復制
1.3. 刪除所有數(shù)據(jù)
flushdb:刪除這個db下的。flushall:刪除所有
2. Sentinel高可用配置
Sentinel服務器地址:
10.24.6.7
啟動
Redis-sentinel sentinel.conf
或者
Redis-server sentinel.conf –sentinel
Redis服務器:
Master
10.24.6.5:6379
10.24.6.4:6379
10.24.6.6:6379
2.1. Sentinel客戶端:
2.1.1. Redis-DeskopMaster
2.1.2. Redis-cli
2.2. 查看Sentinel(info)
2.3. 添加redis sentinel
有兩種方式,一種是通過配置文件,如何配置參考附錄的sentinel.conf。這種方式主要是面向預配置的redis群集。
另外一種方式使用redis-cli做熱配置:
127.0.0.1:26381> sentinel monitor mymaster 172.18.18.207 6501 1 OK
命令的格式如下:
SENTINEL MONITOR
注:quorum表示發(fā)起failover需要的sentinel數(shù)量,看sentinel群集的數(shù)量決定。
2.4. 刪除redis sentinel
從sentinel中刪除群集,命令: 172.18.18.207:26381> sentinel remove mymaster OK
2.5. Sentinel高可用管理
2.5.1. 查看所有master
2.5.2. 查看master的slave
2.6. Sentinel高可用客戶端選擇服務
from* redis.sentinel* import* Sentinelsentinel = Sentinel([(*‘10.24.6.7’****,** 26379*)], socket_timeout=0.1)master = sentinel.master_for(******’10.24.6.5master’******, socket_timeout=0.1)print mastermaster.set(*‘foo’****,** ‘bar’*)print master.get(*‘foo’******)**
2.7. Sentinel高可用性原理
首先解釋2個名詞:SDOWN和ODOWN.
- SDOWN:subjectively down,直接翻譯的為"主觀"失效,即當前sentinel實例認為某個redis服務為"不可用"狀態(tài).
- ODOWN:objectively down,直接翻譯為"客觀"失效,即多個sentinel實例都認為master處于"SDOWN"狀態(tài),那么此時master將處于ODOWN,ODOWN可以簡單理解為master已經被集群確定為"不可用",將會開啟failover.
SDOWN適合于master和slave,但是ODOWN只會使用于master;當slave失效超過"down-after-milliseconds"后,那么所有sentinel實例都會將其標記為"SDOWN".
\1) SDOWN與ODOWN轉換過程:
- 每個sentinel實例在啟動后,都會和已知的slaves/master以及其他sentinels建立TCP連接,并周期性發(fā)送PING(默認為1秒)
- 在交互中,如果redis-server無法在"down-after-milliseconds"時間內響應或者響應錯誤信息,都會被認為此redis-server處于SDOWN狀態(tài).
- 如果2)中SDOWN的server為master,那么此時sentinel實例將會向其他sentinel間歇性(一秒)發(fā)送"is-master-down-by-addr
"指令并獲取響應信息,如果足夠多的sentinel實例檢測到master處于SDOWN,那么此時當前sentinel實例標記master為ODOWN...其他sentinel實例做同樣的交互操作.配置項"sentinel monitor
",如果檢測到master處于SDOWN狀態(tài)的slave個數(shù)達到
,那么此時此sentinel實例將會認為master處于ODOWN. - 每個sentinel實例將會間歇性(10秒)向master和slaves發(fā)送"INFO"指令,如果master失效且沒有新master選出時,每1秒發(fā)送一次"INFO";"INFO"的主要目的就是獲取并確認當前集群環(huán)境中slaves和master的存活情況. - 經過上述過程后,所有的sentinel對master失效達成一致后,開始failover.
\2) Sentinel與slaves”自動發(fā)現(xiàn)”機制:
在sentinel的配置文件中(local-sentinel.conf),都指定了port,此port就是sentinel實例偵聽其他sentinel實例建立鏈接的端口.在集群穩(wěn)定后,最終會每個sentinel實例之間都會建立一個tcp鏈接,此鏈接中發(fā)送”PING”以及類似于”is-master-down-by-addr”指令集,可用用來檢測其他sentinel實例的有效性以及”O(jiān)DOWN”和”failover”過程中信息的交互. 在sentinel之間建立連接之前,sentinel將會盡力和配置文件中指定的master建立連接.sentinel與master的連接中的通信主要是基于pub/sub來發(fā)布和接收信息,發(fā)布的信息內容包括當前sentinel實例的偵聽端口:
-
+sentinel sentinel 127.0.0.1:26579 127.0.0.1 26579 ….
發(fā)布的主題名稱為”sentinel:hello”;同時sentinel實例也是”訂閱”此主題,以獲得其他sentinel實例的信息.由此可見,環(huán)境首次構建時,在默認master存活的情況下,所有的sentinel實例可以通過pub/sub即可獲得所有的sentinel信息,此后每個sentinel實例即可以根據(jù)+sentinel信息中的”ip+port”和其他sentinel逐個建立tcp連接即可.不過需要提醒的是,每個sentinel實例均會間歇性(5秒)向”sentinel:hello”主題中發(fā)布自己的ip+port,目的就是讓后續(xù)加入集群的sentinel實例也能或得到自己的信息. 根據(jù)上文,我們知道在master有效的情況下,即可通過”INFO”指令獲得當前master中已有的slave列表;此后任何slave加入集群,master都會向”主題中”發(fā)布”+slave 127.0.0.1:6579 ..”,那么所有的sentinel也將立即獲得slave信息,并和slave建立鏈接并通過PING檢測其存活性.
補充一下,每個sentinel實例都會保存其他sentinel實例的列表以及現(xiàn)存的master/slaves列表,各自的列表中不會有重復的信息(不可能出現(xiàn)多個tcp連接),對于sentinel將使用ip+port做唯一性標記,對于master/slaver將使用runid做唯一性標記,其中redis-server的runid在每次啟動時都不同.
\3) Leader選舉:
其實在sentinels故障轉移中,仍然需要一個“Leader”來調度整個過程:master的選舉以及slave的重配置和同步。當集群中有多個sentinel實例時,如何選舉其中一個sentinel為leader呢?
在配置文件中“can-failover”“quorum”參數(shù),以及“is-master-down-by-addr”指令配合來完成整個過程。
A) “can-failover”用來表明當前sentinel是否可以參與“failover”過程,如果為“YES”則表明它將有能力參與“Leader”的選舉,否則它將作為“Observer”,observer參與leader選舉投票但不能被選舉;
B) “quorum”不僅用來控制master ODOWN狀態(tài)確認,同時還用來選舉leader時最小“贊同票”數(shù);
C) “is-master-down-by-addr”,在上文中以及提到,它可以用來檢測“ip + port”的master是否已經處于SDOWN狀態(tài),不過此指令不僅能夠獲得master是否處于SDOWN,同時它還額外的返回當前sentinel本地“投票選舉”的Leader信息(runid);
每個sentinel實例都持有其他的sentinels信息,在Leader選舉過程中(當為leader的sentinel實例失效時,有可能master server并沒失效,注意分開理解),sentinel實例將從所有的sentinels集合中去除“can-failover = no”和狀態(tài)為SDOWN的sentinels,在剩余的sentinels列表中按照runid按照“字典”順序排序后,取出runid最小的sentinel實例,并將它“投票選舉”為Leader,并在其他sentinel發(fā)送的“is-master-down-by-addr”指令時將推選的runid追加到響應中。每個sentinel實例都會檢測“is-master-down-by-addr”的響應結果,如果“投票選舉”的leader為自己,且狀態(tài)正常的sentinels實例中,“贊同者”的自己的sentinel個數(shù)不小于(>=) 50% + 1,且不小與,那么此sentinel就會認為選舉成功且leader為自己。
在sentinel.conf文件中,我們期望有足夠多的sentinel實例配置“can-failover yes”,這樣能夠確保當leader失效時,能夠選舉某個sentinel為leader,以便進行failover。如果leader無法產生,比如較少的sentinels實例有效,那么failover過程將無法繼續(xù).
\4) failover過程:
在Leader觸發(fā)failover之前,首先wait數(shù)秒(隨即0~5),以便讓其他sentinel實例準備和調整(有可能多個leader??),如果一切正常,那么leader就需要開始將一個salve提升為master,此slave必須為狀態(tài)良好(不能處于SDOWN/ODOWN狀態(tài))且權重值最低(redis.conf中)的,當master身份被確認后,開始failover
A)“+failover-triggered”: Leader開始進行failover,此后緊跟著“+failover-state-wait-start”,wait數(shù)秒。
B)“+failover-state-select-slave”: Leader開始查找合適的slave
C)“+selected-slave”: 已經找到合適的slave
D) “+failover-state-sen-slaveof-noone”: Leader向slave發(fā)送“slaveof no one”指令,此時slave已經完成角色轉換,此slave即為master
E) “+failover-state-wait-promotition”: 等待其他sentinel確認slave
F)“+promoted-slave”:確認成功
G)“+failover-state-reconf-slaves”: 開始對slaves進行reconfig操作。
H)“+slave-reconf-sent”:向指定的slave發(fā)送“slaveof”指令,告知此slave跟隨新的master
I)“+slave-reconf-inprog”: 此slave正在執(zhí)行slaveof + SYNC過程,如過slave收到“+slave-reconf-sent”之后將會執(zhí)行slaveof操作。
J)“+slave-reconf-done”: 此slave同步完成,此后leader可以繼續(xù)下一個slave的reconfig操作。循環(huán)G)
K)“+failover-end”: 故障轉移結束
L)“+switch-master”:故障轉移成功后,各個sentinel實例開始監(jiān)控新的master。
Sentinel.conf詳解
1. \##sentinel實例之間的通訊端口
2. \##redis-0
3. port 26379
4. \##sentinel需要監(jiān)控的master信息:
5. \##
應該小于集群中slave的個數(shù),只有當至少
個sentinel實例提交"master失效" 6. \##才會認為master為O_DWON("客觀"失效) 7. sentinel monitor def_master 127.0.0.1 6379 2 8. sentinel auth-pass def_master 012_345^678-90 9. \##master被當前sentinel實例認定為“失效”的間隔時間 10. \##如果當前sentinel與master直接的通訊中,在指定時間內沒有響應或者響應錯誤代碼,那么 11. \##當前sentinel就認為master失效(SDOWN,“主觀”失效) 12. \##
13. \##默認為30秒 14. sentinel down-after-milliseconds def_master 30000 15. 16. \##當前sentinel實例是否允許實施“failover”(故障轉移) 17. \##no表示當前sentinel為“觀察者”(只參與"投票".不參與實施failover), 18. \##全局中至少有一個為yes 19. sentinel can-failover def_master yes 20. 21. \##當新master產生時,同時進行“slaveof”到新master并進行“SYNC”的slave個數(shù)。 22. \##默認為1,建議保持默認值 23. \##在salve執(zhí)行salveof與同步時,將會終止客戶端請求。 24. \##此值較大,意味著“集群”終止客戶端請求的時間總和和較大。 25. \##此值較小,意味著“集群”在故障轉移期間,多個salve向客戶端提供服務時仍然使用舊數(shù)據(jù)。 26. sentinel parallel-syncs def_master 1 27. 28. \##failover過期時間,當failover開始后,在此時間內仍然沒有觸發(fā)任何failover操作, 29. \##當前sentinel將會認為此次failoer失敗。 30. sentinel failover-timeout def_master 900000 31. 32. \##當failover時,可以指定一個“通知”腳本用來告知系統(tǒng)管理員,當前集群的情況。 33. \##腳本被允許執(zhí)行的最大時間為60秒,如果超時,腳本將會被終止(KILL) 34. \##腳本執(zhí)行的結果: 35. \## 1 -> 稍后重試,最大重試次數(shù)為10; 36. \## 2 -> 執(zhí)行結束,無需重試 37. \##sentinel notification-script mymaster /var/redis/notify.sh 38. \##failover之后重配置客戶端,執(zhí)行腳本時會傳遞大量參數(shù),請參考相關文檔 39. \# sentinel client-reconfig-script
分享文章:Redis哨兵模式(Sentinel)
文章來源:http://m.5511xx.com/article/ccdhogh.html


咨詢
建站咨詢
