【獨家】終生受用的Redis高可用技術解決方案大全

来源:https://www.cnblogs.com/lfs2640666960/archive/2018/07/10/9291933.html
-Advertisement-
Play Games

最近很多朋友向我咨詢關於高可用的方案的優缺點以及如何選擇合適的方案線上使用,剛好最近在給宜人貸,光大銀行做企業內訓的時候也詳細講過,這裡我再整理髮出來,供大家參考,如有不妥之處,歡迎批評指正,也歡迎推薦更好的技術方案。不廢話了,來看看方案吧~ 總綱: Redis常見的幾種主要使用方式: Redis ...


最近很多朋友向我咨詢關於高可用的方案的優缺點以及如何選擇合適的方案線上使用,剛好最近在給宜人貸,光大銀行做企業內訓的時候也詳細講過,這裡我再整理髮出來,供大家參考,如有不妥之處,歡迎批評指正,也歡迎推薦更好的技術方案。不廢話了,來看看方案吧~

總綱:

 

 

Redis常見的幾種主要使用方式:

  • Redis 單副本

  • Redis 多副本(主從)

  • Redis Sentinel(哨兵)

  • Redis Cluster

  • Redis 自研

 

Redis各種使用方式的優缺點:

1、Redis單副本

Redis 單副本,採用單個Redis節點部署架構,沒有備用節點實時同步數據,不提供數據持久化和備份策略,適用於數據可靠性要求不高的純緩存業務場景。

 

優點:

1、架構簡單、部署方便

2、高性價比,當緩存使用時無需備用節點(單實例可用性可以用supervisor或crontab保證),當然為了滿足業務的高可用性,也可以犧牲一個備用節點,但同時刻只有一個實例對外提供服務。

3、高性能

 

缺點:

1、不保證數據的可靠性

2、當緩存使用,進程重啟後,數據丟失,即使有備用的節點解決高可用性,但是仍然不能解決緩存預熱問題,因此不適用於數據可靠性要求高的業務。

3、高性能受限於單核CPU的處理能力(Redis是單線程機制),CPU為主要瓶頸,所以適合操作命令簡單,排序、計算較少的場景。也可以考慮用memcached替代。

 

2、Redis多副本(主從)

Redis 多副本,採用主從(replication)部署結構,相較於單副本而言最大的特點就是主從實例間數據實時同步,並且提供數據持久化和備份策略。主從實例部署在不同的物理伺服器上,根據公司的基礎環境配置,可以實現同時對外提供服務和讀寫分離策略。

優點:

1、高可靠性,一方面,採用雙機主備架構,能夠在主庫出現故障時自動進行主備切換,從庫提升為主庫提供服務,保證服務平穩運行。另一方面,開啟數據持久化功能和配置合理的備份策略,能有效的解決數據誤操作和數據異常丟失的問題。

2、讀寫分離策略,從節點可以擴展主庫節點的讀能力,有效應對大併發量的讀操作。

 

缺點:

1、故障恢複復雜,如果沒有RedisHA系統(需要開發),當主庫節點出現故障時,需要手動將一個從節點晉升為主節點,同時需要通知業務方變更配置,並且需要讓其他從庫節點去複製新主庫節點,整個過程需要人為干預,比較繁瑣。

2、主庫的寫能力受到單機的限制,可以考慮分片

3、主庫的存儲能力受到單機的限制,可以考慮Pika

4、原生複製的弊端在早期的版本也會比較突出,如:Redis複製中斷後,Slave會發起psync,此時如果同步不成功,則會進行全量同步,主庫執行全量備份的同時可能會造成毫秒或秒級的卡頓;又由於COW機制,導致極端情況下的主庫記憶體溢出,程式異常退出或宕機;主庫節點生成備份文件導致伺服器磁碟IO和CPU(壓縮)資源消耗;發送數GB大小的備份文件導致伺服器出口帶寬暴增,阻塞請求。建議升級到最新版本。

 

3、Redis Sentinel(哨兵)

Redis Sentinel是社區版本推出的原生高可用解決方案,Redis Sentinel部署架構主要包括兩部分:Redis Sentinel集群和Redis數據集群,其中Redis Sentinel集群是由若幹Sentinel節點組成的分散式集群。可以實現故障發現、故障自動轉移、配置中心和客戶端通知。Redis Sentinel的節點數量要滿足2n+1(n>=1)的奇數個。

 

