redis高可用之REDIS SENTINEL

来源:http://www.cnblogs.com/zhanchenjin/archive/2016/04/11/5379039.html
-Advertisement-
Play Games

1. Redis主從配置 1.1. 設置主從複製 Master <= Salve 10.24.6.5:6379 <= 10.24.6.7:6379 1.2. 取消主從複製 1.3. 刪除所有數據 flushdb:刪除這個db下的。 flushall:刪除所有 2. Sentinel高可用配置 Sen ...


 

1. Redis主從配置

1.1. 設置主從複製

Master <= Salve

10.24.6.5:6379 <= 10.24.6.7:6379

 

 

1.2.   取消主從複製

 

 

1.3.  刪除所有數據

flushdb:刪除這個db下的。
flushall:刪除所有

 

2. Sentinel高可用配置

Sentinel伺服器地址:

10.24.6.7

啟動

Redis-sentinel sentinel.conf

或者

Redis-server sentinel.conf –sentinel

 

Redis伺服器:

Master <= Salve

10.24.6.5:6379 <= 10.24.6.7: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 <name> <ip> <port> <quorum>  

註:quorum表示發起failover需要的sentinel數量,看sentinel群集的數量決定。  

 

 

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 Sentinel
sentinel = Sentinel([(
'10.24.6.7', 26379)], socket_timeout=0.1)
master = sentinel.master_for(
'10.24.6.5master', socket_timeout=0.1)
print master
master.set(
'foo', 'bar')
print master.get('foo')

 

2.7.  Sentinel高可用性原理

