Redis 讀寫分離技術架構解析

背景

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 數量。

Redis 主從異步複製,從 read-only replica 中可能讀到舊的數據,使用讀寫分離需要業務可以容忍一定程度的數據不一致,後續將會給客戶更靈活的配置和更大的自由,例如配置可以容忍的最大延遲時間

如果您喜歡本文,歡迎點擊右上角,把文章分享到朋友圈~~
如果有想了解和學習的知識點或技術點,也可以留言給若飛安排分享

作者:小熱愛

來源:juejin.cn/post/6955355686108659726

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/qME3Ti88lbCIGsAAloizww