Redis 集群模式

一、集群模式概述

Redis 中哨兵模式雖然提高了系統的可用性,但是真正存儲數據的還是主節點和從節點,并且每個節點都存儲了全量的數據,此時,如果數據量過大,接近或超出了 主節點 / 從節點機器的物理內存,就會出現嚴重的問題;

集群模式就是為了解決這個問題的,它通過引入更多的主節點和從節點,每一組主節點及其所對應的從節點存儲了數據全集的一部分,多組這個的結構構成了一個更大的整體,這就是集群

如下圖所示,假定引入了三組主從節點來存儲全量數據,那么每組機器只需要存儲全集的 1/3 即可,其中每組機器中的每個節點保存的數據內容是一樣的,這樣的一組機器(包含一個主節點和多個從節點)也稱為一個分片;

?此時,如果全量數據繼續增加,就只需引入更多的分片即可;

二、數據分片算法

1. 哈希求余

設有 N 個分片,使用 [0,N-1] 來編號;

哈希求余就是針對給定的 key,先根據一個 hash 函數計算出 hash 值(例如使用 MD5 算法計算 hash 值),再把得到的結果進行 % N,得到的結果就是其所對應的分片編號;

優點:簡單高效,數據分配均勻;

缺點:一旦需要進行擴容,N 就會改變,導致原有的映射規則被破壞(hash(key) % N),就需要讓節點之間的數據相互傳輸,重新排列,以滿足新的映射規則,此時需要搬運的數據量非常多,開銷很大;

2. 一致性哈希算法

首先,把 [0,2^32-1] 這個數據空間,映射到一個圓環上,數據按照順時針方向增長;

假設存在三個分片,如下圖所示

假設有一個 key,通過 hash 函數計算得到 hash 值 H,那么這個 key 對應的分片就是從 H 所在位置,順時針往下找,找到的第一個分片;

這就相當于,N 個分片的位置,把整個圓環分成了 N 個區間,key 的 hash 值落在某個區間內,就歸對應區間管理;

當需要擴容時,原有分片在環上的位置不動,只需要在環上新安排一個分片位置即可;

優點:大大降低了擴容時數據搬運的規模,提高了擴容操作的效率;

缺點:數據分配不均勻(有的分片數據多,有的少,數據傾斜);

3. 哈希槽分區算法(Redis 采用)

為了解決上述搬運成本高 和 數據分配不均勻的問題,Redis cluster 引入了哈希槽 (hash slots) 算法;

hash_slot = crc16(key) % 16384

16384 = 16 * 1024 = 2 ^ 14,這就相當于把整個 hash 值,映射到 16384 個槽位上,即[0,16383]然后再把這些槽位比較均勻的分配給每個分片,同時每個分片的節點都要記錄自己持有哪些分片;

比如有三個分片,則槽位的分配方式可能為:

  • 0 號分片:[0,5461],共 5462 個槽位
  • 1 號分片:[5462,10923],共 5462 個槽位
  • 2 號分片:[10924,16383],共 5460 個槽位

每個分片的節點使用 位圖 來表示自己持有哪些槽位,對于 16384 個槽位來說,需要 2048 個字節即 2 KB 大小的內存空間來表示;

當需要進行擴容時,比如新加一個 3 號分片,就可以針對原有的槽位進行重新分配,分配的結果可能為:

  • 0 號分片:[0,4095],共 4096?個槽位
  • 1 號分片:[5462,9557],共 4096 個槽位
  • 2 號分片:[10924,15019],共 4096 個槽位
  • 3 號分片:[4096,5461],[9558,10923],[15020,16383],共 4096 個槽位

在實際使用 Redis 集群分片的時候,不需要手動指定哪些槽位分配給某個分片,只需要告訴某個分片應該持有多少個槽位即可,Redis 會自動完成后續的槽位分配,以及對應的 key 搬運的工作;

為什么是 16384 個槽位呢?

