1. 程式人生 > >“百變”Redis帶你見識不同場景下的產品技術架構

“百變”Redis帶你見識不同場景下的產品技術架構

存儲引擎 金融 分享圖片 vpd 同城 商品 ges 瓶頸 原子性

摘要: 2018飛天技術匯24期-雲數據庫Redis產品發布會,由阿裏雲數據庫技術組技術專家王歡、懷聽、梁盼分別帶來以“Redis全球多活產品”、“Redis混合存儲產品”、“Redis多線程性能增強版”為題的演講,本文對Redis進行了簡單的介紹,進而針對不同的應用場景研制出不同的產品,並對不同產品分別進行了詳細地介紹。
2018飛天技術匯24期-雲數據庫Redis產品發布會,由阿裏雲數據庫技術組技術專家王歡、懷聽、梁盼分別帶來以“Redis全球多活產品”、“Redis混合存儲產品”、“Redis多線程性能增強版”為題的演講。本文對Redis進行了簡單的介紹,進而針對不同的應用場景研制出不同的產品,並對不同產品分別進行了詳細地介紹。
Redis簡介
Redis 是一個高性能的key-value數據庫,Redis的優勢有很多,例如,它的性能極高 ,Redis能讀的速度是110000次/s,寫的速度是81000次/s ;它具有豐富的數據類型,可支持二進制案例的 Strings、Lists、Hashes、Sets 及 Ordered Sets 數據類型操作;它的所有操作都是原子性的,意思就是要麽成功執行要麽失敗完全不執行;它還具有豐富的特性, 即支持 publish/subscribe、通知、key過期等等特性。
Redis 與其他key - value 緩存產品有三個共同特點:一是Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用;二是Redis不僅僅支持簡單的key-value類型的數據,同時還提供list、set、zset、hash等數據結構的存儲;三是Redis支持數據的備份,即master-slave模式的數據備份。
Redis與其他key-value存儲的不同點在於Redis有著更為復雜的數據結構並且提供對它們的原子性操作,這是一個不同於其他數據庫的進化路徑。Redis的數據類型都是基於基本數據結構的同時對程序員是透明的,無需進行額外的抽象。另外的一個不同點在於Redis在內存中運行時可以持久化到磁盤中,所以在對不同數據集進行高速讀寫時需要權衡內存,因為數據量不能大於硬件內存。因此,與磁盤上相同的復雜數據結構相比,在內存中操作起來更為簡單,這樣Redis可以做很多內部復雜性很強的事情。同時,在磁盤格式方面它們是緊湊以追加的方式產生的,因為他們並不需要進行隨機訪問。
Redis全球多活產品
Redis全球多活產品是指多個Redis實例分布在全球不同的區域,它是阿裏雲自研、基於雲數據庫Redis版(ApsaraDB for Redis)、100%兼容 Redis 協議的多活數據庫系統。通過數據同步通道,把多個Redis實例組網成1個邏輯上的 Redis 多活實例,多活實例內的所有實例均可讀寫並保持實時數據同步。數據同步通道通過內網打通,具有高可靠、高安全、低延遲的特性。子實例間通過CRDT(Conflict-free Replicated Data Type)機制檢測並解決數據沖突,保障數據最終一致性。Redis全球多活產品輕松支持異地多個站點同時對外提供服務的業務場景,助力企業快速復制阿裏巴巴異地多活架構。
高可用架構演練之路
程序在運行過程中總會遇到各種各樣的問題,例如程序bug、機器故障、機房斷電起火故障等,業務上要求發生這些故障時要保證數據一致性和業務可用性,所以就有了架構演練之路,即單可用區-同城容災-兩地三中心-異地多活。
由於單可用區架構無法應對機房出現故障,就有了同城容災的架構。同城容災架構由於無法應對地域級別的問題,接著就有了兩地三中心架構。由於許多金融業務要求數據存儲在不同的地域中,同時對故障恢復時間有要求,因此兩地三中心架構就在同城容災基礎上加了一個standby中心,但依舊存在幾個缺陷,即冷備中心不工作,關鍵時刻不敢切的缺陷;冷備中心不工作,成本浪費的缺陷;本質上數據仍然單點寫,數據庫瓶頸無法解的缺陷;資源、容災、擴展無法解決的缺陷。
後來有了異地多活架構,它是指所有的中心都提供業務服務,底層的數據能夠相互同步,因此存在著許多優點,例如,所有中心工作,切換有保障;所有中心工作,成本低;彈性伸縮,增加/減少中心個數;故障獨立性導致中心不可用時,只影響部分用戶。
產品架構

技術分享圖片

