摘要: 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的直播。session
原文連接數據結構
本文爲雲棲社區原創內容,未經容許不得轉載。多線程