雲資料庫Redis版不管主從版還是叢集規格,replica作為備庫不對外提供服務,隻有在發生HA的時候,replica提升為master後才承擔讀寫流量。這種架構讀寫請求都在master上完成,一緻性較高,但性能受到master數量的限制。經常有使用者資料較少,但因為流量或者并發太高而不得不更新到更大的叢集規格。
為滿足讀多寫少的業務場景,最大化節約使用者成本,雲資料庫Redis版推出了讀寫分離規格,為使用者提供透明、高可用、高性能、高靈活的讀寫分離服務。
Redis叢集模式有redis-proxy、master、replica、HA等幾個角色。在讀寫分離執行個體中,新增read-only replica角色來承擔讀流量,replica作為熱備不提供服務,架構上保持對現有叢集規格的相容性。redis-proxy按權重将讀寫請求轉發到master或者某個read-only replica上;HA負責監控DB節點的健康狀态,異常時發起主從切換或重搭read-only replica,并更新路由。
一般來說,根據master和read-only replica的資料同步方式,可以分為兩種架構:星型複制和鍊式複制。
星型複制
星型複制就是将所有的read-only replica直接和master保持同步,每個read-only replica之間互相獨立,任何一個節點異常不影響到其他節點,同時因為複制鍊比較短,read-only replica上的複制延遲比較小。
Redis是單程序單線程模型,主從之間的資料複制也在主線程中處理,read-only replica數量越多,資料同步對master的CPU消耗就越嚴重,叢集的寫入性能會随着read-only replica的增加而降低。此外,星型架構會讓master的出口帶寬随着read-only replica的增加而成倍增長。Master上較高的CPU和網絡負載會抵消掉星型複制延遲較低的優勢,是以,星型複制架構會帶來比較嚴重的擴充問題,整個叢集的性能會受限于master。

鍊式複制
鍊式複制将所有的read-only replica組織成一個複制鍊,如下圖所示,master隻需要将資料同步給replica和複制鍊上的第一個read-only replica。
鍊式複制解決了星型複制的擴充問題,理論上可以無限增加read-only replica的數量,随着節點的增加整個叢集的性能也可以基本上呈線性增長。
鍊式複制的架構下,複制鍊越長,複制鍊末端的read-only replica和master之間的同步延遲就越大,考慮到讀寫分離主要使用在對一緻性要求不高的場景下,這個缺點一般可以接受。但是如果複制鍊中的某個節點異常,會導緻下遊的所有節點資料都會大幅滞後。更加嚴重的是這可能帶來全量同步,并且全量同步将一直傳遞到複制鍊的末端,這會對服務帶來一定的影響。為了解決這個問題,讀寫分離的Redis都使用阿裡雲優化後的binlog複制版本,最大程度的降低全量同步的機率。
結合上述的讨論和比較,Redis讀寫分離選擇鍊式複制的架構。
透明相容
讀寫分離和普通叢集規格一樣,都使用了redis-proxy做請求轉發,多分片令使用存在一定的限制,但從主從更新單分片讀寫分離,或者從叢集更新到多分片的讀寫分離叢集可以做到完全相容。
使用者和redis-proxy建立連接配接,redis-proxy會識别出用戶端連接配接發送過來的請求是讀還是寫,然後按照權重作負載均衡,将請求轉發到後端不同的DB節點中,寫請求轉發給master,讀操作轉發給read-only replica(master預設也提供讀,可以通過權重控制)。
使用者隻需要購買讀寫分離規格的執行個體,直接使用任何用戶端即可直接使用,業務不用做任何修改就可以開始享受讀寫分離服務帶來的巨大性能提升,接入成本幾乎為0。
高可用
高可用子產品(HA)監控所有DB節點的健康狀态,為整個執行個體的可用性保駕護航。master當機時自動切換到新主。如果某個read-only replica當機,HA也能及時感覺,然後重搭一個新的read-only replica,下線當機節點。
除HA之外,redis-proxy也能實時感覺每個read-only replica的狀态。在某個read-only replica異常期間,redis-proxy會自動降低這個節點的權重,如果發現某個read-only replica連續失敗超過一定次數以後,會暫時屏蔽異常節點,直到異常消失以後才會恢複其正常權重。
redis-proxy和HA一起做到盡量減少業務對後端異常的感覺,提高服務可用性。
高性能
對于讀多寫少的業務場景,直接使用叢集版本往往不是最合适的方案,現在讀寫分離提供了更多的選擇,業務可以根據場景選擇最适合的規格,充分利用每一個read-only replica的資源。
目前單shard對外售賣1 master + 1/3/5 read-only replica多種規格(如果有更大的需求可以提工單回報),提供60萬QPS和192 MB/s的服務能力,在完全相容所有指令的情況下突破單機的資源限制。後續将去掉規格限制,讓使用者根據業務流量随時自由的增加或減少read-only replica數量。
<col>
規格
QPS
帶寬
1 master
8-10萬讀寫
10-48 MB
1 master + 1 read-only replica
10萬寫 + 10萬讀
20-64 MB
1 master + 3 read-only replica
10萬寫 + 30萬讀
40-128 MB
1 master + 5 read-only replica
10萬寫 + 50萬讀
60-192 MB
後續
Redis主從異步複制,從read-only replica中可能讀到舊的資料,使用讀寫分離需要業務可以容忍一定程度的資料不一緻,後續将會給客戶更靈活的配置和更大的自由,比如配置可以容忍的最大延遲時間。