異地多活產品架構圖如上圖所示,它是由雲數據庫Redis版實例、同步通道和通道管理器三部分組成。由於異地多活是由多個Redis實例組成,因此可以實現每個子實例之間實時數據同步、每個子實例數據最終一致、每個子實例均可讀寫等功能。
在異地多活構架中,對Redis進行了aof binlog增加oplog和CRDT策略merge key的改造,其中aof binlog增加oplog中包含gtid和邏輯時鐘信息,解決了循環同步、Exactly-once Apply的問題;CRDT策略merge key中解決了一致性的問題。
異地多活產品具有高可用、高性能、數據最終一致以及功能豐富的特性,具體介紹如下:
● 高可用
高可用是指同步通道支持斷點續傳,它最高可容忍天級別的隔斷,且隔斷之後數據還可以在斷點處繼續同步;同時,同步通道還可以自適應處理子實例異常,例如主備切換、備庫重搭等。
● 高性能
高性能是指它具有異步復制同步不影響Redis自身讀寫性能,因為它本身定位就具有高性能、高吞吐、低延遲的性能,高吞吐是指它具有標準版Redis使得單向同步鏈路高達10萬TPS以及隨Redis節點數線性擴展的集群版Redis。低延遲是指洲際內地域僅需百毫秒,更厲害的是跨洲際地域僅需 1秒級。
● 最終一致性
為了解決過去的架構由於異步同步的邏輯產生的一致性問題,最終引進了CRDT(Conflict-Free Replicated Data Types)策略,它可支持最終一致性的數據類型有 String/Counter、Hash、Set、Zset、Geo、hyperloglog等。
● 功能豐富
異地多活產品增加了支持 Redis 實例類型、同步中的子實例支持變配規格、新增與刪除子實例等新功能,其中支持的 Redis 實例類型包括標準版、集群版以及讀寫分離版。
業務設計

技術分享圖片

異地多活業務具有不同的業務有不同的業務設計要求,它必須允許多個地域具有同時修改同一份數據的功能,例如全局session、全局PV、用戶收藏夾、購物車、地理位置信息、收藏夾、歷史搜索記錄、彈幕、評論等。同時,它還需要做數據切分,要求一份數據只允許有1個寫入點。
多活業務設計的要點有自包含性、松耦合性和路由規則一致性,即多活業務設計的所有計算與數據必須在1個中心內完成;跨單元之間只能進行服務調用,不能直接訪問數據庫或其他存儲;路由必須是入口路由或者微服務調用路由。
Redis混合存儲產品
Redis混合存儲實例是阿裏雲自主研發的完全兼容Redis協議和特性的混合存儲產品。通過將部分冷數據存儲到磁盤,在保證絕大部分訪問性能不下降的基礎上,大大降低了用戶成本,並突破了內存對Redis單實例數據量的限制。
技術架構

技術分享圖片

它的數據類型是將熱數據存儲在內存裏,將冷數據存儲在磁盤裏面,顧名思義,熱數據就是指頻繁訪問到的數據。因為所有的Redis都會訪問到Keys,相對來說Keys的訪問天生就比Values大許多,因此Redis混合存儲產品是將所有的Keys、常訪問的Values放到內存裏存儲,而不經常訪問的Values放到磁盤裏存儲。在業務場景裏面,Keys只占十幾個字節,但Values卻占幾百甚至幾千個字節,所以將所有的Keys放到內存裏對整體性能能夠提高很多。

技術分享圖片

