天天看點

Redis架構與媒體選擇指引 ——民科

内容簡要:

一、Redis叢集架構

二、Redis存儲媒體

三、從社群到企業版

Redis架構與媒體選擇指引 ——民科

如上圖所示,Redis叢集架構分為兩大類:标準版與叢集版。

标準版是最原始的Redis單程序模式,标準版細分為雙副本、單副本、讀寫分離三個類别。

叢集版分為代理模式與直連模式。業務從标準版遷移到叢集版時的可能存在Redis指令不相容,代理模式可以通過Proxy幫業務解決這方面問題。直連模式中,Redis Client通過Redis Cluster模式直連Redis DB節點,做到減少網絡時延,提升一定的性能。這兩種連接配接模式下分别支援了雙副本跟單副本兩種資料形态。

(一)标準版

Redis架構與媒體選擇指引 ——民科

如上圖所示,标準版的拓撲結構是業務在ECS直接通過SLB連接配接到後端的 Redis節點。這裡Redis節點會有兩種情況,第一種情況是左圖的一組一備,程序B是一個熱備,主備之間資料直接進行同步。第二種情況是右圖的冷備,隻有在主節點挂掉以後,冷備會被拉起,這個時候資料是空的。

●      使用場景:

1.    對Redis協定相容性要求較⾼的業務;

2.    單個Redis性能壓⼒可控的場景;

3.  Redis指令相對簡單,排序和計算之類的指令較少的場景。

标準版細分為:雙副本、單副本和讀寫分離三種形态,下面逐一介紹。

1.标準版 - 雙副本

Redis架構與媒體選擇指引 ——民科

标準版-雙副本模式采用主從(Master-Replica)模式搭建。主節點提供日常服務通路,備節點提供HA高可用,當主節點發生故障,系統會自動在30秒内切換至備節點,保證業務平穩運作。

●      特點:

1.    可靠性:采用雙機主從(Master-Replica)架構,主從節點位于不同實體機。主節點對外提供通路,使用者可通過Redis指令行和通用用戶端進行資料的增删改查操作。當主節點出現故障,自研的HA系統會自動進行主從切換,保證業務平穩運作。

2.    資料可靠:預設開啟資料持久化功能,資料全部落盤。支援資料備份功能,使用者可以針對備份集復原執行個體或者克隆執行個體,有效地解決資料誤操作等問題。同時,在支援容災的可用區(例如杭州可用區H+I)建立的執行個體,還具備同城容災的能力。

兩個副本之間的資料實時異步同步,切換主備時可能存在延遲情況。當主節點當機的時候,可能存在一部分資料沒有同步到B程序(即備節點)上,此時如果進行主備切換,B程序相對于A程序有同步延遲,可能存在部分資料丢失。

此外,在雙副本中可以做資料的克隆,即備份機,備份到另一個地方做資料持久化。當業務需要做資料復原時,可以從備份機上進行恢複。

2.标準版 – 單副本

Redis架構與媒體選擇指引 ——民科

标準版-單副本采用單個資料庫節點部署架構,沒有可實時同步資料的備用節點,不提供資料持久化和備份政策,使用于資料可靠性要求不高的純緩存業務場景使用。

1.    純緩存類業務使用,單副本隻有一個線上資料節點,成本效益高;

2.    阿裡雲自研HA高可用系統,異常30秒自動切換。

單副本在使用時需要注意,當高可用節點A當機後,需要先對B節點進行緩存的預熱,避免切換後發現B節點無資料可用。

3.讀寫分離

Redis架構與媒體選擇指引 ——民科

針對讀多寫少的業務場景,雲資料庫Redis推出了讀寫分離版的産品形态,提供高可用、高性能、靈活的讀寫分離服務,滿足熱點資料集中及高并發讀取的業務需求,最大化地節約運維成本。

ECS執行個體通過Proxy節點,可以将讀寫請求分發到主節點資料分片,并将部分讀請求分發到其他隻讀節點。

1.    讀取請求QPS壓力較大:适合讀多寫少型業務;

2.    對Redis協定相容要求較高的業務。

●      建議與使用須知:

1.    非特殊需求不建議使用,QPS壓力大的業務建議使用叢集版;