優點:

1、Redis Sentinel集群部署簡單

2、能夠解決Redis主從模式下的高可用切換問題

3、很方便實現Redis數據節點的線形擴展,輕鬆突破Redis自身單線程瓶頸,可極大滿足對Redis大容量或高性能的業務需求。

4、可以實現一套Sentinel監控一組Redis數據節點或多組數據節點

 

缺點:

1、部署相對Redis 主從模式要複雜一些,原理理解更繁瑣

2、資源浪費,Redis數據節點中slave節點作為備份節點不提供服務

3、Redis Sentinel主要是針對Redis數據節點中的主節點的高可用切換,對Redis的數據節點做失敗判定分為主觀下線和客觀下線兩種,對於Redis的從節點有對節點做主觀下線操作,並不執行故障轉移。

4、不能解決讀寫分離問題,實現起來相對複雜

 

建議:

1、如果監控同一業務,可以選擇一套Sentinel集群監控多組Redis數據節點的方案,反之選擇一套Sentinel監控一組Redis數據節點的方案

2、sentinel monitor <master-name> <ip> <port> <quorum> 配置中的<quorum>建議設置成Sentinel節點的一半加1,當Sentinel部署在多個IDC的時候,單個IDC部署的Sentinel數量不建議超過(Sentinel數量 – quorum)。

3、合理設置參數,防止誤切,控制切換靈敏度控制

  1. quorum

  2. down-after-milliseconds 30000

  3. failover-timeout 180000

  4. maxclient

  5. timeout

4、部署的各個節點伺服器時間儘量要同步,否則日誌的時序性會混亂

5、Redis建議使用pipeline和multi-keys操作,減少RTT次數,提高請求效率

6、自行搞定配置中心(zookeeper),方便客戶端對實例的鏈接訪問

 

4、Redis Cluster

Redis Cluster是社區版推出的Redis分散式集群解決方案,主要解決Redis分散式方面的需求,比如,當遇到單機記憶體,併發和流量等瓶頸的時候,Redis Cluster能起到很好的負載均衡的目的。Redis Cluster集群節點最小配置6個節點以上(3主3從),其中主節點提供讀寫操作,從節點作為備用節點,不提供請求,只作為故障轉移使用。Redis Cluster採用虛擬槽分區,所有的鍵根據哈希函數映射到0~16383個整數槽內,每個節點負責維護一部分槽以及槽所印映射的鍵值數據。

文章寫到這裡,也給大家送一個福利,給大家推薦一個Java架構方面的交流學習群:650385180,裡面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分散式、微服務架構的原理,JVM性能優化這些成為架構師必備的知識體系。還能領取免費的學習資源,文章開頭的知識總綱也是在群里獲取。相信對於已經工作和遇到技術瓶頸的碼友,在這個群里一定有你需要的內容。 

 

優點:

1、無中心架構

2、數據按照slot存儲分佈在多個節點,節點間數據共用,可動態調整數據分佈。

3、可擴展性,可線性擴展到1000多個節點,節點可動態添加或刪除。

4、高可用性,部分節點不可用時,集群仍可用。通過增加Slave做standby數據副本,能夠實現故障自動failover,節點之間通過gossip協議交換狀態信息,用投票機制完成Slave到Master的角色提升。

5、降低運維成本,提高系統的擴展性和可用性。

 

缺點:

1、Client實現複雜,驅動要求實現Smart Client,緩存slots mapping信息並及時更新,提高了開發難度,客戶端的不成熟影響業務的穩定性。目前僅JedisCluster相對成熟,異常處理部分還不完善,比如常見的“max redirect exception”。

2、節點會因為某些原因發生阻塞(阻塞時間大於clutser-node-timeout),被判斷下線,這種failover是沒有必要的。

3、數據通過非同步複製,不保證數據的強一致性。

4、多個業務使用同一套集群時,無法根據統計區分冷熱數據,資源隔離性較差,容易出現相互影響的情況。

5、Slave在集群中充當“冷備”,不能緩解讀壓力,當然可以通過SDK的合理設計來提高Slave資源的利用率。

