redis高可用模式到集群

2021-09-25 10:54:28 字數 3225 閱讀 3688

正常redis是單機的,這樣的話會有乙個問題,如果機器出現問題,不能工作了,那麼redis就停止提供服務了,這對也業務來說是不可接受的,redis可提供的解決方案有哨兵(sentinel),codis,cluster集群模型。

目前主從同步有兩種模式,增量同步和快照同步

增量同步

1. redis講會影響資料庫狀態的指令記錄在記憶體,然後非同步將 buffer 中的指令同步到從節點,從節點一邊執行同步的指 令流來達到和主節點一樣的狀態,一遍向主節點反饋自己同步到**了 (偏移量)。

2. 因為記憶體有限,不能將所有的指令到記錄在記憶體。記憶體buffer是乙個環形陣列,如果滿了,就從頭開始覆蓋,如果從節點的同步跟不上覆蓋的話,那麼就需要全量同步

全量同步

全量同步是很消耗效能的

首先先需要將記憶體的資料刷入到磁碟中,再根據記憶體的資料庫生成乙份rdb檔案,這時候能影響資料庫狀態的操作也需要記錄到記憶體buffer環形陣列中,

通知從伺服器來主伺服器上獲取rdb檔案,並重新整理記憶體,然後再將記憶體buffer同步到從伺服器上。如果快照同 步的時間過長或者複製 buffer 太小,都會導致同步期間的增量指令在複製 buffer 中被覆 蓋,這樣就會導致快照同步完成後無法進行增量複製,然後會再次發起快照同步,如此極有 可能會陷入快照同步的死迴圈。

主從複製模式下,如果master宕機,那麼redis就不再提供寫能力了,需要運維人員手動切換。

sentinel提供了對master節點的檢測,如果master節點宕機了,可以自動地將從節點公升級為master,可以將sentinel提供的能力認為是zookeeper

檢測主觀下線

sentinel 會向其他sentinel和redis伺服器傳送ping訊息,如果在配置的時間範圍內未服務,則將狀態改為主觀下線

檢測客觀下線

當乙個sentinel檢測到redis伺服器下線了,這時候會詢問其他sentinel伺服器,當認為redis下線的機器數量到了配置的數量時,則這台redis伺服器就被認為是客觀下線了

選舉領頭羊

每次選舉(可能會選不出結果)後,紀元計數都會+1

每個發現主伺服器下線的sentinel會要求其他sentinel將自己選為區域性領頭羊

每個sentinel只有乙個選擇

如果有sentinel擁有半數以上的投票,那麼他就成為了領頭羊

如果在限定時間內,沒有選舉出零頭羊,那麼就開啟第二次選舉

故障轉移

從下線的主伺服器中挑選乙個從伺服器,讓他成為主伺服器

讓所有其他從伺服器從這個伺服器中複製

設定舊mater成為新master的從伺服器

sentinel雖然提供了乙個高可用的模型,但是卻並沒有提高redis的效能,比如說寫效能。

入圖所示,cluster提供槽功能,不同的node處理不同的槽,這樣可以平攤master的寫壓力

槽指派

redis 集群通過分片的方式來儲存資料庫中的健值對,集群的整個資料庫被16384個槽,每個key屬於這些槽中的乙個。cluster 缺省會對 key 值使用 crc32 演算法進行 hash 得到乙個整數值,然後用這個整數 值對 16384 進行取模來得到具體槽位。

跳轉

當客戶端向乙個錯誤的節點發出了指令,該節點會發現指令的 key 所在的槽位並不歸自 己管理,這時它會向客戶端傳送乙個特殊的跳轉指令攜帶目標操作的節點位址,告訴客戶端 去連這個節點去獲取資料。

重新分片

當向redis插入乙個新mater-node的時候,會指定槽範圍,這時候會有進行槽分配,需要從原先的槽擁有者遷移到新master上。

redis 遷移的單位是槽,redis 乙個槽乙個槽進行遷移,當乙個槽正在遷移時,這個槽就 處於中間過渡狀態。這個槽在原節點的狀態為 migrating,在目標節點的狀態為 importing,表 示資料正在從源流向目標。下圖就是槽指派和槽中間態定位的過程

遷移工具 redis-trib 首先會在源和目標節點設定好中間過渡狀態,然後一次性獲取源節 點槽位的所有 key 列表(keysinslot 指令,可以部分獲取),再挨個 key 進行遷移。每個 key 的遷移過程是以原節點作為目標節點的「客戶端」,原節點對當前的 key 執行 dump 指令得 到序列化內容,然後通過「客戶端」向目標節點傳送指令 restore 攜帶序列化的內容作為參 數,目標節點再進行反序列化就可以將內容恢復到目標節點的記憶體中,然後返回「客戶端」 ok,原節點「客戶端」收到後再把當前節點的 key 刪除掉就完成了單個 key 遷移的整個過 程。

槽遷移過程中,redis的訪問還是繼續的,這時候redis會先訪問舊節點,因為槽還未遷移完,還是屬於舊節點的,如果舊節點上沒有key,那麼有兩種可能性,1:是在新節點上,2:沒有這個key,這時候redis會發乙個ask命令到新節點上去詢問獲取資料

可能下線 (pfail-possibly fail) 與確定下線 (fail)

與sentinel的主觀下線和客觀下線一樣,因為redis-cluster是去中心化的,所以會有可能下線和確定下線。

如果乙個master節點發現另乙個master節點下線了,那麼記為pfail,然後廣播(用gossip)

如果大部分節點都認為他下線了,那麼就確定他下線了,開始故障轉移

從該節點下的從節點中選擇乙個節點

被選中的節點會成為新的master節點,並且將槽指向自己

然後向集群的其他master節點廣播

選舉新master節點

節點的選舉者是集群中的其他master節點,並且擁有一票選擇,通過訊息傳送選舉

從節點會接收master的訊息(投票),如果票數超過一半,那麼就可以晉公升成為master

Redis 高可用高併發集群配置

高可用 24小時對外提供服務 高併發 同一時間段能處理的請求數 意思是所有的節點都要有乙個主節點 缺點 中心掛了,服務就掛了 中心處理資料的能力有限,不能把節點效能發揮到最大 特點 就是乙個路由作用 特點 去掉路由,我自己來路由 以上通俗的就是 中心化 幾個經過認證的嘉賓在 講話 所有其他人在聽。去...

Redis高可用集群之rediscluster

本文基於redis 5.0.3版本,環境為mac os,單機器上部署。redis cluster集群是乙個由多個主從節點集群組成的分布式服務集群,它具有複製 高可用和分片特性。redis cluster集群需要將每個節點設定成集群模式,這種集群模式沒有中心節點,可水平擴充套件,據官方文件可以線性擴充...

高可用集群

高可用集群主要實現自動偵測 auto detect 故障 自動切換 故障轉移 failover 和自動恢復 failback 簡單來說就是,用高可用集群軟體實現故障檢查和故障轉移 故障 備份主機切換 的自動化,當然像負載均衡 dns分發也可提供高可性。active passive 主備模型 acti...