Redis Sentinel(哨兵模式)

来源:https://www.cnblogs.com/dwvfw855/archive/2019/05/20/10894491.html
-Advertisement-
Play Games

主從複製的問題 當master節點發生故障時,需要手動進行故障轉移 寫能力與存儲能力受限,寫能力和存儲能力都依賴於master節點 當master節點發生故障時,需要手動進行故障轉移 寫能力與存儲能力受限,寫能力和存儲能力都依賴於master節點 Redis Sentinel架構 在主從複製的基礎上 ...


主從複製的問題

  • 當master節點發生故障時,需要手動進行故障轉移

  • 寫能力與存儲能力受限,寫能力和存儲能力都依賴於master節點

 

 

Redis Sentinel架構

在主從複製的基礎上,新增多個Redis Sentinel節點,這些Sentinel不存儲任何的數據。這些Sentinel節點會完成Redis的故障判斷並故障轉移的處理,然後通知客戶端。一套Redis Sentinel集群可以監控多套Redis主從,每一套Redis主從通過master-name作為標識。

客戶端不直接連接Redis服務,而連接Redis Sentinel。在Redis Sentinel中清楚哪個節點是master節點。

故障轉移流程

  1. 多個Sentinel發現並確認master有問題

  2. 選舉出一個Sentinel作為領導

  3. 選出一個slave作為master

  4. 通知其餘slave成為新的master的slave

  5. 通知客戶端主從發生的變化

  6. 等待老的master複活成為新master的slave

 

 

Redis Sentinel的相關配置

配置含義
port ${port} sentinel的埠號
dir "/redisDataPath" redis的工作目錄
logfile "${port}.log" redis的日誌文件
sentinel monitor mymaster 127.0.0.1 7000 2 名稱為mymaster的主從 masterIP=127.0.0.1 masterPort=7000 2個sentinel發現這個master有問題後執行故障轉移
sentinel down-after-milliseconds mymaster 30000 每個sentinel在連續ping 30000ms不通後認為有問題
sentinel parallel-syncs mymaster 1 在故障轉移時,該名稱為mymaster的集群中 同一時間點只允許1個節點進行複製
sentinel failover-timeout mymaster 180000 故障轉移的超時時間

 

Redis Sentinel的安裝與配置

1.配置開啟主從節點

  • redis-7000.conf

port 7000
daemonize yes
pidfile /var/run/redis-7000.pid
logfile "7000.log"
dir /redisDataPath
  • redis-7001.conf

port 7001
daemonize yes
pidfile /var/run/redis-7001.pid
logfile "7001.log"
dir /redisDataPath
slaveof 127.0.0.1  7000
  • redis-7002.conf

port 7002
daemonize yes
pidfile /var/run/redis-7002.pid
logfile "7002.log"
dir /redisDataPath
slaveof 127.0.0.1 7000

2.配置開啟sentinel監控主節點(sentinel是特殊的redis)

  • redis-26379.conf(redis sentinel的預設埠是26379)

port 26379
daemonize yes
dir "/redisDataPath"
logfile "26379.log"
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
  • redis-26380.conf

port 26380
daemonize yes
dir "/redisDataPath"
logfile "26380.log"
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
  • redis-26381.conf

port 26381
daemonize yes
dir "/redisDataPath"
logfile "26381.log"
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

 

 

客戶端接入基本原理

  1. 客戶端需要所有的sentinel節點以及對應的masterName

  2. 客戶端會遍歷所有的sentinel節點,獲取一個可用的sentinel節點

  3. 可用的sentinel調用 sentinel get-master-addr-by-name masterName, 可用的sentinel將返回master節點信息。

  4. 客戶端連接該master節點,調用role或者role replication,確認該節點是master節點。

  5. 如果master發生故障轉移,sentinel是能夠感知,並通過發佈訂閱模型將最新的master信息告知客戶端

Set<String> sentinelSet = new HashSet<String>() {{
   add("127.0.0.1:26379");
   add("127.0.0.1:26380");
   add("127.0.0.1:26381");
}};
JedisPoolConfig poolConfig = new JedisPoolConfig();
String masterName = "myMaster";
int timeout = 30_000; //jedis連接sentinel的超時時間
JedisSentinelPool sentinelPool = new JedisSentinelPool(
  masterName , sentinelSet , poolConfig , timeout);
Jedis jedis = sentinelPool.getResource();
jedis.close();

 

 

三個定時任務

  • 每10秒每個sentinel對master和slave執行info

    • 發現slave節點

    • 確認主從關係

 

  • 每2秒每個sentinel通過mster節點的channel交換信息(pub/sub)

    • 通過__sentinel__:hello頻道交互

    • 交互對節點的“看法”和自身信息

 

  • 每1秒每個sentinel對其他sentinel和redis執行ping

 

 

主觀下線與客觀下線

  • 主觀下線:每個sentinel節點對Redis節點失敗的看法。

    • sentinel down-after-milliseconds masterName timeout

    • 每個sentinel節點每秒會對Redis節點進行ping,當連續timeout毫秒之後還沒有得到PONG,則sentinel認為redis下線。

  • 客觀下線:所有sentinel節點對Redis節點失敗達成共識。

    • sentinel monitor masterName ip port quorum

    • 大於等於quorum個sentinel主觀認為Redis節點失敗下線

    • 通過sentinel is-master-down-by-addr提出自己認為Redis master下線

 

 

