Redis的三種叢集模式
Redis的三種叢集模式
Redis支援三種叢集方案
- 主從複製模式
- Sentinel(哨兵)模式
- Cluster模式
一、主從複製模式
1、主從複製的作用
通過持久化功能,Redis保證了即使在伺服器重啟的情況下也不會丟失(或少量丟失)資料,因為持久化會把記憶體中資料儲存到硬碟上,重啟會從硬碟上載入資料。 但是由於資料是儲存在一臺伺服器上的,如果這臺伺服器出現硬碟故障等問題,也會導致資料丟失。
為了避免單點故障,通常的做法是將資料庫複製多個副本以部署在不同的伺服器上,這樣即使有一臺伺服器出現故障,其他伺服器依然可以繼續提供服務。
為此, Redis 提供了複製(replication)功能,可以實現當一臺資料庫中的資料更新後,自動將更新的資料同步到其他資料庫上。
在複製的概念中,資料庫分為兩類,一類是主資料庫(master),另一類是從資料庫(slave)。主資料庫可以進行讀寫操作,當寫操作導致資料變化時會自動將資料同步給從資料庫。而從資料庫一般是隻讀的,並接受主資料庫同步過來的資料。一個主資料庫可以擁有多個從資料庫,而一個從資料庫只能擁有一個主資料庫。
2、主從複製的目的
1)一個是讀寫分離,分擔 "master" 的讀寫壓力
2)一個是方便做容災恢復
3、主從複製的優缺點
優點:
1)master能自動將資料同步到slave,可以進行讀寫分離,分擔master的讀壓力
2)master、slave之間的同步是以非阻塞的方式進行的,同步期間,客戶端仍然可以提交查詢或更新請求
缺點:
1)不具備自動容錯與恢復功能,master或slave的宕機都可能導致客戶端請求失敗,需要等待機器重啟或手動切換客戶端IP才能恢復
2)master宕機,如果宕機前資料沒有同步完,則切換IP後會存在資料不一致的問題
3)難以支援線上擴容,Redis的容量受限於單機配置
二、Sentinel(哨兵)模式
1、什麼是哨兵模式?
第一種主從同步/複製的模式,當主伺服器宕機後,需要手動把一臺從伺服器切換為主伺服器,這就需要人工干預,費事費力,還會造成一段時間內服務不可用。這不是一種推薦的方式,更多時候,我們優先考慮哨兵模式。
哨兵模式是一種特殊的模式,首先 Redis 提供了哨兵的命令,哨兵是一個獨立的程序
2、哨兵模式的作用
1)通過傳送命令,讓 Redis 伺服器返回監控其執行狀態,包括主伺服器和從伺服器;
2)當哨兵監測到 master 宕機,會自動將 slave 切換成 master ,然後通過釋出訂閱模式通知其他的從伺服器,修改配置檔案,讓它們切換主機。
3、多哨兵模式
然而一個哨兵程序對Redis伺服器進行監控,也可能會出現問題,為此,我們可以使用多個哨兵進行監控。各個哨兵之間還會進行監控,這樣就形成了多哨兵模式。
4、故障切換的過程
假設主伺服器宕機,哨兵1先檢測到這個結果,系統並不會馬上進行 failover 過程,僅僅是哨兵1主觀的認為主伺服器不可用,這個現象成為主觀下線。當後面的哨兵也檢測到主伺服器不可用,並且數量達到一定值時,那麼哨兵之間就會進行一次投票,投票的結果由一個哨兵發起,進行 failover 操作。切換成功後,就會通過釋出訂閱模式,讓各個哨兵把自己監控的從伺服器實現切換主機,這個過程稱為客觀下線。這樣對於客戶端而言,一切都是透明的。
5、哨兵模式的優缺點
優點:
1)哨兵模式是基於主從模式的,所有主從的優點,哨兵模式都具有。
2)主從可以自動切換,系統更健壯,可用性更高(可以看作自動版的主從複製)。
缺點:
Redis較難支援線上擴容,在叢集容量達到上限時線上擴容會變得很複雜。
三、Cluster叢集模式(Redis官方)
1、什麼是叢集模式?
Redis Cluster是一種伺服器 Sharding 技術,3.0版本開始正式提供。
Redis 的哨兵模式基本已經可以實現高可用,讀寫分離 ,但是在這種模式下每臺 Redis 伺服器都儲存相同的資料,很浪費記憶體,所以在 redis3.0上加入了 Cluster 叢集模式,實現了 Redis 的分散式儲存,也就是說每臺 Redis 節點上儲存不同的內容。
在這個圖中,每一個藍色的圈都代表著一個 redis 的伺服器節點。它們任何兩個節點之間都是相互連通的。客戶端可以與任何一個節點相連線,然後就可以訪問叢集中的任何一個節點。對其進行存取和其他操作。
2、叢集的資料分片
Redis 叢集沒有使用一致性 hash,而是引入了雜湊槽【hash slot】的概念。
Redis 叢集有16384 個雜湊槽,每個 key 通過 CRC16 校驗後對 16384 取模來決定放置哪個槽。叢集的每個節點負責一部分hash槽,舉個例子,比如當前叢集有3個節點,那麼:
節點 A 包含 0 到 5460 號雜湊槽
節點 B 包含 5461 到 10922 號雜湊槽
節點 C 包含 10923 到 16383 號雜湊槽
這種結構很容易新增或者刪除節點。比如如果我想新添加個節點 D , 我需要將節點 A, B, C 中的部分槽移動到 節點D 上。如果我想移除節點 A ,需要將 A 中的槽移到 B 和 C 節點上,然後將沒有任何槽的 A 節點從叢集中移除即可。由於從一個節點將雜湊槽移動到另一個節點並不會停止服務,所以無論新增刪除或者改變某個節點的雜湊槽的數量都不會造成叢集不可用的狀態。
在 Redis 的每一個節點上,都有這麼兩個東西,一個是插槽(slot),它的的取值範圍是:0-16383。還有一個就是 cluster,可以理解為是一個叢集管理的外掛。當我們的存取的 Key到達的時候,Redis 會根據 CRC16 的演算法得出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的雜湊槽,通過這個值,去找到對應的插槽所對應的節點,然後直接自動跳轉到這個對應的節點上進行存取操作。
3、Redis叢集的主從複製模型
為了保證高可用,redis-cluster叢集引入了主從複製模型,一個主節點對應一個或者多個從節點,當主節點宕機的時候,就會啟用從節點。當其它主節點 ping 一個主節點 A 時,如果半數以上的主節點與 A 通訊超時,那麼認為主節點 A 宕機了。如果主節點 A 和它的從節點 A1 都宕機了,那麼該叢集就無法再提供服務了。
4、叢集的特點
1)所有的 redis 節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬。
2)節點的 fail 是通過叢集中超過半數的節點檢測失效時才生效。
3)客戶端與 Redis 節點直連,不需要中間代理層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可。
參考連結:
https://segmentfault.com/a/1190000022808576