Redis 官方的解釋是:節點之間通過心跳包通信,心跳包中包含了該節點持有哪些 slots,這個是使用位圖這樣的數據結構表示的,表示 16384 (16k) 個 slots,需要的位圖大小是 2KB,如果給定的 slots 數更多了,比如 65536 個了,此時就需要消耗更多的空間,8 KB 位圖表示了,8 KB,對于內存來說不算什么,但是在頻繁的網絡心跳包中,還是?個不小的開銷的;

另一方面,Redis 集群一般不建議超過 1000 個分片,所以 16k 對于最大 1000 個分片來說是足夠用的,同時也會使對應的槽位配置位圖體積不至于很大;

三、集群故障處理

1. 故障判定

集群中的所有節點,都會周期性的使用心跳包進行通信;

  • 當節點 A 給節點 B 發送 ping 包,B 就會給 A 返回一個 pang 包;每個節點,每秒鐘,都會給一些隨機的節點發起 ping 包,這樣設定是為了避免在節點很多的時候,心跳包也非常多;
  • 若節點 A 給節點 B 發起 ping 包,B 不能如期回應時,此時?A 就會嘗試重置和 B 的 tcp 連接,看能否連接成功,如果仍然連接失敗,A 就會把 B 設為 PFAIL 狀態(相當于主觀下線);
  • 當A 判定 B 為 PFAIL 之后,會通過 redis 內置的 Gossip 協議,和其他節點進行溝通,向其他節點確認 B?的狀態,(每個節點都會維護一個自己的 "下線列表",由于視角不同,每個節點的下線列表也不?定相同);
  • 此時 A 發現其他很多節點,也認為 B 為 PFAIL,并且數目超過總集群個數的一半,那么 A 就會把 B 標記成 FAIL (相當于客觀下線),并且把這個消息同步給其他節點 (其他節點收到之后,也會把 B 標記成 FAIL)

至此 B 就被徹底判定為故障節點了;

若某部分節點宕機,有可能會引起整個集群宕機 (整個集群處于 fail 狀態),主要有以下三種情況:

  • 某個分片上的主節點和所有從節點都掛了
  • 某個分片上的主節點掛了,并且沒有從節點(可歸納為第一種)
  • 超過半數的主節點掛了(此時就無法完成投票選舉主節點的工作了)

2. 故障遷移

在上述故障判定中,若 B 是從節點,則不需要進行故障遷移,若 B 是主節點,并假設 B 有兩個從節點 C 和 D,此時就會由 從節點 C D 觸發故障遷移(把從節點提拔為主節點);

故障遷移的具體步驟為:

  1. 從節點判定自己是否具有參選資格:?如果從節點和主節點已經太久沒通信(此時認為從節點的數據和主節點差異太了)時間超過閾值就失去競選資格; ??
    1. 具有資格的節點,比如?C??D會先休眠定時間,休眠時間?=?500ms?基礎時間?+?[0500ms]?隨機時間?+?排名?*?1000ms,offset?的值越大,則排名會越靠前(越);?
    2. ?C?的休眠時間到了C?就會給其他所有集群中的節點進行拉票操作,但是只有主節點才有投票資格
    3. 主節點就會把自己的票投給?C?(每個主節點只有?1?票)?C?收到的票數超過主節點數目的C?就會晉升成主節點(C?自己負責執行?slaveof?no?one并且讓?D?執行?slaveof?C)
    4. 同時,C?還會把自己成為主節點的消息同步給其他集群的節點;大家也都會更新自己保存的集群結構信息;

四、集群擴容

1. 把新的主節點加入到集群

redis-cli --cluster add-node (新的主節點的ip地址和端口號) (集群中任意節點的ip地址和端口號)

2. 重新分配 slots

redis-cli --cluster reshard (集群中任意節點的ip地址和端口號)

3. 給新的主節點添加從節點

redis-cli --cluster add-node (新的從節點的ip地址和端口號) (集群中任意節點的ip地址和端口號) --cluster-slave --cluster-master-id (新的主節點的 nodeId)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/37489.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37489.shtml
英文地址,請注明出處:http://en.pswp.cn/web/37489.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