首先解釋2個名詞:SDOWN和ODOWN.

  • SDOWN:subjectively down,直接翻譯的為"主觀"失效,即當前sentinel實例認為某個redis服務為"不可用"狀態.
  • ODOWN:objectively down,直接翻譯為"客觀"失效,即多個sentinel實例都認為master處於"SDOWN"狀態,那麼此時master將處於ODOWN,ODOWN可以簡單理解為master已經被集群確定為"不可用",將會開啟failover.

    SDOWN適合於master和slave,但是ODOWN只會使用於master;當slave失效超過"down-after-milliseconds"後,那麼所有sentinel實例都會將其標記為"SDOWN".

   

    1) SDOWN與ODOWN轉換過程:

  • 每個sentinel實例在啟動後,都會和已知的slaves/master以及其他sentinels建立TCP連接,並周期性發送PING(預設為1秒)
  • 在交互中,如果redis-server無法在"down-after-milliseconds"時間內響應或者響應錯誤信息,都會被認為此redis-server處於SDOWN狀態.
  • 如果2)中SDOWN的server為master,那麼此時sentinel實例將會向其他sentinel間歇性(一秒)發送"is-master-down-by-addr <ip> <port>"指令並獲取響應信息,如果足夠多的sentinel實例檢測到master處於SDOWN,那麼此時當前sentinel實例標記master為ODOWN...其他sentinel實例做同樣的交互操作.配置項"sentinel monitor <mastername> <masterip> <masterport> <quorum>",如果檢測到master處於SDOWN狀態的slave個數達到<quorum>,那麼此時此sentinel實例將會認為master處於ODOWN.
  • 每個sentinel實例將會間歇性(10秒)向master和slaves發送"INFO"指令,如果master失效且沒有新master選出時,每1秒發送一次"INFO";"INFO"的主要目的就是獲取並確認當前集群環境中slaves和master的存活情況.
  • 經過上述過程後,所有的sentinel對master失效達成一致後,開始failover.

    2) Sentinel與slaves"自動發現"機制:

    在sentinel的配置文件中(local-sentinel.conf),都指定了port,此port就是sentinel實例偵聽其他sentinel實例建立鏈接的埠.在集群穩定後,最終會每個sentinel實例之間都會建立一個tcp鏈接,此鏈接中發送"PING"以及類似於"is-master-down-by-addr"指令集,可用用來檢測其他sentinel實例的有效性以及"ODOWN"和"failover"過程中信息的交互.
    在sentinel之間建立連接之前,sentinel將會儘力和配置文件中指定的master建立連接.sentinel與master的連接中的通信主要是基於pub/sub來發佈和接收信息,發佈的信息內容包括當前sentinel實例的偵聽埠:

  1. +sentinel sentinel 127.0.0.1:26579 127.0.0.1 26579 ....  

    發佈的主題名稱為"__sentinel__:hello";同時sentinel實例也是"訂閱"此主題,以獲得其他sentinel實例的信息.由此可見,環境首次構建時,在預設master存活的情況下,所有的sentinel實例可以通過pub/sub即可獲得所有的sentinel信息,此後每個sentinel實例即可以根據+sentinel信息中的"ip+port"和其他sentinel逐個建立tcp連接即可.不過需要提醒的是,每個sentinel實例均會間歇性(5秒)向"__sentinel__:hello"主題中發佈自己的ip+port,目的就是讓後續加入集群的sentinel實例也能或得到自己的信息.
    根據上文,我們知道在master有效的情況下,即可通過"INFO"指令獲得當前master中已有的slave列表;此後任何slave加入集群,master都會向"主題中"發佈"+slave 127.0.0.1:6579 ..",那麼所有的sentinel也將立即獲得slave信息,並和slave建立鏈接並通過PING檢測其存活性.

    補充一下,每個sentinel實例都會保存其他sentinel實例的列表以及現存的master/slaves列表,各自的列表中不會有重覆的信息(不可能出現多個tcp連接),對於sentinel將使用ip+port做唯一性標記,對於master/slaver將使用runid做唯一性標記,其中redis-server的runid在每次啟動時都不同.

 

   3) Leader選舉:

    其實在sentinels故障轉移中,仍然需要一個“Leader”來調度整個過程:master的選舉以及slave的重配置和同步。當集群中有多個sentinel實例時,如何選舉其中一個sentinel為leader呢?

    在配置文件中“can-failover”“quorum”參數,以及“is-master-down-by-addr”指令配合來完成整個過程。

    A) “can-failover”用來表明當前sentinel是否可以參與“failover”過程,如果為“YES”則表明它將有能力參與“Leader”的選舉,否則它將作為“Observer”,observer參與leader選舉投票但不能被選舉;

    B) “quorum”不僅用來控制master ODOWN狀態確認,同時還用來選舉leader時最小“贊同票”數;

    C) “is-master-down-by-addr”,在上文中以及提到,它可以用來檢測“ip + port”的master是否已經處於SDOWN狀態,不過此指令不僅能夠獲得master是否處於SDOWN,同時它還額外的返回當前sentinel本地“投票選舉”的Leader信息(runid);

    每個sentinel實例都持有其他的sentinels信息,在Leader選舉過程中(當為leader的sentinel實例失效時,有可能master server並沒失效,註意分開理解),sentinel實例將從所有的sentinels集合中去除“can-failover = no”和狀態為SDOWN的sentinels,在剩餘的sentinels列表中按照runid按照“字典”順序排序後,取出runid最小的sentinel實例,並將它“投票選舉”為Leader,併在其他sentinel發送的“is-master-down-by-addr”指令時將推選的runid追加到響應中。每個sentinel實例都會檢測“is-master-down-by-addr”的響應結果,如果“投票選舉”的leader為自己,且狀態正常的sentinels實例中,“贊同者”的自己的sentinel個數不小於(>=) 50% + 1,且不小與<quorum>,那麼此sentinel就會認為選舉成功且leader為自己。

    在sentinel.conf文件中,我們期望有足夠多的sentinel實例配置“can-failover yes”,這樣能夠確保當leader失效時,能夠選舉某個sentinel為leader,以便進行failover。如果leader無法產生,比如較少的sentinels實例有效,那麼failover過程將無法繼續.

 

    4) failover過程:

    在Leader觸發failover之前,首先wait數秒(隨即0~5),以便讓其他sentinel實例準備和調整(有可能多個leader??),如果一切正常,那麼leader就需要開始將一個salve提升為master,此slave必須為狀態良好(不能處於SDOWN/ODOWN狀態)且權重值最低(redis.conf中)的,當master身份被確認後,開始failover

    A)“+failover-triggered”: Leader開始進行failover,此後緊跟著“+failover-state-wait-start”,wait數秒。

    B)“+failover-state-select-slave”: Leader開始查找合適的slave

    C)“+selected-slave”: 已經找到合適的slave

    D) “+failover-state-sen-slaveof-noone”: Leader向slave發送“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發送“slaveof”指令,告知此slave跟隨新的master

    I)“+slave-reconf-inprog”: 此slave正在執行slaveof + SYNC過程,如過slave收到“+slave-reconf-sent”之後將會執行slaveof操作。

    J)“+slave-reconf-done”: 此slave同步完成,此後leader可以繼續下一個slave的reconfig操作。迴圈G)

    K)“+failover-end”: 故障轉移結束

    L)“+switch-master”:故障轉移成功後,各個sentinel實例開始監控新的master。

 