2.    當一個隻讀節點發生故障時,請求會轉發到其他節點;如果所有隻讀節點均不可用,請求會全部轉發到主節點,導緻主節點壓力過大;

3.    隻讀節點發生異常時,高可用系統會暫停異常節點服務進行重搭恢 複,但不承諾隻讀節點的恢複時間名額;

4.    隻讀節點資料舊于主節點且落後時間可能很長。

(二)叢集版

Redis架構與媒體選擇指引 ——民科

1.    資料量較大的場景;

2.  QPS壓力較大的場景;

3.    吞吐密集型(網絡帶寬較大)應用場景。

1.叢集版 – 雙副本

Redis架構與媒體選擇指引 ——民科

雲資料庫Redis版提供雙副本叢集版執行個體,可輕松突破Redis自身單線程瓶頸,滿足大容量、高性能的業務需求。叢集版支援代理和直連兩種連接配接模式。

1.    資料量大:相比Redis标準版,叢集版可以有效地擴充存儲量,最大 可達4098 GB,能有效的滿足業務擴充的需求;

2.  QPS壓力較大:标準版Redis無法支撐較大的QPS,需要采用多分片的部署方式來突破Redis單線程的性能瓶頸;

3.    吞吐密集型應用:相比Redis标準版,叢集版的内網吞吐限制相對較低,可以更好地支援熱點資料讀取、大吞吐類業務;

4.    對Redis協定相容性不敏感的應用:叢集版對Redis協定支援上相比标準版本有一定的限制。

Redis架構與媒體選擇指引 ——民科

代理模式因所有請求都需要通過代理伺服器轉發,代理模式在降低業務開發難度的同時也會小幅度影響Redis服務的響應速度,如果業務響應速度的要求非常高,可以選擇直連模式,繞過代理伺服器直連後端資料分片,進而降低網絡開銷和服務響應時間,直連模式适用于對響應要求較高的業務。

2.叢集版 – 指令限制

●      不支援指令

1.  SWAPDB

2.  CLIENT ID

3.  SORT (BY和GET)

●      受限指令

在叢集模式下如果需要執行受限制的指令,需要使用Hash Tag確定所要操作的Key在同個Hash Slot中,Hash Tag的詳細用法參見Redis官方文檔。

Redis架構與媒體選擇指引 ——民科

可以看到,許多受限指令為多Key指令,為什麼多Key指令會受到限制?

因為叢集版會根據資料的Key做一次性Hash,分散到不同的資料節點上,這些涉及到多Key的指令,key經過Hash後如果分布在不同的節點上,指令就不能在一個單資料節點裡面完成,這些指令會直接傳回錯誤。

如果要使用這些多Key指令,需要每一個Key準确Hash到同一個Slot上。Redis的Key可以添加一個Hash Tag,相同的Tag會被Hash到同一個Slot上,在同一個Slot中,這些受限的指令就可以支援。

●      Lua腳本使用限制:

1.    所有Key都應該由KEYS數組來傳遞;

2.    所有Key必須在同一個Slot上;

3.    調用必須要帶有Key;

4.    不支援釋出訂閱消息;

5.    不支援UNPACK函數;

6.    其他詳細限制參見Redis官方文檔。

3.叢集模式如何選型

●      選型時應注意以下兩點:

1.    評估QPS和容量時⼀定要為未來留有餘量;

2.    不同架構間存在一定的相容性問題,業務允許的情況下盡量使用不同架構指令支援集合的交集,以便後續架構切換。

Redis架構與媒體選擇指引 ——民科

如上圖所示,簡言之,如果業務qps低且容量低(小于32GB)選擇标準版,否則選擇叢集版。

Redis架構與媒體選擇指引 ——民科

在選擇标準版的情況下,根據資料可靠性與讀寫情況可再進行細分。

如果業務資料單純作為緩存加速或資料可丢,可以選擇單副本,減少一半的成本。如果要求資料在異常情況下不能全部丢失,對可靠性要求較高的情況下,此時要根據讀寫情況進行選擇。

如果讀寫情況沒有明顯差異,可以選擇雙副本,如果讀請求數量遠大于寫請求,可以選擇讀寫分離。但是除去特殊情況,讀寫分離有諸多限制,大多數情況下不是一個很好的選擇,我們還是建議考慮叢集的模式。

