一文解析Redis讀寫分離技術
導讀 | 雲資料庫Redis版不管主從版還是叢集規格,replica作為備庫不對外提供服務,只有在發生HA的時候,replica提升為master後才承擔讀寫流量。這種架構讀寫請求都在master上完成,一致性較高,但效能受到master數量的限制。經常有使用者資料較少,但因為流量或者併發太高而不得不升級到更大的叢集規格。 |
雲資料庫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中可能讀到舊的資料,使用讀寫分離需要業務可以容忍一定程度的資料不一致,後續將會給客戶更靈活的配置和更大的自由,比如配置可以容忍的最大延遲時間。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2680448/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一文淺談“讀寫分離”技術
- Redis的讀寫分離Redis
- redis客戶端實現高可用讀寫分離Redis客戶端
- KunlunBase 讀寫分離方案
- Laravel讀寫分離原理Laravel
- discuz 配置讀寫分離(主寫從讀)
- MyCat分庫分表、讀寫分離
- 資料讀寫壓力大,讀寫分離
- 搭建Redis哨兵叢集並使用RedisTemplate實現讀寫分離Redis
- ShardingSphere(七) 讀寫分離配置,實現分庫讀寫操作
- 資料庫讀寫分離資料庫
- 讀寫分離 & 分庫分表 & 深度分頁
- mysql優化之讀寫分離MySql優化
- 探究MySQL MGR的讀寫分離MySql
- MySQL 讀寫分離的好處MySql
- ProxySQL實現MySQL讀寫分離MySql
- 【Cetus】Cetus-讀寫分離版
- StoneDB 讀寫分離實踐方案
- 位元組面試:什麼是讀寫分離?讀寫分離的底層如何實現?面試
- Docker實現Mariadb分庫分表、讀寫分離Docker
- bitmap技術解析:redis與roaringBitmapRedis
- 【Mongo】Mongo讀寫分離的實現Go
- MYSQL 主從 + ATLAS 讀寫分離 搭建MySql
- MySQL cetus 中介軟體 讀寫分離MySql
- 配置\清除 MySQL 主從 讀寫分離MySql
- SpringBoot使用Sharding-JDBC讀寫分離Spring BootJDBC
- MySQL 官宣:支援讀寫分離了!!MySql
- mysql讀寫分離的最佳實踐MySql
- DBPack 讀寫分離功能釋出公告
- Mysql之讀寫分離架構-AtlasMySql架構
- MySQL主從複製讀寫分離MySql
- Mysql 高可用(MHA)-讀寫分離(Atlas)MySql
- 搭建Redis簡易叢集實現主從複製和讀寫分離Redis
- 搭建Redis“主-從-從”模式叢集並使用 RedisTemplate 實現讀寫分離Redis模式
- 一文讀懂Apache Flink技術Apache
- 搭建基於springmvc,ibatis的工程實現讀寫分離,配置分離SpringMVCBAT
- 寶塔 liunx redis 設定讀寫分離主從複製 + 哨兵自動值守Redis
- ssm讀寫分離多資料來源SSM