2018飛天技術(shù)匯24期-云數(shù)據(jù)庫(kù)Redis產(chǎn)品發(fā)布會(huì),由阿里云數(shù)據(jù)庫(kù)技術(shù)組技術(shù)專家王歡、懷聽(tīng)、梁盼分別帶來(lái)以“Redis全球多活產(chǎn)品”、“Redis混合存儲(chǔ)產(chǎn)品”、“Redis多線程性能增強(qiáng)版”為題的演講。本文對(duì)Redis進(jìn)行了簡(jiǎn)單的介紹,進(jìn)而針對(duì)不同的應(yīng)用場(chǎng)景研制出不同的產(chǎn)品,并對(duì)不同產(chǎn)品分別進(jìn)行了詳細(xì)地介紹。
數(shù)十款阿里云產(chǎn)品限時(shí)折扣中,
趕快點(diǎn)擊這里
,領(lǐng)券開(kāi)始云上實(shí)踐吧!
直播視頻回顧
PPT下載地址(
云痕
)(
懷聽(tīng)
)(
梁盼
)
以下內(nèi)容根據(jù)精彩視頻分享整理而成。
Redis 是一個(gè)高性能的key-value數(shù)據(jù)庫(kù),Redis的優(yōu)勢(shì)有很多,例如,它的性能極高 ,Redis能讀的速度是110000次/s,寫(xiě)的速度是81000次/s ;它具有豐富的數(shù)據(jù)類型,可支持二進(jìn)制案例的 Strings、Lists、Hashes、Sets 及 Ordered Sets 數(shù)據(jù)類型操作;它的所有操作都是原子性的,意思就是要么成功執(zhí)行要么失敗完全不執(zhí)行;它還具有豐富的特性, 即支持 publish/subscribe、通知、key過(guò)期等等特性。
Redis 與其他key - value 緩存產(chǎn)品有三個(gè)共同特點(diǎn):一是Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤(pán)中,重啟的時(shí)候可以再次加載進(jìn)行使用;二是Redis不僅僅支持簡(jiǎn)單的key-value類型的數(shù)據(jù),同時(shí)還提供list、set、zset、hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ);三是Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
Redis與其他key-value存儲(chǔ)的不同點(diǎn)在于Redis有著更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)并且提供對(duì)它們的原子性操作,這是一個(gè)不同于其他數(shù)據(jù)庫(kù)的進(jìn)化路徑。Redis的數(shù)據(jù)類型都是基于基本數(shù)據(jù)結(jié)構(gòu)的同時(shí)對(duì)程序員是透明的,無(wú)需進(jìn)行額外的抽象。另外的一個(gè)不同點(diǎn)在于Redis在內(nèi)存中運(yùn)行時(shí)可以持久化到磁盤(pán)中,所以在對(duì)不同數(shù)據(jù)集進(jìn)行高速讀寫(xiě)時(shí)需要權(quán)衡內(nèi)存,因?yàn)閿?shù)據(jù)量不能大于硬件內(nèi)存。因此,與磁盤(pán)上相同的復(fù)雜數(shù)據(jù)結(jié)構(gòu)相比,在內(nèi)存中操作起來(lái)更為簡(jiǎn)單,這樣Redis可以做很多內(nèi)部復(fù)雜性很強(qiáng)的事情。同時(shí),在磁盤(pán)格式方面它們是緊湊以追加的方式產(chǎn)生的,因?yàn)樗麄儾⒉恍枰M(jìn)行隨機(jī)訪問(wèn)。
Redis全球多活產(chǎn)品是指多個(gè)Redis實(shí)例分布在全球不同的區(qū)域,它是阿里云自研、基于云數(shù)據(jù)庫(kù)Redis版(ApsaraDB for Redis)、100%兼容 Redis 協(xié)議的多活數(shù)據(jù)庫(kù)系統(tǒng)。通過(guò)數(shù)據(jù)同步通道,把多個(gè)Redis實(shí)例組網(wǎng)成1個(gè)邏輯上的 Redis 多活實(shí)例,多活實(shí)例內(nèi)的所有實(shí)例均可讀寫(xiě)并保持實(shí)時(shí)數(shù)據(jù)同步。數(shù)據(jù)同步通道通過(guò)內(nèi)網(wǎng)打通,具有高可靠、高安全、低延遲的特性。子實(shí)例間通過(guò)CRDT(Conflict-free Replicated Data Type)機(jī)制檢測(cè)并解決數(shù)據(jù)沖突,保障數(shù)據(jù)最終一致性。Redis全球多活產(chǎn)品輕松支持異地多個(gè)站點(diǎn)同時(shí)對(duì)外提供服務(wù)的業(yè)務(wù)場(chǎng)景,助力企業(yè)快速?gòu)?fù)制阿里巴巴異地多活架構(gòu)。
程序在運(yùn)行過(guò)程中總會(huì)遇到各種各樣的問(wèn)題,例如程序bug、機(jī)器故障、機(jī)房斷電起火故障等,業(yè)務(wù)上要求發(fā)生這些故障時(shí)要保證數(shù)據(jù)一致性和業(yè)務(wù)可用性,所以就有了架構(gòu)演練之路,即單可用區(qū)-同城容災(zāi)-兩地三中心-異地多活。
由于單可用區(qū)架構(gòu)無(wú)法應(yīng)對(duì)機(jī)房出現(xiàn)故障,就有了同城容災(zāi)的架構(gòu)。同城容災(zāi)架構(gòu)由于無(wú)法應(yīng)對(duì)地域級(jí)別的問(wèn)題,接著就有了兩地三中心架構(gòu)。由于許多金融業(yè)務(wù)要求數(shù)據(jù)存儲(chǔ)在不同的地域中,同時(shí)對(duì)故障恢復(fù)時(shí)間有要求,因此兩地三中心架構(gòu)就在同城容災(zāi)基礎(chǔ)上加了一個(gè)standby中心,但依舊存在幾個(gè)缺陷,即冷備中心不工作,關(guān)鍵時(shí)刻不敢切的缺陷;冷備中心不工作,成本浪費(fèi)的缺陷;本質(zhì)上數(shù)據(jù)仍然單點(diǎn)寫(xiě),數(shù)據(jù)庫(kù)瓶頸無(wú)法解的缺陷;資源、容災(zāi)、擴(kuò)展無(wú)法解決的缺陷。
后來(lái)有了異地多活架構(gòu),它是指所有的中心都提供業(yè)務(wù)服務(wù),底層的數(shù)據(jù)能夠相互同步,因此存在著許多優(yōu)點(diǎn),例如,所有中心工作,切換有保障;所有中心工作,成本低;彈性伸縮,增加/減少中心個(gè)數(shù);故障獨(dú)立性導(dǎo)致中心不可用時(shí),只影響部分用戶。
異地多活產(chǎn)品架構(gòu)圖如上圖所示,它是由云數(shù)據(jù)庫(kù)Redis版實(shí)例、同步通道和通道管理器三部分組成。由于異地多活是由多個(gè)Redis實(shí)例組成,因此可以實(shí)現(xiàn)每個(gè)子實(shí)例之間實(shí)時(shí)數(shù)據(jù)同步、每個(gè)子實(shí)例數(shù)據(jù)最終一致、每個(gè)子實(shí)例均可讀寫(xiě)等功能。
在異地多活構(gòu)架中,對(duì)Redis進(jìn)行了aof binlog增加oplog和CRDT策略merge key的改造,其中aof binlog增加oplog中包含gtid和邏輯時(shí)鐘信息,解決了循環(huán)同步、Exactly-once Apply的問(wèn)題;CRDT策略merge key中解決了一致性的問(wèn)題。
異地多活產(chǎn)品具有高可用、高性能、數(shù)據(jù)最終一致以及功能豐富的特性,具體介紹如下:
高可用
高可用是指同步通道支持?jǐn)帱c(diǎn)續(xù)傳,它最高可容忍天級(jí)別的隔斷,且隔斷之后數(shù)據(jù)還可以在斷點(diǎn)處繼續(xù)同步;同時(shí),同步通道還可以自適應(yīng)處理子實(shí)例異常,例如主備切換、備庫(kù)重搭等。
高性能
高性能是指它具有異步復(fù)制同步不影響Redis自身讀寫(xiě)性能,因?yàn)樗旧矶ㄎ痪途哂懈咝阅?、高吞吐、低延遲的性能,高吞吐是指它具有標(biāo)準(zhǔn)版Redis使得單向同步鏈路高達(dá)10萬(wàn)TPS以及隨Redis節(jié)點(diǎn)數(shù)線性擴(kuò)展的集群版Redis。低延遲是指洲際內(nèi)地域僅需百毫秒,更厲害的是跨洲際地域僅需 1秒級(jí)。
最終一致性
為了解決過(guò)去的架構(gòu)由于異步同步的邏輯產(chǎn)生的一致性問(wèn)題,最終引進(jìn)了CRDT(Conflict-Free Replicated Data Types)策略,它可支持最終一致性的數(shù)據(jù)類型有 String/Counter、Hash、Set、Zset、Geo、hyperloglog等。
功能豐富
異地多活產(chǎn)品增加了支持 Redis 實(shí)例類型、同步中的子實(shí)例支持變配規(guī)格、新增與刪除子實(shí)例等新功能,其中支持的 Redis 實(shí)例類型包括標(biāo)準(zhǔn)版、集群版以及讀寫(xiě)分離版。
異地多活業(yè)務(wù)具有不同的業(yè)務(wù)有不同的業(yè)務(wù)設(shè)計(jì)要求,它必須允許多個(gè)地域具有同時(shí)修改同一份數(shù)據(jù)的功能,例如全局session、全局PV、用戶收藏夾、購(gòu)物車、地理位置信息、收藏夾、歷史搜索記錄、彈幕、評(píng)論等。同時(shí),它還需要做數(shù)據(jù)切分,要求一份數(shù)據(jù)只允許有1個(gè)寫(xiě)入點(diǎn)。
多活業(yè)務(wù)設(shè)計(jì)的要點(diǎn)有自包含性、松耦合性和路由規(guī)則一致性,即多活業(yè)務(wù)設(shè)計(jì)的所有計(jì)算與數(shù)據(jù)必須在1個(gè)中心內(nèi)完成;跨單元之間只能進(jìn)行服務(wù)調(diào)用,不能直接訪問(wèn)數(shù)據(jù)庫(kù)或其他存儲(chǔ);路由必須是入口路由或者微服務(wù)調(diào)用路由。
Redis混合存儲(chǔ)實(shí)例是阿里云自主研發(fā)的完全兼容Redis協(xié)議和特性的混合存儲(chǔ)產(chǎn)品。通過(guò)將部分冷數(shù)據(jù)存儲(chǔ)到磁盤(pán),在保證絕大部分訪問(wèn)性能不下降的基礎(chǔ)上,大大降低了用戶成本,并突破了內(nèi)存對(duì)Redis單實(shí)例數(shù)據(jù)量的限制。
它的數(shù)據(jù)類型是將熱數(shù)據(jù)存儲(chǔ)在內(nèi)存里,將冷數(shù)據(jù)存儲(chǔ)在磁盤(pán)里面,顧名思義,熱數(shù)據(jù)就是指頻繁訪問(wèn)到的數(shù)據(jù)。因?yàn)樗械腞edis都會(huì)訪問(wèn)到Keys,相對(duì)來(lái)說(shuō)Keys的訪問(wèn)天生就比Values大許多,因此Redis混合存儲(chǔ)產(chǎn)品是將所有的Keys、常訪問(wèn)的Values放到內(nèi)存里存儲(chǔ),而不經(jīng)常訪問(wèn)的Values放到磁盤(pán)里存儲(chǔ)。在業(yè)務(wù)場(chǎng)景里面,Keys只占十幾個(gè)字節(jié),但Values卻占幾百甚至幾千個(gè)字節(jié),所以將所有的Keys放到內(nèi)存里對(duì)整體性能能夠提高很多。
Redis混合存儲(chǔ)架構(gòu)如上圖所示,從業(yè)務(wù)模型來(lái)看,我們把Redis混合存儲(chǔ)架構(gòu)分為三層,第一層是計(jì)算層,它包含所有Redis的網(wǎng)絡(luò)連接、協(xié)議解析、定時(shí)任務(wù)、命令處理、過(guò)期、淘汰、同步等業(yè)務(wù)邏輯;第二層是數(shù)據(jù)層,它包含熱數(shù)據(jù)表示、冷熱數(shù)據(jù)交換、冷數(shù)據(jù)編解碼;第三層是存儲(chǔ)層,它包含存儲(chǔ)引擎、文件系統(tǒng)以及硬件管理。
其中,數(shù)據(jù)層進(jìn)行冷熱交換是為了保證兼容性,因?yàn)樗蠷edis的業(yè)務(wù)邏輯是采用主線程來(lái)處理的,所有實(shí)際的IO是由后臺(tái)來(lái)運(yùn)行的,進(jìn)而也不會(huì)阻擋主線程的運(yùn)行。在熱數(shù)據(jù)轉(zhuǎn)換成冷數(shù)據(jù)的過(guò)程中,數(shù)據(jù)量小于內(nèi)存時(shí),Redis混合存儲(chǔ)會(huì)把所有的Keys和Values放到內(nèi)存里面,這樣可以達(dá)到性能最高。當(dāng)數(shù)據(jù)量越來(lái)越大時(shí),內(nèi)存里會(huì)出現(xiàn)存不下的現(xiàn)象,這時(shí)會(huì)按照最近的訪問(wèn)頻率篩選出一些很少被訪問(wèn)到的Values,然后由主線程生成IO任務(wù),接著后臺(tái)的IO線程拿到這些任務(wù)存儲(chǔ)到磁盤(pán)中,最后主線會(huì)將這些Values釋放掉。在冷數(shù)據(jù)轉(zhuǎn)換成熱數(shù)據(jù)的過(guò)程中,收到用戶請(qǐng)求后,首先判斷任務(wù)請(qǐng)求會(huì)訪問(wèn)到哪些Values,然后看這些Values是否都在內(nèi)存里面,如果部分Values不在,會(huì)對(duì)這些Values生成IO任務(wù),然后主線程將客戶端掛起,接著繼續(xù)處理其它客戶端的請(qǐng)求,當(dāng)此線程拿到這些任務(wù)后,會(huì)把數(shù)據(jù)從磁盤(pán)里面加載到內(nèi)存里面,同時(shí)通知給主線程,主線程收到這些通知之后會(huì)將掛起的客戶端喚醒繼續(xù)處理其他用戶請(qǐng)求。
對(duì)于存儲(chǔ)層而言,磁盤(pán)上的存儲(chǔ)是跟阿里巴巴的服務(wù)器研發(fā)團(tuán)隊(duì)共建的一個(gè)用戶態(tài)的存儲(chǔ)引擎,稱為FusionEngine。它是由業(yè)務(wù)定制一個(gè)RocksDB,然后通過(guò)底層的一個(gè)用戶固態(tài)的文件系統(tǒng)來(lái)縮短用戶的IO路徑,進(jìn)而避免了內(nèi)核的開(kāi)銷。在業(yè)務(wù)場(chǎng)景里面,F(xiàn)usionEngine的性能比過(guò)去的文件系統(tǒng)性能提升了約80%左右,因此整體的Redis混合存儲(chǔ)性能也得到了有效的提升。
Redis混合存儲(chǔ)產(chǎn)品的底層實(shí)線是支持冷熱數(shù)據(jù)任意配比的,即可以任意的匹配內(nèi)存占用多少和磁盤(pán)占用多少,進(jìn)而在性能和成本上達(dá)到一個(gè)平衡。在應(yīng)用中,所有的數(shù)據(jù)量不能超過(guò)內(nèi)存加磁盤(pán)的容量。此產(chǎn)品適用于Values比較大的場(chǎng)景,因?yàn)閂alues對(duì)性能的影響不是很大,所以也比較適合數(shù)據(jù)訪問(wèn)冷熱不均的場(chǎng)景。目前混合存儲(chǔ)開(kāi)通的區(qū)域有華北2(北京)的可用區(qū)D、華東1(杭州)的可用區(qū)E、華南1(深圳)的可用區(qū)C。
Redis混合存儲(chǔ)產(chǎn)品應(yīng)用的場(chǎng)景包含電商類應(yīng)用、直播類應(yīng)用、互聯(lián)網(wǎng)類應(yīng)用,對(duì)于電商類應(yīng)用而言,它的活躍商品數(shù)據(jù)存放到內(nèi)存中,冷門(mén)商品數(shù)據(jù)存放到磁盤(pán)中;對(duì)于直播類應(yīng)用而言,它的活躍直播間和熱門(mén)直播間的數(shù)據(jù)存放到內(nèi)存中,下線直播間和冷門(mén)直播間的數(shù)據(jù)存放到磁盤(pán)中;對(duì)于互聯(lián)網(wǎng)類應(yīng)用而言,它的首頁(yè)和熱門(mén)貼數(shù)據(jù)存放到內(nèi)存中,冷門(mén)帖子存放到磁盤(pán)中。
Redis多線程性能增強(qiáng)版突破了Redis單線程的性能瓶頸,且100%兼容原生Redis,業(yè)務(wù)無(wú)需修改任何代碼。通過(guò)將命令解析,讀寫(xiě),響應(yīng)等事件分發(fā)給多個(gè)IO線程并發(fā)處理,實(shí)現(xiàn)處理性能質(zhì)的飛躍。
原生的Redis是進(jìn)行串行處理的,當(dāng)它接收到一個(gè)請(qǐng)求時(shí),會(huì)嘗試連接讀取到一部分?jǐn)?shù)據(jù),并對(duì)這部分?jǐn)?shù)據(jù)進(jìn)行解析,如果解析到一個(gè)完整的數(shù)據(jù),就會(huì)對(duì)這個(gè)數(shù)據(jù)進(jìn)行處理。當(dāng)這個(gè)數(shù)據(jù)處理完之后,會(huì)生成對(duì)數(shù)據(jù)的一個(gè)響應(yīng),針對(duì)這個(gè)響應(yīng)在發(fā)送給客戶端。原生的Redis存在一個(gè)缺陷,就是不能做到并發(fā)。相對(duì)而言,Redis多線程做的一個(gè)Master-Slave架構(gòu)就能夠做到并發(fā),它是將Master數(shù)據(jù)處理完之后,將數(shù)據(jù)同步到Slave上。
如上圖所示,Redis多線程性能增強(qiáng)版是由主線程、多個(gè)IO線程和WORKER線程組成,主線程主要負(fù)責(zé)接受連接,創(chuàng)建client,將連接轉(zhuǎn)發(fā)給IO線程。IO線程負(fù)責(zé)處理連接的讀寫(xiě)事件,解析命令,將解析的完整命令轉(zhuǎn)發(fā)給WORKER線程處理,發(fā)送response包,負(fù)責(zé)刪除連接等;WORKER線程負(fù)責(zé)命令的處理,生成客戶端回包,定時(shí)器事件的執(zhí)行等。
在線程間數(shù)據(jù)在進(jìn)行交換的過(guò)程中,一個(gè)IO線程在獲取到連接之后,就開(kāi)始嘗試在這個(gè)連接上讀取請(qǐng)求,然后對(duì)請(qǐng)求做一個(gè)解析,若解析到是一個(gè)完整的請(qǐng)求,就會(huì)將請(qǐng)求放到隊(duì)列里面。接著,IO線程通知WORKER線程有新的命令需要處理,這個(gè)通知是通過(guò)管道來(lái)進(jìn)行的。最后,WORKER線程接受到命令后就會(huì)對(duì)其進(jìn)行處理,處理完之后會(huì)形成對(duì)命令的響應(yīng),并將響應(yīng)放到隊(duì)列里面,同樣,WORKER線程也會(huì)通知IO線程。
IO線程越多,Redis多線程的性能越好,但是IO線程與Redis多線程的性能并不是線性的,當(dāng)IO線程達(dá)到一定的數(shù)量時(shí),WORKER就會(huì)達(dá)到一個(gè)瓶頸。因此,IO線程最多支持多達(dá)6個(gè),默認(rèn)情況下只有一個(gè)IO線程。另外需要注意的是,線程數(shù)個(gè)數(shù)跟規(guī)格是綁定的,一旦選定實(shí)例創(chuàng)建完畢后無(wú)法動(dòng)態(tài)修改,如需修改,就需要通過(guò)升級(jí)規(guī)格的方式完成。
Redis多線程并不是在所有的場(chǎng)景中都適用,Redis多線程只適用于主從版無(wú)法滿足性能需求時(shí)、集群版shard節(jié)點(diǎn)成為性能瓶頸時(shí)、讀寫(xiě)分離版本有熱寫(xiě)瓶時(shí)以及同步延遲等問(wèn)題時(shí)。
Redis多線程性能增強(qiáng)版主要應(yīng)用在電商類應(yīng)用、直播類應(yīng)用中,對(duì)于電商類應(yīng)用而言,適用于秒殺場(chǎng)景和庫(kù)存計(jì)數(shù);對(duì)于直播類應(yīng)用而言,主要適用于熱點(diǎn)直播間和明星大V的直播。
標(biāo)題名稱:“百變”Redis帶你見(jiàn)識(shí)不同場(chǎng)景下的產(chǎn)品技術(shù)架構(gòu)-創(chuàng)新互聯(lián)
地址分享:http://jinyejixie.com/article24/ddsjje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站維護(hù)、品牌網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計(jì)、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容