個人網站制作 Part 28 添加用戶活動跟蹤功能 | Web開發項目添加頁面緩存

文章目錄 👩?💻 基礎Web開發練手項目系列:個人網站制作🚀 添加用戶活動跟蹤功能🔨使用分析工具🔧步驟 1: 選擇分析工具🔧步驟 2: 注冊Google Analytics賬戶🔧步驟 3: 獲取Analytics…

Java面試題--JVM大廠篇之深入了解G1 GC:高并發、響應時間敏感應用的最佳選擇

引言: 在現代Java應用的性能優化中,垃圾回收器(GC)的選擇至關重要。對于高并發、響應時間敏感的應用而言,G1 GC(Garbage-First Garbage Collector)無疑是一個強大的工具。本文將深入探討G1 GC適…

李一桐遭遇蜈蚣驚魂

李一桐遭遇“蜈蚣驚魂”!劉宇寧展現真男人本色在娛樂圈的幕后,總有一些心跳加速的驚險。近日,李一桐在拍戲時遭遇了一場“蜈蚣驚魂”,讓無數粉絲和網友為她捏了一把冷汗。而在這場驚險的遭遇中,劉宇寧展現出了真男人的…

NOI大綱——普及組——二叉搜索樹

二叉搜索樹 二叉搜索樹(Binary Search Tree,簡稱BST)是一種特殊的二叉樹,它具有以下幾個特點: 節點的左子樹上的所有節點的值都小于或等于該節點的值。節點的右子樹上的所有節點的值都大于或等于該節點的值。每個節點…

ActiveMq工具之管理頁面說明

文章目錄 安裝ActiveMQ一: 訪問管理頁面二: 進入管理頁面,主頁三: Queues頁說明四: Topics頁說明五: Subscribers頁說明 安裝ActiveMQ wget https://archive.apache.org/dist//activemq/5.13.3/apache-activemq-5.13.3-bin.tar.gz wget https://mirrors.huaweiclou…

為什么越來越多的企業選擇外包?賦能企業未來