Sentinel.conf詳解

  1. ##sentinel實例之間的通訊埠  
  2. ##redis-0  
  3. port 26379  
  4. ##sentinel需要監控的master信息:<mastername> <masterIP> <masterPort> <quorum>  
  5. ##<quorum>應該小於集群中slave的個數,只有當至少<quorum>個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. ##<mastername> <millseconds>  
  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個數。  
  22. ##預設為1,建議保持預設值  
  23. ##在salve執行salveof與同步時,將會終止客戶端請求。  
  24. ##此值較大,意味著“集群”終止客戶端請求的時間總和和較大。  
  25. ##此值較小,意味著“集群”在故障轉移期間,多個salve向客戶端提供服務時仍然使用舊數據。  
  26. sentinel parallel-syncs def_master 1  
  27.   
  28. ##failover過期時間,當failover開始後,在此時間內仍然沒有觸發任何failover操作,  
  29. ##當前sentinel將會認為此次failoer失敗。  
  30. sentinel failover-timeout def_master 900000  
  31.   
  32. ##當failover時,可以指定一個“通知”腳本用來告知系統管理員,當前集群的情況。  
  33. ##腳本被允許執行的最大時間為60秒,如果超時,腳本將會被終止(KILL)  
  34. ##腳本執行的結果:  
  35. ## 1    -> 稍後重試,最大重試次數為10;   
  36. ## 2    -> 執行結束,無需重試  
  37. ##sentinel notification-script mymaster /var/redis/notify.sh  
  38. ##failover之後重配置客戶端,執行腳本時會傳遞大量參數,請參考相關文檔  
  39. # sentinel client-reconfig-script <master-name> <script-path>  

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、 是否支持多線程? SQLite官網上的“Is SQLite threadsafe?”這個問答。 簡單來說,從3.3.1版本開始,它就是線程安全的了。而iOS的SQLite版本沒有低於這個版本的,當然,你也可以自己編譯最新版本。 不過這個線程安全仍然是有限制的,在這篇《Is SQLite thr ...
  • 回到目錄 redis的客戶端有很多,這次用它的pub/sub發佈與訂閱我選擇了StackExchange.Redis,發佈與訂閱大家應該很清楚了,首先一個訂閱者,訂閱一個服務,服務執行一些處理程式(可能是寫個日誌,插入個數據,發個email)然後當另一個項目的某個業務發佈這個服務後,被訂閱的程式將會 ...
  • 問題現象:使用綠色版PL/SQL工具進行登錄時報如下截圖錯誤: 問題描述:初始化失敗,無法鎖定oci.dll 解決方法:在PLSQL的菜單欄里依次選擇 工具—>首選項,在OCI庫(自動檢測為空)項中手動更改其位置,指向bin目錄中的oci.dll的位置,問題即可解決。 註意:絕對路徑,如D:\Pro... ...
  • HBase是一種資料庫:HadoopDatabase顧名思義就是Hadoop資料庫,它是一種基於hadoop文件系統HDFS的一種分散式資料庫,專門設計用來快速隨機讀寫大規模數據。本文介紹HBase的下載與安裝的整個過程。 一、HBase的下載 1.登錄HBase官網http://hbase.apa ...
  • 一、選擇Percona Server、MariaDB還是MYSQL mysql應用源碼:http://www.jinhusns.com/Products/Download/?type=xcj 1、Mysql三種存儲引擎 MySQL提供了兩種存儲引擎:MyISAM和 InnoDB,MySQL4和5使用 ...
  • 接上一篇Mysql性能優化一 建立適當的索引 說起提高資料庫性能,索引是最物美價廉的東西了。不用加記憶體,不用改程式,不用調sql,只要執行個正確的'create index',查詢速度就可能提高百倍千倍,這可真有誘惑力。可是天下沒有免費的午餐,查詢速度的提高是以插入、更新、刪除的速度為代價的,這些寫 ...
  • 在部署環境時,不同的環境可能會有一些不同步,而個人遇到的問題就是在開發環境中表中均有欄位 BestCaseId 和 RiskId 欄位,生產環境中目前只有 BestCaseId 欄位,新搭建的測試環境中暫時都不存在這兩個欄位(某些原因需要另一單獨測試環境)。 保證在生產環境中的 BestCaseId ...
  • 1. Linux系統配置 1.1. vm.overcommit_memory設置 overcommit_memory文件指定了內核針對記憶體分配的策略,其值可以是0、1、2。 0, 表示內核將檢查是否有足夠的可用記憶體供應用進程使用;如果有足夠的可用記憶體,記憶體申請允許;否則,記憶體申請失敗,並把錯誤返回給 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...