Redis5.0:簡單的集群模式——主從模式詳解

2020-12-25 探險家之指路明燈

主從模式

主從模式是最簡單的集群模式,其實就是複製基本只能解決讀寫分離問題, 主機伺服器一旦宕機基本完蛋,不具備高可用

基本上redis的性能瓶頸主要在於網絡IO和內存主頻上面,單機版Redis在不考慮高可用的情況下基本滿足80%的項目需要,因為單機版Redis可以實現10W/S的請求,除非緩存K-V值過大,通過讀寫分離緩存網卡的壓力,否則這個並發處理能力可以應對大部分項目。

幾乎所有的主從模式都是從伺服器只提供只讀不寫的功能,否則會出現數據不一致的情況,現在無論那種資料庫都不支持雙向同步。

屁話少說,上配置代碼,主伺服器不需要配置,只需簡單一句代碼配置從伺服器即可,聲明主伺服器是誰,餘下的redis會自行交流。

slaveof 192.168.3.143 6379

一主多從

主伺服器:192.168.3.143從伺服器:192.168.3.144從伺服器:192.168.3.145從伺服器 redis.conf 配置文件加入slaveof 192.168.3.143 6379

一主多從(鏈式結構),所謂鏈式結構就是可以從伺服器同步從伺服器

主伺服器:192.168.3.143從伺服器:192.168.3.144從伺服器:192.168.3.145從伺服器 redis.conf 配置文件加入slaveof 192.168.3.143 6379從伺服器:192.168.3.147 從伺服器 redis.conf 配置文件加入 slaveof 192.168.3.144 6379

嘗試一下程序上來實現讀寫分離,Net Core 使用StackExchange.Redis 進行訪問Redis集群,其它組件自己研究吧

//聲明伺服器地址,StackExchange會自己認別那個是主從關係ConfigurationOptions option = new ConfigurationOptions();option.EndPoints.Add("192.168.3.143", 6379);option.EndPoints.Add("192.168.3.144", 6379);option.EndPoints.Add("192.168.3.145", 6379);option.EndPoints.Add("192.168.3.147", 6379);ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(option);IDatabase db = redis.GetDatabase();db.StringSet("test", "testvalue", flags: CommandFlags.DemandMaster);//CommandFlags.DemandMaster 標明主伺服器寫入string value = db.StringGet("test", flags: CommandFlags.DemandReplica);//CommandFlags.DemandReplica 標明從伺服器讀取Console.WriteLine(value);

代碼行得通,已經分別從主/從伺服器讀取到數據,接下來將是要測試,主伺服器倒下來了,會是怎麼樣?如圖:成功報錯,恭喜某程序猿喜提系統異常一次

接下三張圖片將展示依次關閉從伺服器:192.168.3.147,192.168.3.145 ,192.168.3.144 最後一張圖將意味著己關閉所有從伺服器,所有從伺服器己關閉,程序運行成功報錯

接著測試一下,StackExchange.Redis 框架問題,而對三個從伺服器是否能分流從不同的從伺服器取值,從而減輕從伺服器的壓力

從監控的圖片來,三張從伺服器的圖標顯示,StackExchange.Redis的確平均的分流的請求的流量。

哨兵模式

哨兵模式基本就是主從模式的升級版, 主要解決高可用問題,實現自動容錯和恢復

簡單理解就是主從模式一旦主機伺服器宕機需要人工處理,這樣一來你或者運維,得有一個睡不著,Redis引進哨兵模式的作用就是監控Redis服務是否正常運作,主伺服器出現故障將自動將從伺服器轉換為主伺服器。

理想狀態下的配置架構如下:哨兵監控主從伺服器,哨兵之間相互監控,組成哨兵組推薦三個哨兵以上並且最好獨立部署,唯一能節省成本的好消息就是他們可以監控多個主伺服器。

工作原理:

每個哨兵都會監控主/從伺服器及其它哨兵。當有一個哨兵檢查主伺服器下線(沒有規定時間回復ping請求),會將主伺服器標識為主觀下線當主伺服器被標為主觀下線,其它哨兵會馬上檢查主服務在線狀態。當足夠的哨兵(超過配置數量)將它標識為主觀下線,主伺服器會變成客觀下線,如果數量不夠則主觀下線狀態會除移。主伺服器客觀下線之後哨兵會從「從伺服器」中選中一臺伺服器當主伺服器。哨兵將修改其它從伺服器以及被修復舊主伺服器的配置,將統一修改為從伺服器並且修改它們的主伺服器地址。注意:每個哨兵配置不一樣,每個哨兵根據自己的配置超時時間來判斷主伺服器是否主觀下線只有符合就標為主觀下線,每個哨兵根據自己設定的「肯定數量」來判斷主伺服器是否客觀下線,只要有一個哨兵的配置達到客觀下線該哨兵就會執行故障遷移操作。