軟件開發過程包括設計需求、設計方案、產品研發、產品交付、后期維護,許多企業并沒有軟件開發的專業能力與工作經驗,將軟件開發工作進行外包是比較節約成本的,企業能少走不少彎路。 YesPMP平臺(一站式軟件外包、項目外包服務-YesP…

UWA Pipeline 2.6.1版本更新

UWA Pipeline是專為游戲開發團隊設計的本地協作平臺,旨在幫助團隊建立專業的DevOps研發交付流水線。本平臺提供了可視化的CI/CD操作界面,高可用的自動化測試和無縫集成的UWA性能保障服務等核心功能。 在最新的Pipeline更新中,UWA引入了參數配…

protobufjs解析proto消息出錯RangeError: index out of range: 2499 + 10 > 2499解決辦法

使用websocket通訊傳輸protobuf消息的時候,decode的時候出錯了: RangeError: index out of range: 2499 10 > 2499 Error: invalid wire type 4 at offset 1986 出現這種錯誤的時候,99%是因為proto里面的消息類型和服務端發送的消息類型不…

vue表頭字段添加鼠標懸浮提示

<el-table-column prop"jfScore" align"center" min-width"100px"><template slot"header" slot-scope"scope"><div><span>信用積分</span><el-tooltip:aa"scope"class"it…

Java錯題歸納(二)

1、若有如下接口A的定義&#xff0c;下列哪些類下確實現了該接口&#xff1a;C interface A { void method1(int i); void method2(int j); } A class B implements A{ void method1( ) { } void method2( ) { } } B class B implements A { void method1(int i ) { }…

關于windows,wifi圖標顯示不了的解決方法

解決方法一&#xff08;解決了我的問題的方法&#xff09;&#xff1a; winr -->輸入 regedit 打開注冊表 --> 刪除HKEY-CLASSES_ROOT\CLSID\{3d09c1ca-2bcc-40b7-b9bb-3f3ec143a87b} CLSID在下面仔細找&#xff0c;然后找到09開頭那個刪掉重啟就可以了&#xff0c;可能…

別小看ai智能語音機器人但也別神話它電銷機器人部署語音識別‘次數活動

人類社會的發展不斷在加速&#xff0c;現代人對新事物接納的速度變得越來越快&#xff0c;進而對新事物、新模式的期待也越來越多、頻率越來越高。 僅聚焦在電銷領域&#xff0c;當將視線回撥&#xff0c;我們會發現作為新技術與新模式的代表&#xff0c;電銷從20世紀中后期引進…

CAS服務端部署

部署CAS Cas服務端其實就是一個war包。 在資源\cas\source\cas-server-4.0.0-release\cas-server-4.0.0\modules目錄下cas-server-webapp-4.0.0.war 將其改名為cas.war放入tomcat目錄下的webapps下。啟動tomcat自動解壓war包。瀏覽器輸入 登錄頁面 http://localhost:8080/ca…

nuxt3搭建和部署

Nuxt 3是一個基于Vue 3的靜態網站生成框架&#xff0c;它提供了高性能、SEO友好的Web應用程序開發體驗。Nuxt 3重寫了許多核心代碼&#xff0c;增加了新功能&#xff0c;如基于Vite的構建系統、改進的路由系統、數據獲取和插件系統。它支持TypeScript和多種渲染模式&#xff08…

20240701 每日AI必讀資訊

&#x1f3eb;AI真煉丹&#xff1a;整整14天&#xff0c;無需人類參與 - 英矽智能推出全球首個AI參與決策的生物學實驗室&#xff0c;實現了14天內完成靶點發現和驗證的全自動化閉環實驗。 - 該實驗室由PandaOmics平臺驅動&#xff0c;集成多種預測模型和海量數據&#xff0…

conda安裝d2l教程

前言 提前安裝anaconda為什么直接安裝d2l會出錯&#xff1f;- 因為python版本問題&#xff0c;最好的解決辦法就是利用conda來建立一個虛擬的環境 第一步 創建新的虛擬環境 打開conda命令行&#xff0c;也就是anaconda prompt輸入下面的命令 conda create --name d2l pytho…

【Python】從基礎到進階(二):了解Python語言基礎以及數據類型轉換、基礎輸入輸出

&#x1f525; 個人主頁&#xff1a;空白詩 文章目錄 一、引言二、基本數據類型轉換1. 隱式轉換2. 顯式轉換 三、基本輸入輸出1. 輸入&#xff08;input&#xff09;2. 輸出&#xff08;print&#xff09;3. 案例&#xff1a;輸入姓名、年齡、身高以及體重&#xff0c;計算BMI指…

《從零開始學習大語言模型》專欄來啦!

歡迎來到我的專欄LLM-from-scratch&#xff0c;這是一個致力于從零開始學習和掌握大語言模型的知識寶庫。無論你是剛入門的新手&#xff0c;還是想要深入了解的高級用戶&#xff0c;這里都有適合你的內容。以下是專欄的精彩章節&#xff1a; LLM-from-scratch-1.圖解tokenizat…

DM表級觸發器

可以理解為行變動級 觸發體中寫邏輯 這是表修改時調用存儲過程 感謝大哥分享: https://blog.csdn.net/WuLex/article/details/83181449 感謝大哥分享: https://blog.csdn.net/ChennyWJS/article/details/131913198

湘潭大學軟件工程信息與網絡安全復習筆記最后一篇

文章目錄 復習建議分數占比流密碼A5/1RC4 分組密碼DESAES 復習建議 現在筆者復習算是收尾了&#xff0c;現在也是考前的最后一天了&#xff0c;走了不少彎路&#xff0c;但是可能也是必不可少的&#xff0c;復習建議是硬著頭皮把這份文件看一遍&#xff0c;不理解的地方找英文…