主頁 > 軟體設計 > Redis 系列--高可用&集群方案

Redis 系列--高可用&集群方案

2021-08-19 07:12:39 軟體設計

一般我們在使用 Redis 時,鑒于單機存在的單點故障,容量有限,高并發壓力問題,都不會采用單機模式,那么該如何設計 Redis 的部署方式來解決諸如單點故障,容量有限,高并發壓力這樣的問題呢?

首先來看下單點故障的問題,單點故障一般就是指提供服務的節點或實體只有一個,當這個節點出現故障就導致這個服務不可用,解決這種問題一般會引入主備或主從的概念,主備模式就是主機向外提供服務,備機從主機同步資料,只有當主機出現故障時,備機才代替主機向外提供服務,主從模式下,從節點從主節點同步資料,同時也提供部分服務(對于主從模式的 Redis,從節點一般只提供讀服務 ),這兩種方案都可以很好的解決單點故障的問題,主從模式甚至還可以解決訪問壓力的問題,
在這里插入圖片描述
上面提到的方案,都沒有解決容量受限的問題,當系統的資料隨著業務的發展快速增長的時候,我們必須解決容量的問題,那么提升單機的記憶體容量是否可行呢?一般來說,我們不會采用這種方式,因為單機記憶體的提升畢竟有限,另外單節點資料量的提升,勢必會降低 Redis 的性能,既然這種方式并不是很好的方案,那只能一變多,單實體拆分成多實體了,到底該如何進行拆分呢?這里就要了解一下微服務的拆分原則之 AKF 原則,上面提到的主備或者主從其實就對應 AKF 拆分原則的 X 軸方向上的拆分,對 Redis 來說,X 軸方向的拆分只能解決單點故障和訪問壓力的問題,要解決容量有限的問題,必須進行 Y 軸及 Z 軸方向的拆分,先按照 Y 軸方向拆分,我們可以根據業務模塊對資料進行劃分,每個模塊的資料放在一個 Redis 實體中,客戶端可以根據要查詢的資料所屬的業務模塊進行路由查詢,
在這里插入圖片描述

按照 Y 軸方向拆分還存在一個問題,如果某個業務模塊的資料隨著業務的發展而成比例或者指數級增長,存放這部分業務資料的實體也會出現容量受限的問題,這時我們就要進行 Z 軸方向的拆分,即資料分片,X,Y,Z 軸方向的拆分還可以進行隨意的組合來解決單機故障,容量及訪問壓力的問題,X 方向–資料鏡像解決單點故障;Y&Z 或者 Y/Z 方向–資料拆分解決訪問壓力及容量問題,
在這里插入圖片描述
接下來我們重點聊一下 Redis 的資料分片(磁區),Redis 的資料磁區整體上可以分為兩種,一種范圍磁區,另一種散列磁區,范圍磁區,舉個例子,可以根據用戶的 id 所在區間,將用戶所關聯的資料分配到不同的 Redis 實體,比如用戶 id 在 0-9999 之間的用戶關聯的資料分配到 Redis 實體 1 上,用戶 id 在 10000-19999 之間的用戶所關聯的資料分配到實體 2 上,以此類推,這種磁區方案的維護成本比較高,需要專門的張表來維護映射關系,而且維護的成本隨著業務的復雜度成比例增加,散列磁區要比范圍磁區高效得多,它只需要對資料的 key 進行一次哈希運算,根據具體方案的不同進行不同的計算即可得到 key 應在的實體,常用的散列磁區方案一般有兩種:哈希取模一致性哈希

哈希取模就是將前面提到的哈希運算得到的數值,對 Redis 實體數取模,便得到資料應在的節點位置,比如一個 key 哈希運算后得到的值是 93024922,Redis 實體數為 4,那么這個 key 應在的節點位置為 93024922 % 4 = 2,即第三個節點上,了解了哈希取模的實作之后,我們可以發現,這種方案分布式下的擴展性不好,如果最初我們采用 5 個實體進行資料磁區,后面需要增加實體數,就需要將所有的資料進行重新磁區,在資料量大的情況下,這將是非常耗時的操作,這樣也同時破壞了可用性,

一致性哈希同樣是對 key 先進性哈希運算得到一個散列值 h0,同時對每個節點節點的唯一標識(如 ip)也采用相同的散列函式,得到哈希值 hx,將 h0 依次同每個節點得到的哈希值進行比較,得到哈希值大于 h0 的最小的節點位置,比如 h0 為 5,hx 的值依次為 1,3,6,8,10,最終這個 key 會被分配到 hx 為 6 的實體,一致性哈希是分布式應用常用的演算法,這里不做過多詳細介紹,在增加節點時,一致性哈希不需要將全部資料重新計算,磁區,增加節點只會影響到與新節點相鄰的下一個節點的資料分布,

介紹完了資料磁區的方案之后,還有一個問題需要考慮:資料磁區的實作方式,一種比較原始的方式就是客戶端自己取實作磁區邏輯,即客戶端磁區,這種方式增加了客戶端代碼的復雜度,不過卻方便開發人員進行除錯與調優,通過下圖我們可以發現,每個客戶端都要與每個 Redis 實體至少建立一個連接,不管查詢的資料在那個實體,這樣當大量并發請求過來時,很容易導致服務端壓力過大而影響性能,
在這里插入圖片描述
要解決客戶端磁區方式存在的問題,只需要在客戶端與服務端之間增加一個代理層,這種方式被稱為代理磁區,采用這種方式,后端服務層的架構對客戶端來說是透明的,客戶端只需要與代理層建立連接即可,分片的邏輯由代理層取實作,目前有較多開源的解決方案,比如推特的 twemproxy,國內開源的 predixy,豌豆莢的 codis,
在這里插入圖片描述
除了上面兩種磁區的方式,第三種是查詢路由方式,采用這種方式時,客戶端可以與集群中的任意一個節點建立連接并操作資料,如果要操作的資料碰巧就在這個節點上,直接處理并回傳即可,如果不在這個節點,則將此資料所在的節點資訊回傳客戶端,客戶端重定向到目標節點進行資料操作(如下圖),這便是 Redis-Cluster 的作業方式,Redis-Cluster 采用預磁區的方式降低了資料遷移的成本,Redis-Cluster 將資料提前分到 16384 個槽位中,資料對應的槽位是固定的,每個節點管理的槽位可以進行動態分配,這樣很方便的實作了在線擴縮容,
在這里插入圖片描述
由于哈希取模和一致性哈希的方案在擴縮容時,存在資料丟失或者資料遷移的成本較高,一般我們只有在使用 Redis 作為快取時才采用,增加節點時不進行資料遷移,出現擊穿時從資料庫查詢一下再寫入快取即可,對于應該遷移走的資料,可以采用淘汰策略進行冷資料的淘汰,在使用 Redis 作為資料庫時,一般只能選擇 Redis-Cluster 作為磁區方式,這樣可以保證運行時的資料再平衡,

參考資料:磁區:怎樣將資料分布到多個redis實體

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/294668.html

標籤:其他

上一篇:浮點型資料存盤和整型資料存盤區別的那點事

下一篇:gRPC-go原始碼剖析五十一之場景三:在同一條鏈路上,發起多次rpc呼叫時,為什么第二次之后的頭幀位元組數非常小呢?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more