從伺服器選舉原理:

首先發現客觀下線的哨兵會發起一個選舉請求,根據Raft算法,一般會成為領頭哨頭。根據與主伺服器的斷開的時間判斷根據從伺服器配置文件的權重(slave-priority)選舉為主伺服器複製偏移,從主節點收到更多的新數據的節點會被選擇在所有條件相同的情況,選擇runid最小的為主伺服器配置:只需要配置主資料庫即可,哨兵會自動發現所有從資料庫並進行監控,哨兵之間可以相互發現,只要確保埠放行就可以了,簡單版配置簡單到只有一句話

sentinel monitor <master-group-name> <ip> <port> <quorum>sentinel monitor mymaster 127.0.0.1 6379 2 //示例//監控一個叫做mymaster的主節點,地址是 127.0.0.1 埠號是6379,判斷客觀下線需要2個哨兵「肯定」//當然還有一些其它較為重要的配置,可以手動設定sentinel down-after-milliseconds mymaster 60000 //設定檢查超時時間,超過這個時間將認定為主觀下線,默認30秒下面進一些場景測試以驗證觀點,雖然支持採用默認配置的方式來進行啟動,我們還是使用配置文件的方式進行啟動

//主伺服器bind 0.0.0.0port 6379daemonize yes//從伺服器bind 0.0.0.0port 6379daemonize yesslaveof 192.168.3.40 6379測試場景一:簡單版測試,一主一從一哨兵,主伺服器故障,能否自動將從伺服器轉換為主伺服器

sentinel monitor mymaster 192.168.3.40 6379 1sentinel down-after-milliseconds mymaster 5000//內網配置五秒就足夠了daemonize yes成功運行

編寫檢查代碼

class Program { static void Main(string[] args) { //聲明伺服器地址,StackExchange會自己認別那個是主從關係 ConfigurationOptions option = new ConfigurationOptions(); option.EndPoints.Add("192.168.3.40", 6379); option.EndPoints.Add("192.168.3.167", 6379); ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(option); IDatabase db = redis.GetDatabase(); db.StringSet("test", "testvalue"); DateTime exStartTime = DateTime.Now; DateTime exEndTime; bool isEX = false; while (true) { try { var value = db.StringGet("test"); Console.WriteLine(value); if (!value.HasValue && isEX!) Console.WriteLine(value); if (isEX && value.HasValue == true) { exEndTime = DateTime.Now; Console.WriteLine($"連接成功,獲取的值是:{value}"); break; } } catch (Exception e) { if (isEX == false) { Console.WriteLine($"連接失敗!{e.Message}"); exStartTime = DateTime.Now; isEX = true; } } } Console.WriteLine($"連接異常時間{exStartTime},故障遷移成功時間{exEndTime},花費{(exEndTime - exStartTime).TotalSeconds}秒"); } }悄悄打開ESXI 把虛擬機的網線拔掉

果然成功報錯,並且進行故障轉移

這個時候,重新把網絡設置回來,並且查看兩個redis.conf的配置文件內容,發現配置已被改動,192.168.3.40 己由主伺服器轉變成從伺服器,哨兵的配置也相應作了改變

測試場景二:一主三從一哨兵

//主伺服器(192.168.3.40)bind 0.0.0.0port 6379daemonize yes//從伺服器(192.168.3.167)bind 0.0.0.0port 6379daemonize yesslaveof 192.168.3.40 6379//從伺服器(192.168.3.168)bind 0.0.0.0port 6379daemonize yesslaveof 192.168.3.40 6379//從伺服器(192.168.3.169)bind 0.0.0.0port 6379daemonize yesslaveof 192.168.3.40 6379哨兵的配置依舊不變

//哨兵伺服器(192.168.3.171)sentinel monitor mymaster 192.168.3.40 6379 1sentinel down-after-milliseconds mymaster 5000//內網配置五秒就足夠了daemonize yes一頓操作猛如虎,斷掉網絡

成功切換,看看這四臺伺服器的配置都發現了什麼變化吧

測試場景三:一主三從三哨兵

主從伺服器的配置不變,哨兵的配置稍有變化,哨兵的伺服器由一臺增加到三臺,分別是192.168.3.171,192.168.3.172,192.168.3.170,哨兵能相互發現和相互監控

sentinel monitor mymaster 192.168.3.40 6379 2 //裁仲伺服器由1臺變成2臺sentinel down-after-milliseconds mymaster 5000//內網配置五秒就足夠了daemonize yes好了,準備就緒,故技重演,斷網

查看一下四臺Redis伺服器配置發生什麼變化

查看一下,三臺哨兵的配置發生什麼變化

今天就測到這裡了

原文連結:http://www.cnblogs.com/netcore3/p/14121749.html

如果覺得本文對你有幫助,可以轉發關注支持一下

相關焦點