6、key批量操作限制,如使用mset、mget目前只支持具有相同slot值的key執行批量操作。對於映射為不同slot值的key由於keys 不支持跨slot查詢,所以執行mset、mget、sunion等操作支持不友好。

7、key事務操作支持有限,只支持多key在同一節點上的事務操作,當多個key分佈於不同的節點上時無法使用事務功能。

8、key作為數據分區的最小粒度,因此不能將一個很大的鍵值對象如hash、list等映射到不同的節點。

9、不支持多資料庫空間,單機下的redis可以支持到16個資料庫,集群模式下只能使用1個資料庫空間,即db 0。

10、複製結構只支持一層,從節點只能複製主節點,不支持嵌套樹狀複製結構。

11、避免產生hot-key,導致主庫節點成為系統的短板。

12、避免產生big-key,導致網卡撐爆、慢查詢等。

13、重試時間應該大於cluster-node-time時間

14、Redis Cluster不建議使用pipeline和multi-keys操作,減少max redirect產生的場景。

 

5、Redis自研 - 推薦

Redis 自研的高可用解決方案,主要體現在配置中心、故障探測和failover的處理機制上,通常需要根據企業業務的實際線上環境來定製化。

 

優點:

1、高可靠性、高可用性

2、自主可控性高

3、貼切業務實際需求,可縮性好,相容性好

 

缺點:

1、實現複雜,開發成本高

2、需要建立配套的周邊設施,如監控,功能變數名稱服務,存儲元數據信息的資料庫等。

3、維護成本高


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

-Advertisement-
Play Games
更多相關文章
  • 在我的理解中,面向對象就是一種萬物皆對象的編程思想,就是把現實世界中所有的事物都當做對象來看待,而每一個對象可以看成是一個事物的實例,面向對象是以對象為中心,以消息為驅動,所以程式=對象+消息; 面向對象有三大特征:封裝 繼承 多態 封裝:將屬性和行為抽象成一個類,將其屬性私有化,行為公開化,提高了 ...
  • 搭建WEB項目過程中,哪些點需要註意: 1、技術選型: 前端:freemarker、vue 後端:spring boot、spring mvc 2、如何包裝返回統一結構結果數據? 首先要弄清楚為什麼要包裝統一結構結果數據,這是因為當任意的ajax請求超時或者越權操作時,系統能返回統一的錯誤信息給到前 ...
  • Object類和常用的API 學習過程中的筆記,涉及到Objetc中的equals方法和toString方法,日期類Date,日曆類Calendar,日期格式化類SimpleDateFormat以及基本數據類型和封裝類的拆箱和裝箱,還有String與基本數據類型的轉換.有錯誤還望諒解 Object類 ...
  • https://blog.csdn.net/zhushanzhi/article/details/77864516 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 [java] view plain copy package test; i ...
  • 目的 : 加強類與對象的記憶體分配理解,加強操作能力、理解數據結構。 結構 : 數據元素之間的關係。 數據結構 : 帶有結構的數據對象。 線性結構: 各數據元素之間的邏輯以用一個線性序列簡單的表達出現。反之為非線性結構。 按邏輯結構分為 : 線性結構與非線性結構。 線性結構包括:線性表-數組(順序表) ...
  • Python學習之路—2018/7/10 博客開發項目流程 ​ 一般來說,一個項目的開發流程分為:項目需求、設計表結構、功能開發、測試功能、產品上線,本次學習以博客園為藍本進行開發。 1.項目需求 博客的開發的需求主要有以下幾點: 基於auth模塊和Ajax實現登錄驗證 基於forms組件和Ajax ...
  • 因為Python是跨平臺的,它可以運行在Windows、Mac和各種Linux/Unix系統上。在Windows上寫Python程式,放到Linux上也是能夠運行的。 要開始學習Python編程,首先要把Python安裝到電腦里。安裝後,可以得到Python解釋器(就是負責運行Python程式的), ...
  • 一直想瞭解下Python,今兒在外面辦事排隊的時候,打開了廖老師的官網,找到了Python教程。雖然只是一篇關於Python的簡介,但是通過將Python的特性與C進行對比,很生動地歸納了Python的一些特性。因為之前花過時間學習C,所以能夠很容易地體會到Python的特性。上學期通過廖老師的教程 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...