Redis混合存儲架構如上圖所示,從業務模型來看,我們把Redis混合存儲架構分為三層,第一層是計算層,它包含所有Redis的網絡連接、協議解析、定時任務、命令處理、過期、淘汰、同步等業務邏輯;第二層是數據層,它包含熱數據表示、冷熱數據交換、冷數據編解碼;第三層是存儲層,它包含存儲引擎、文件系統以及硬件管理。
其中,數據層進行冷熱交換是為了保證兼容性,因為所有Redis的業務邏輯是采用主線程來處理的,所有實際的IO是由後臺來運行的,進而也不會阻擋主線程的運行。在熱數據轉換成冷數據的過程中,數據量小於內存時,Redis混合存儲會把所有的Keys和Values放到內存裏面,這樣可以達到性能最高。當數據量越來越大時,內存裏會出現存不下的現象,這時會按照最近的訪問頻率篩選出一些很少被訪問到的Values,然後由主線程生成IO任務,接著後臺的IO線程拿到這些任務存儲到磁盤中,最後主線會將這些Values釋放掉。在冷數據轉換成熱數據的過程中,收到用戶請求後,首先判斷任務請求會訪問到哪些Values,然後看這些Values是否都在內存裏面,如果部分Values不在,會對這些Values生成IO任務,然後主線程將客戶端掛起,接著繼續處理其它客戶端的請求,當此線程拿到這些任務後,會把數據從磁盤裏面加載到內存裏面,同時通知給主線程,主線程收到這些通知之後會將掛起的客戶端喚醒繼續處理其他用戶請求。
對於存儲層而言,磁盤上的存儲是跟阿裏巴巴的服務器研發團隊共建的一個用戶態的存儲引擎,稱為FusionEngine。它是由業務定制一個RocksDB,然後通過底層的一個用戶固態的文件系統來縮短用戶的IO路徑,進而避免了內核的開銷。在業務場景裏面,FusionEngine的性能比過去的文件系統性能提升了約80%左右,因此整體的Redis混合存儲性能也得到了有效的提升。
產品特性
Redis混合存儲產品的底層實線是支持冷熱數據任意配比的,即可以任意的匹配內存占用多少和磁盤占用多少,進而在性能和成本上達到一個平衡。在應用中,所有的數據量不能超過內存加磁盤的容量。此產品適用於Values比較大的場景,因為Values對性能的影響不是很大,所以也比較適合數據訪問冷熱不均的場景。目前混合存儲開通的區域有華北2(北京)的可用區D、華東1(杭州)的可用區E、華南1(深圳)的可用區C。
應用場景
Redis混合存儲產品應用的場景包含電商類應用、直播類應用、互聯網類應用,對於電商類應用而言,它的活躍商品數據存放到內存中,冷門商品數據存放到磁盤中;對於直播類應用而言,它的活躍直播間和熱門直播間的數據存放到內存中,下線直播間和冷門直播間的數據存放到磁盤中;對於互聯網類應用而言,它的首頁和熱門貼數據存放到內存中,冷門帖子存放到磁盤中。
Redis多線程性能增強版
Redis多線程性能增強版突破了Redis單線程的性能瓶頸,且100%兼容原生Redis,業務無需修改任何代碼。通過將命令解析,讀寫,響應等事件分發給多個IO線程並發處理,實現處理性能質的飛躍。
技術架構
原生的Redis是進行串行處理的,當它接收到一個請求時,會嘗試連接讀取到一部分數據,並對這部分數據進行解析,如果解析到一個完整的數據,就會對這個數據進行處理。當這個數據處理完之後,會生成對數據的一個響應,針對這個響應在發送給客戶端。原生的Redis存在一個缺陷,就是不能做到並發。相對而言,Redis多線程做的一個Master-Slave架構就能夠做到並發,它是將Master數據處理完之後,將數據同步到Slave上。

技術分享圖片

如上圖所示,Redis多線程性能增強版是由主線程、多個IO線程和WORKER線程組成,主線程主要負責接受連接,創建client,將連接轉發給IO線程。IO線程負責處理連接的讀寫事件,解析命令,將解析的完整命令轉發給WORKER線程處理,發送response包,負責刪除連接等;WORKER線程負責命令的處理,生成客戶端回包,定時器事件的執行等。
在線程間數據在進行交換的過程中,一個IO線程在獲取到連接之後,就開始嘗試在這個連接上讀取請求,然後對請求做一個解析,若解析到是一個完整的請求,就會將請求放到隊列裏面。接著,IO線程通知WORKER線程有新的命令需要處理,這個通知是通過管道來進行的。最後,WORKER線程接受到命令後就會對其進行處理,處理完之後會形成對命令的響應,並將響應放到隊列裏面,同樣,WORKER線程也會通知IO線程。
產品特性

技術分享圖片

IO線程越多,Redis多線程的性能越好,但是IO線程與Redis多線程的性能並不是線性的,當IO線程達到一定的數量時,WORKER就會達到一個瓶頸。因此,IO線程最多支持多達6個,默認情況下只有一個IO線程。另外需要註意的是,線程數個數跟規格是綁定的,一旦選定實例創建完畢後無法動態修改,如需修改,就需要通過升級規格的方式完成。
Redis多線程並不是在所有的場景中都適用,Redis多線程只適用於主從版無法滿足性能需求時、集群版shard節點成為性能瓶頸時、讀寫分離版本有熱寫瓶時以及同步延遲等問題時。
應用場景
Redis多線程性能增強版主要應用在電商類應用、直播類應用中,對於電商類應用而言,適用於秒殺場景和庫存計數;對於直播類應用而言,主要適用於熱點直播間和明星大V的直播。

原文鏈接

本文為雲棲社區原創內容,未經允許不得轉載。

“百變”Redis帶你見識不同場景下的產品技術架構