  • Redis 單例、主從模式、sentinel 以及集群的配置方式及優缺點對比
    redis主從模式解決了數據備份和單例可能存在的性能問題,但是其也引入了新的問題。由於主從模式配置了三個redis實例,並且每個實例都使用不同的ip(如果在不同的機器上)和埠號。根據前面所述,主從模式下可以將讀寫操作分配給不同的實例進行從而達到提高系統吞吐量的目的,但也正是因為這種方式造成了使用上的不便,因為每個客戶端連接redis實例的時候都是指定了ip和埠號的,如果所連接的redis實例因為故障下線了,而主從模式也沒有提供一定的手段通知客戶端另外可連接的客戶端地址,因而需要手動更改客戶端配置重新連接。
  • 主從哨兵集群終於給你說明白了
    Redis有三種集群模式,第一個就是主從模式,第二種「哨兵」模式,第三種是 Cluster 集群模式。今天就和大家細細聊聊這三種模式。主從複製當其中一臺伺服器更新之後,伺服器會自動的將這臺更新的數據同步到另外一臺伺服器上。通過持久化的功能,redis可以保證就算是服務宕機重啟了,也只有少量的數據會丟失。
  • 如何實現redis主從複製?
    主從複製,主要優勢在於實現了數據備份(主機和從機數據同步一致)、讀寫分離(主機主要負責寫入數據,從機讀數據,在讀大於寫的項目中提高了性能)。最後也為後續集成哨兵機制和集群的實現提供了依據。一、多臺伺服器上配置主從複製Redis從5.0以後主從配置屬性發生了變化,在5.0之前配置的是slaveof,5.0以後變成了replicaof伺服器用途redis埠號備註centos7 192.168.1.6主機Master(寫)6379redis5.0centos7 192.168.1.4從機Slave(讀)6379redis5.0centos7 192.168.1.5
  • Redis的集群搭建,原來這麼簡單
    回歸正題,上篇主要說了下Redis的主從複製是如何做的,高可用集群有幾種方式部署(傳送門《原來你是這樣的高可用呀》)。其中針對Redis高可用cluster集群說明時,有一些遺漏的東西,會在本篇前半部分進行說明,後面的內容主要是說怎麼來搭建cluster集群。
  • redis學習筆記(四)主從數據同步
    在redis恢復數據時我們可以依賴於aof日誌或rdb日誌,但是redis在運行中該如何保證服務的可靠性,就需要依賴redis主從和哨兵集群
  • 面試官:Redis有哪幾種集群方案?原理和優缺點是什麼?
    雖然現在各大雲平臺有提供緩存服務可以直接使用,但了解一下其背後的實現與原理總還是有些必要(比如面試), 本文就一起來學習一下Redis的幾種集群方案。主從複製模式主從複製模式中包含一個主資料庫實例(master)與一個或多個從資料庫實例(slave),如下圖
  • Docker 搭建 Redis Cluster 集群環境
    使用 Docker 搭建 Redis Cluster,最重要的環節就是容器通信的問題,這一塊我們在之前的文章中已經給大家解決了《Docker 網絡模式詳解及容器間網絡通信》,本篇文章主要練習使用多個容器完成 Redis Cluster 集群環境的搭建,順便為學習 Docker Compose 鋪鋪路。
  • 認識Redis集群——Redis Cluster
    :主從模式、sentinel模式、Redis Cluster。之前沒有好好的全面理解Redis集群,特別是Redis Cluster,以為這就是redis集群的英文表達啊,故寫本篇博文來儘可能全面加深理解Redis Cluster。主要參考資料《Redis設計與實現》,主要是PDF電子版,有需要的朋友評論或者私聊! 一、Redis Cluster簡單概述1.
  • Redis系列 - 主從庫模式、哨兵和分片集群
    主從模式Redis提供了主從庫模式,增加冗餘的副本來提高Redis集群的高可靠性。主-從-從模式減少主庫全量同步時的壓力主從庫模式中,所有的從庫都是和主庫連接,所有的全量複製也都是和主庫進行的。現在,我們可以通過「主 - 從 - 從」模式將主庫生成 RDB 和傳輸 RDB 的壓力,以級聯的方式分散到從庫上。如下圖:
  • 5分鐘完全掌握 Redis
    跳躍表skiplist:跳躍表是有序集合的底層實現之一,redis中在實現有序集合鍵和集群節點的內部結構中都是用到了跳躍表。要想實現高可用,一臺機器肯定是不夠的,而redis要保證高可用,有2個可選方案。 主從架構 主從模式是最簡單的實現高可用的方案,核心就是主從同步。
  • Redis Sentinel-深入淺出原理和實戰
    ❝本篇博客會簡單的介紹Redis的Sentinel相關的原理,同時也會在最後的文章給出「硬核的」實戰教程,讓你在了解原理之後,能夠實際上手的體驗整個過程。❞之前的文章聊到了Redis的主從複製,聊到了其相關的原理和缺點,具體的建議可以看看我之前寫的文章Redis的主從複製。
  • 46道Redis面試題,含參考答案!
    1.codis2.目前用的最多的集群方案,基本和 twemproxy 一致的效果,但它支持在節點數量改變情況下,舊節點數據可恢復到新 hash 節點。redis cluster3.0 自帶的集群,特點在於他的分布式算法不是一致性 hash,而是 hash 槽的概念,以及自身支持節點設置從節點。具體看官方文檔介紹。
  • 去pdd面試,redis把我面哭了【附面試答案】
    示例輸入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]輸出:[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]一:看你在項目中用了redis,我們先聊聊redis吧,常用的數據結構有哪幾種,在你的項目中用過哪幾種,以及在業務中使用的場景,redis
  • Python | Python學習之Redis交互詳解
    前言最近在學習scrapy redis,順便複習了redis。本篇為redis篇,包含實例演示,主從服務配置,python交互等內容。log file /xx/xx/xx/redis-server.log 日誌文件位置slaveof ip port 主從複製的ip埠啟動redis:sudo server redis start停止redis:sudo server redis stop重啟redis:sudo server redis restart加載指定的redis
  • acl 框架中的 Redis 庫已經支持集群版 Redis 3.0
    據 redis 官方網站顯示,支持集群版的 redis3.0 快要發布了(現在已經到了redis3.0 rc4 版本),這樣使用者就不需要自己花很大力氣來針對
  • 淺談Redis主從複製
    Redis在京東的使用也是非常普遍的,包括很多關鍵業務上的使用,由於Redis官方集群還未發布,在使用Redis的過程中需要面對Redis的單點問題,京東採用的是一種比較通用的解決方案即由主從備份再加相應的主從切換(在一些場景下可能進行讀寫分離),使主Redis出現失效的時候可以快速的切換到從Redis上。
  • 三歪推薦:Redis常見的面試題
    1秒鐘的數據,而no模式的效率和everysec相仿,但是會丟失上次同步AOF文件之後的所有寫命令數據。要想實現高可用,一臺機器肯定是不夠的,而redis要保證高可用,有2個可選方案。 主從架構 主從模式是最簡單的實現高可用的方案,核心就是主從同步。
  • Redis 6.0.0 GA - OSCHINA - 中文開源技術交流社區
    Redis 創始人宣布 Redis 6.0.0 穩定版正式 GA。
  • 面試系列 - Redis 持久化和主從複製總結(二)
    系統調用 fork():創建進程,實現 Copy-on-Write;(Copy-on-Write:如果有多個調用者同時要求相同資源,如內存或磁碟上的數據存儲,他們會共同獲取相同的指針指向相同的資源,直到某個調用者試圖修改資源的內容時,系統才會真正複製一份專用副本給該調用者,而其他調用者所見到的最初的資源仍然保持不變);全量複製:當設置了主從模式時
  • 一不小心肝出了4W字的Redis面試教程
    集群集群概述Redis作為緩存的高效中間件,在我們日常的開發中被頻繁的使用,今天就來說一說Redis的四種模式,分別是單機版、主從複製、哨兵、以及集群模式。主從模式原理主從的原理還算是比較簡單的,一主多從,主資料庫(master)可以讀也可以寫(read/write),從資料庫僅讀(only read)。