Redis架構與媒體選擇指引 ——民科

如果使用者原本使用标準版,随着業務的發展QPS容量上升,需要由标準版切換成叢集版,根據指令相容性可選擇不同模式。

如果使用者業務代碼有太多需要修改,或者不想修改代碼,對指令相容性要求較高,可以選擇代理模式,相容性問題由阿裡雲提供的Proxy解決。如果業務對相容性要求較低,或者新業務在開發時本就是按照叢集版标準進行,則可選擇直連模式。

模式選擇完之後,可根據業務對資料可靠性的要求,進一步選擇單副本或雙副本。此處的單雙副本使用注意事項,與标準版類似。

 二、Redis存儲媒體

Redis架構與媒體選擇指引 ——民科

購買Redis時還需選擇存儲媒體,目前阿裡雲提供四種存儲媒體,分别為記憶體型、持久記憶體型、容量存儲型和混合存儲型。

記憶體型為我們常見的純記憶體,混合存儲型正逐漸被持久記憶體型與容量存儲型替代,下面重點介紹持久記憶體型與容量存儲型。

(一)持久記憶體型

Redis架構與媒體選擇指引 ——民科

Redis企業版持久記憶體型(簡稱持久記憶體型)基于Intel 傲騰™資料中心級持久記憶體(AEP),為使用者提供大容量、相容Redis的記憶體資料庫産品。單執行個體成本對比Redis社群版最高可降低30%,且資料持久化不依賴傳統磁盤,保證每個操作持久化的同時提供近乎Redis社群版的吞吐和延時,極大提升業務資料可靠性。

1.    超高成本效益:相同容量下對比阿裡雲Redis社群版本,價格降低30%左右;

2.    大規格優化:解決AOF的造成的性能開銷,無需在性能和持久化之間取舍;

3.    掉電資料不丢失:每個寫操作都同步持久化;

4.    高相容性:相容現有阿裡雲Redis資料庫體系。

(二)容量存儲型

Redis企業版容量存儲型(簡稱容量存儲型)基于雲盤ESSD研發,相容Redis核心資料結構與接口,可提供大容量、低成本、強持久化的資料庫服務。容量存儲型在降低成本和提升資料可靠性的同時,也解決了原生Redis固有的Fork指令而預留部分記憶體的問題。适用于相容Redis、需要大容量且較高通路性能的溫冷資料存儲場景。

1.    相容性:相容大部分原生Redis指令;

2.    成本:最低為Redis社群版的15%。

(一)阿裡雲叢集能力

Redis架構與媒體選擇指引 ——民科

阿裡雲Redis與開源版Redis叢集能力對比

(二)開源Redis叢集實作

Redis架構與媒體選擇指引 ——民科

●      實作細節:

1.    通過Gossip使所有Redis節點彼此互相心跳探活,使用内部的二進制協定優化傳輸速度和帶寬;

2.    節點Fail時通過叢集中超過半數節點探活協商确定失敗,如果叢集較大則會拉長協商時間;

3.    節點間資料遷移是按照Key的粒度進行的,遷移過程中一個Slot的資料會分布在兩個節點上。

●      優點:

使用Gossip協定無中心控制,無額外控制節點。

●      缺點:

1.    無中心控制,叢集狀态更新慢,故障HA慢;

2.    探活方式單一,受慢查詢幹擾,容易誤切換;

3.    按Key遷移,大Key遷移造成服務卡頓;

4.    遷移異常中斷,無法自動恢複;

5.    遷移期間多Key指令失敗;

6.    遷移依賴外部元件。

(三)阿裡雲Redis叢集實作

Redis架構與媒體選擇指引 ——民科

1.    中心控制節點采用自研的多因子進行準确的探活;

2.    資料遷移采用Slot粒度Precopy的方式,遷移快速,異常可復原。

1.    準确快速的探活,保障服務品質(SLA<15s);

2.    同時支援直連模式和代理模式;

3.    擴縮容業務無感覺(大Key,多key,Lua),不斷連接配接;

4.    遷移流量在節點間直接傳輸,不需要外部元件中轉。