領導者選舉

  • 原因:只有sentinel節點完成故障轉移

  • 選舉:通過 sentinel is-master-down-by-addr 命令都希望成為領導者

    • 每個主觀下線的sentinel節點向其他sentinel節點發送命令,要求將它設置為領導者

    • 收到命令的Sentinel節點如果沒有同意其他Sentinel節點發送的命令,那麼將同意該請求,否則拒絕。

    • 如果該Sentinel節點發現自己的票數已經超過Sentinel集合半數且超過quorum,那麼將它成為領導者

    • 如果此過程有多個Sentinel節點成為了領導者,那麼將等待一段時間重新進行選舉

 

 

故障轉移(Sentinel領導者節點完成之後)

  1. 從slave節點中選出一個“合適的”節點作為新的master節點

    • 選擇slave-priority(slave節點優先順序)最高的slave節點,如果存在則返回,不存在則繼續

    • 選擇複製偏移量最大的slave節點(複製的最完整性),如果存在則返回,不存在則繼續

    • 選擇runId最小的slave節點

  2. 對上面的slave節點執行slave no one命令讓其成為master節點

  3. 向其餘的slave節點發送命令,讓它們成為新master節點的slave節點,複製規則和parallel-syncs參數有關。

  4. 更新對原來master節點配置為slave,並保持對其“關註”,當其恢復後命令它去複製新的master節點

 

 

節點運維(上線與下線)

生產節點下線可能原因

  • 機器下線:過保等情況

  • 機器性能不足:例如CPU、記憶體、磁碟、網路等

1.主節點

##節點下線
##手動進行故障轉移
sentinel failover ${masterName}
##跳過主觀下線、客觀下線與領導者選舉,領導者即為當前連接的sentinel節點

##節點上線
config set slave-priority num  #調大新增節點的優先順序
sentinel failover ${masterName}

2.從節點

需要區分是臨時下線還是永久下線。例如需要做一些配置、AOF、RDB等方面的清理工作。

當上線時候,執行slaveof masterIp masterPort即可

3.Sentinel節點

需要區分是臨時下線還是永久下線。例如需要做一些配置的清理工作。

 

 

 

 

 

 

 

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 1. 為我新的一天沒有放棄而喝彩 學習是一件很容易放棄的事情,因為就算是不學,我也能在現在的崗位上發光發熱。可是人不就是一個熱愛折騰的種群嗎? 今天沒有放棄不代表明天沒有放棄,也許放棄的可能性大於堅持的可能性,不管怎樣,堅持一天算一天。 RadonDB面對著TiDB,OceanBase等等資料庫的競 ...
  • hdfs和hbase的交互,和寫MapReduce程式類似,只是需要修改輸入輸出數據和使用hbase的javaAPI對其進行操作處理即可 public class HBaseToHdfs extends ToolRunner implements Tool { private Configurati... ...
  • [20190520]exp imp on th fly.txt--//以前做的測試,查找浪費許多時間,做1個記錄。--//註:僅僅linux 操作系統,bash shell版本不能太低就可以實現,現在安裝的linux bash shell應該都沒有問題。1.環境:SCOTT@book> @ ver1 ...
  • 今天我們用10分鐘,重點梳理一遍以下幾方面: 資料庫知識點彙總; 資料庫事務特性和隔離級別; 詳解關係型資料庫、索引與鎖機制; 資料庫調優與最佳實踐; 面試考察點及加分項。 一、資料庫的不同類型 1.常用的關係型資料庫 Oracle:功能強大,主要缺點就是貴 MySQL:互聯網行業中最流行的資料庫, ...
  • 我們建立了Alwayson後,輔助副本下的資料庫是沒有相應的賬號的,怎麼樣進行賬號的同步呢?怎麼在不知道密碼的情況下,進行賬號的同步設置。 我們可以通過SP--sp_help_revlogin 來實現,此存儲過程在主副本上創建了,在執行的時候直接數據你需要同步的賬號就會生成創建的SQL命令。 我們將 ...
  • 1、MYSQL安裝目錄 2、MYSQL數據文件目錄 3、相應地,配置文件在數據文件上一級目錄中 4、停止MYSQL服務 5、啟動MYSQL服務 6、配置參數max_allowed_packet 客戶端/伺服器之間通信的緩存區的最大大小,預設是4M 7、配置參數net_buffer_length TC ...
  • 如果您瀏覽過許多IT類的招聘職位,那麼掌握資料庫技能的重要性便不言自明瞭。因JAVA常常與MySQL所掛鉤,因此興起了寫博客記載學習的念頭,盼與君共勉。然,在進行MySQL語法的學習之前,我們無不面臨環境如何部署的問題,而這個問題又常常令新手望而生畏。在接下來篇幅中,我們將一起合作,消滅這隻“攔路虎 ...
  • 前幾天一直練習PIVOT透視,還實現了動態透視的存過程《動態透視表》https://www.cnblogs.com/insus/p/10888277.html 今天練習MS SQL Server逆透視的功能。 首先準備一些可以逆透視的數據: IF OBJECT_ID('tempdb.dbo.#Par ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...