雙“11”最熱門的話題是TB ,最近正好和阿里的一個(gè)朋友聊淘寶的技術(shù)架構(gòu),發(fā)現(xiàn)很多有意思的地方,分享一下他們的解析資料:
淘寶海量數(shù)據(jù)產(chǎn)品技術(shù)架構(gòu)
數(shù)據(jù)產(chǎn)品的一個(gè)最大特點(diǎn)是數(shù)據(jù)的非實(shí)時(shí)寫入,正因?yàn)槿绱?,我們可以認(rèn)為,在一定的時(shí)間段內(nèi),整個(gè)系統(tǒng)的數(shù)據(jù)是只讀的。這為我們?cè)O(shè)計(jì)緩存奠定了非常重要的基礎(chǔ)。
圖1 淘寶海量數(shù)據(jù)產(chǎn)品技術(shù)架構(gòu)
按照數(shù)據(jù)的流向來(lái)劃分,我們把淘寶數(shù)據(jù)產(chǎn)品的技術(shù)架構(gòu)分為五層(如圖1所示),分別是數(shù)據(jù)源、計(jì)算層、存儲(chǔ)層、查詢層和產(chǎn)品層。位于架構(gòu)頂端的是我們的數(shù)據(jù)來(lái)源層,這里有淘寶主站的用戶、店鋪、商品和交易等數(shù)據(jù)庫(kù),還有用戶的瀏覽、搜索等行為日志等。這一系列的數(shù)據(jù)是數(shù)據(jù)產(chǎn)品最原始的生命力所在。
在數(shù)據(jù)源層實(shí)時(shí)產(chǎn)生的數(shù)據(jù),通過淘寶自主研發(fā)的數(shù)據(jù)傳輸組件DataX、DbSync和Timetunnel準(zhǔn)實(shí)時(shí)地傳輸?shù)揭粋€(gè)有1500個(gè)節(jié)點(diǎn)的Hadoop集群上,這個(gè)集群我們稱之為“云梯”,是計(jì)算層的主要組成部分。在“云梯”上,我們每天有大約40000個(gè)作業(yè)對(duì)1.5PB的原始數(shù)據(jù)按照產(chǎn)品需求進(jìn)行不同的MapReduce計(jì)算。這一計(jì)算過程通常都能在凌晨?jī)牲c(diǎn)之前完成。相對(duì)于前端產(chǎn)品看到的數(shù)據(jù),這里的計(jì)算結(jié)果很可能是一個(gè)處于中間狀態(tài)的結(jié)果,這往往是在數(shù)據(jù)冗余與前端計(jì)算之間做了適當(dāng)平衡的結(jié)果。
不得不提的是,一些對(duì)實(shí)效性要求很高的數(shù)據(jù),例如針對(duì)搜索詞的統(tǒng)計(jì)數(shù)據(jù),我們希望能盡快推送到數(shù)據(jù)產(chǎn)品前端。這種需求再采用“云梯”來(lái)計(jì)算效率將是比較低的,為此我們做了流式數(shù)據(jù)的實(shí)時(shí)計(jì)算平臺(tái),稱之為“銀河”。“銀河”也是一個(gè)分布式系統(tǒng),它接收來(lái)自TimeTunnel的實(shí)時(shí)消息,在內(nèi)存中做實(shí)時(shí)計(jì)算,并把計(jì)算結(jié)果在盡可能短的時(shí)間內(nèi)刷新到NoSQL存儲(chǔ)設(shè)備中,供前端產(chǎn)品調(diào)用。
容易理解,“云梯”或者“銀河”并不適合直接向產(chǎn)品提供實(shí)時(shí)的數(shù)據(jù)查詢服務(wù)。這是因?yàn)椋瑢?duì)于“云梯”來(lái)說(shuō),它的定位只是做離線計(jì)算的,無(wú)法支持較高的性能和并發(fā)需求;而對(duì)于“銀河”而言,盡管所有的代碼都掌握在我們手中,但要完整地將數(shù)據(jù)接收、實(shí)時(shí)計(jì)算、存儲(chǔ)和查詢等功能集成在一個(gè)分布式系統(tǒng)中,避免不了分層,最終仍然落到了目前的架構(gòu)上。
為此,我們針對(duì)前端產(chǎn)品設(shè)計(jì)了專門的存儲(chǔ)層。在這一層,我們有基于MySQL的分布式關(guān)系型數(shù)據(jù)庫(kù)集群MyFOX和基于HBase的NoSQL存儲(chǔ)集群Prom,在后面的文字中,我將重點(diǎn)介紹這兩個(gè)集群的實(shí)現(xiàn)原理。除此之外,其他第三方的模塊也被我們納入存儲(chǔ)層的范疇。
存儲(chǔ)層異構(gòu)模塊的增多,對(duì)前端產(chǎn)品的使用帶來(lái)了挑戰(zhàn)。為此,我們?cè)O(shè)計(jì)了通用的數(shù)據(jù)中間層——glider——來(lái)屏蔽這個(gè)影響。glider以HTTP協(xié)議對(duì)外提供restful方式的接口。數(shù)據(jù)產(chǎn)品可以通過一個(gè)唯一的URL獲取到它想要的數(shù)據(jù)。
以上是淘寶海量數(shù)據(jù)產(chǎn)品在技術(shù)架構(gòu)方面的一個(gè)概括性的介紹,接下來(lái)我將重點(diǎn)從四個(gè)方面闡述數(shù)據(jù)魔方設(shè)計(jì)上的特點(diǎn)。
關(guān)系型數(shù)據(jù)庫(kù)仍然是王道
關(guān)系型數(shù)據(jù)庫(kù)(RDBMS)自20世紀(jì)70年代提出以來(lái),在工業(yè)生產(chǎn)中得到了廣泛的使用。經(jīng)過三十多年的長(zhǎng)足發(fā)展,誕生了一批優(yōu)秀的數(shù)據(jù)庫(kù)軟件,例如Oracle、MySQL、DB2、Sybase和SQL Server等。
圖2 MyFOX中的數(shù)據(jù)增長(zhǎng)曲線
盡管相對(duì)于非關(guān)系型數(shù)據(jù)庫(kù)而言,關(guān)系型數(shù)據(jù)庫(kù)在分區(qū)容忍性(Tolerance to NETwork Partitions)方面存在劣勢(shì),但由于它強(qiáng)大的語(yǔ)義表達(dá)能力以及數(shù)據(jù)之間的關(guān)系表達(dá)能力,在數(shù)據(jù)產(chǎn)品中仍然占據(jù)著不可替代的作用。
淘寶數(shù)據(jù)產(chǎn)品選擇MySQL的MyISAM引擎作為底層的數(shù)據(jù)存儲(chǔ)引擎。在此基礎(chǔ)上,為了應(yīng)對(duì)海量數(shù)據(jù),我們?cè)O(shè)計(jì)了分布式MySQL集群的查詢代理層——MyFOX,使得分區(qū)對(duì)前端應(yīng)用透明。
圖3 MyFOX的數(shù)據(jù)查詢過程
目前,存儲(chǔ)在MyFOX中的統(tǒng)計(jì)結(jié)果數(shù)據(jù)已經(jīng)達(dá)到10TB,占據(jù)著數(shù)據(jù)魔方總數(shù)據(jù)量的95%以上,并且正在以每天超過6億的增量增長(zhǎng)著(如圖2所示)。這些數(shù)據(jù)被我們近似均勻地分布到20個(gè)MySQL節(jié)點(diǎn)上,在查詢時(shí),經(jīng)由MyFOX透明地對(duì)外服務(wù)(如圖3所示)。
圖4 MyFOX節(jié)點(diǎn)結(jié)構(gòu)
值得一提的是,在MyFOX現(xiàn)有的20個(gè)節(jié)點(diǎn)中,并不是所有節(jié)點(diǎn)都是“平等”的。一般而言,數(shù)據(jù)產(chǎn)品的用戶更多地只關(guān)心“最近幾天”的數(shù)據(jù),越早的數(shù)據(jù),越容易被冷落。為此,出于硬件成本考慮,我們?cè)谶@20個(gè)節(jié)點(diǎn)中分出了“熱節(jié)點(diǎn)”和“冷節(jié)點(diǎn)”(如圖4所示)。
顧名思義,“熱節(jié)點(diǎn)”存放最新的、被訪問頻率較高的數(shù)據(jù)。對(duì)于這部分?jǐn)?shù)據(jù),我們希望能給用戶提供盡可能快的查詢速度,所以在硬盤方面,我們選擇了每分鐘15000轉(zhuǎn)的SAS硬盤,按照一個(gè)節(jié)點(diǎn)兩臺(tái)機(jī)器來(lái)計(jì)算,單位數(shù)據(jù)的存儲(chǔ)成本約為4.5W/TB。相對(duì)應(yīng)地,“冷數(shù)據(jù)”我們選擇了每分鐘7500轉(zhuǎn)的SATA硬盤,單碟上能夠存放更多的數(shù)據(jù),存儲(chǔ)成本約為1.6W/TB。
將冷熱數(shù)據(jù)進(jìn)行分離的另外一個(gè)好處是可以有效提高內(nèi)存磁盤比。從圖4可以看出,“熱節(jié)點(diǎn)”上單機(jī)只有24GB內(nèi)存,而磁盤裝滿大約有1.8TB(300 * 12 * 0.5 / 1024),內(nèi)存磁盤比約為4:300,遠(yuǎn)遠(yuǎn)低于MySQL服務(wù)器的一個(gè)合理值。內(nèi)存磁盤比過低導(dǎo)致的后果是,總有一天,即使所有內(nèi)存用完也存不下數(shù)據(jù)的索引了——這個(gè)時(shí)候,大量的查詢請(qǐng)求都需要從磁盤中讀取索引,效率大打折扣。
NoSQL是SQL的有益補(bǔ)充
在MyFOX出現(xiàn)之后,一切都看起來(lái)那么完美,開發(fā)人員甚至不會(huì)意識(shí)到MyFOX的存在,一條不用任何特殊修飾的SQL語(yǔ)句就可以滿足需求。這個(gè)狀態(tài)持續(xù)了很長(zhǎng)一段時(shí)間,直到有一天,我們碰到了傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)無(wú)法解決的問題——全屬性選擇器(如圖5所示)。
圖5 全屬性選擇器
這是一個(gè)非常典型的例子。為了說(shuō)明問題,我們?nèi)匀灰躁P(guān)系型數(shù)據(jù)庫(kù)的思路來(lái)描述。對(duì)于筆記本電腦這個(gè)類目,用戶某一次查詢所選擇的過濾條件可能包括“筆記本尺寸”、“筆記本定位”、“硬盤容量”等一系列屬性(字段),并且在每個(gè)可能用在過濾條件的屬性上,屬性值的分布是極不均勻的。在圖5中我們可以看到,筆記本電腦的尺寸這一屬性有著10個(gè)枚舉值,而“藍(lán)牙功能”這個(gè)屬性值是個(gè)布爾值,數(shù)據(jù)的篩選性非常差。
在用戶所選擇的過濾條件不確定的情況下,解決全屬性問題的思路有兩個(gè):一個(gè)是窮舉所有可能的過濾條件組合,在“云梯”上進(jìn)行預(yù)先計(jì)算,存入數(shù)據(jù)庫(kù)供查詢;另一個(gè)是存儲(chǔ)原始數(shù)據(jù),在用戶查詢時(shí)根據(jù)過濾條件篩選出相應(yīng)的記錄進(jìn)行現(xiàn)場(chǎng)計(jì)算。很明顯,由于過濾條件的排列組合幾乎是無(wú)法窮舉的,第一種方案在現(xiàn)實(shí)中是不可取的;而第二種方案中,原始數(shù)據(jù)存儲(chǔ)在什么地方?如果仍然用關(guān)系型數(shù)據(jù)庫(kù),那么你打算怎樣為這個(gè)表建立索引?
這一系列問題把我們引到了“創(chuàng)建定制化的存儲(chǔ)、現(xiàn)場(chǎng)計(jì)算并提供查詢服務(wù)的引擎”的思路上來(lái),這就是Prometheus(如圖6所示)。
圖6 Prom的存儲(chǔ)結(jié)構(gòu)
從圖6可以看出,我們選擇了HBase作為Prom的底層存儲(chǔ)引擎。之所以選擇HBase,主要是因?yàn)樗墙⒃贖DFS之上的,并且對(duì)于MapReduce有良好的編程接口。盡管Prom是一個(gè)通用的、解決共性問題的服務(wù)框架,但在這里,我們?nèi)匀灰匀珜傩赃x擇為例,來(lái)說(shuō)明Prom的工作原理。這里的原始數(shù)據(jù)是前一天在淘寶上的交易明細(xì),在HBase集群中,我們以屬性對(duì)(屬性與屬性值的組合)作為row-key進(jìn)行存儲(chǔ)。而row-key對(duì)應(yīng)的值,我們?cè)O(shè)計(jì)了兩個(gè)column-family,即存放交易ID列表的index字段和原始交易明細(xì)的data字段。在存儲(chǔ)的時(shí)候,我們有意識(shí)地讓每個(gè)字段中的每一個(gè)元素都是定長(zhǎng)的,這是為了支持通過偏移量快速地找到相應(yīng)記錄,避免復(fù)雜的查找算法和磁盤的大量隨機(jī)讀取請(qǐng)求。
圖7 Prom查詢過程
圖7用一個(gè)典型的例子描述的Prom在提供查詢服務(wù)時(shí)的工作原理,限于篇幅,這里不做詳細(xì)描述。值得一提的是,Prom支持的計(jì)算并不僅限于求和SUM運(yùn)算,統(tǒng)計(jì)意義上的常用計(jì)算都是支持的。在現(xiàn)場(chǎng)計(jì)算方面,我們對(duì)HBase進(jìn)行了擴(kuò)展,Prom要求每個(gè)節(jié)點(diǎn)返回的數(shù)據(jù)是已經(jīng)經(jīng)過“本地計(jì)算”的局部最優(yōu)解,最終的全局最優(yōu)解只是各個(gè)節(jié)點(diǎn)返回的局部最優(yōu)解的一個(gè)簡(jiǎn)單匯總。很顯然,這樣的設(shè)計(jì)思路是要充分利用各個(gè)節(jié)點(diǎn)的并行計(jì)算能力,并且避免大量明細(xì)數(shù)據(jù)的網(wǎng)絡(luò)傳輸開銷。
用中間層隔離前后端
上文提到過,MyFOX和Prom為數(shù)據(jù)產(chǎn)品的不同需求提供了數(shù)據(jù)存儲(chǔ)和底層查詢的解決方案,但隨之而來(lái)的問題是,各種異構(gòu)的存儲(chǔ)模塊給前端產(chǎn)品的使用帶來(lái)了很大的挑戰(zhàn)。并且,前端產(chǎn)品的一個(gè)請(qǐng)求所需要的數(shù)據(jù)往往不可能只從一個(gè)模塊獲取。
舉個(gè)例子,我們要在數(shù)據(jù)魔方中看昨天做熱銷的商品,首先從MyFOX中拿到一個(gè)熱銷排行榜的數(shù)據(jù),但這里的“商品”只是一個(gè)ID,并沒有ID所對(duì)應(yīng)的商品描述、圖片等數(shù)據(jù)。這個(gè)時(shí)候我們要從淘寶主站提供的接口中去獲取這些數(shù)據(jù),然后一一對(duì)應(yīng)到熱銷排行榜中,最終呈現(xiàn)給用戶。
圖8 glider的技術(shù)架構(gòu)
有經(jīng)驗(yàn)的讀者一定可以想到,從本質(zhì)上來(lái)講,這就是廣義上的異構(gòu)“表”之間的JOIN操作。那么,誰(shuí)來(lái)負(fù)責(zé)這個(gè)事情呢?很容易想到,在存儲(chǔ)層與前端產(chǎn)品之間增加一個(gè)中間層,它負(fù)責(zé)各個(gè)異構(gòu)“表”之間的數(shù)據(jù)JOIN和UNION等計(jì)算,并且隔離前端產(chǎn)品和后端存儲(chǔ),提供統(tǒng)一的數(shù)據(jù)查詢服務(wù)。這個(gè)中間層就是glider(如圖8所示)。
緩存是系統(tǒng)化的工程
除了起到隔離前后端以及異構(gòu)“表”之間的數(shù)據(jù)整合的作用之外,glider的另外一個(gè)不容忽視的作用便是緩存管理。上文提到過,在特定的時(shí)間段內(nèi),我們認(rèn)為數(shù)據(jù)產(chǎn)品中的數(shù)據(jù)是只讀的,這是利用緩存來(lái)提高性能的理論基礎(chǔ)。
在圖8中我們看到,glider中存在兩層緩存,分別是基于各個(gè)異構(gòu)“表”(datasource)的二級(jí)緩存和整合之后基于獨(dú)立請(qǐng)求的一級(jí)緩存。除此之外,各個(gè)異構(gòu)“表”內(nèi)部可能還存在自己的緩存機(jī)制。細(xì)心的讀者一定注意到了圖3中MyFOX的緩存設(shè)計(jì),我們沒有選擇對(duì)匯總計(jì)算后的最終結(jié)果進(jìn)行緩存,而是針對(duì)每個(gè)分片進(jìn)行緩存,其目的在于提高緩存的命中率,并且降低數(shù)據(jù)的冗余度。
大量使用緩存的最大問題就是數(shù)據(jù)一致性問題。如何保證底層數(shù)據(jù)的變化在盡可能短的時(shí)間內(nèi)體現(xiàn)給最終用戶呢?這一定是一個(gè)系統(tǒng)化的工程,尤其對(duì)于分層較多的系統(tǒng)來(lái)說(shuō)。
圖9 緩存控制體系
圖9向我們展示了數(shù)據(jù)魔方在緩存控制方面的設(shè)計(jì)思路。用戶的請(qǐng)求中一定是帶了緩存控制的“命令”的,這包括URL中的query string,和HTTP頭中的“If-None-Match”信息。并且,這個(gè)緩存控制“命令”一定會(huì)經(jīng)過層層傳遞,最終傳遞到底層存儲(chǔ)的異構(gòu)“表”模塊。各異構(gòu)“表”除了返回各自的數(shù)據(jù)之外,還會(huì)返回各自的數(shù)據(jù)緩存過期時(shí)間(ttl),而glider最終輸出的過期時(shí)間是各個(gè)異構(gòu)“表”過期時(shí)間的最小值。這一過期時(shí)間也一定是從底層存儲(chǔ)層層傳遞,最終通過HTTP頭返回給用戶瀏覽器的。
緩存系統(tǒng)不得不考慮的另一個(gè)問題是緩存穿透與失效時(shí)的雪崩效應(yīng)。緩存穿透是指查詢一個(gè)一定不存在的數(shù)據(jù),由于緩存是不命中時(shí)被動(dòng)寫的,并且出于容錯(cuò)考慮,如果從存儲(chǔ)層查不到數(shù)據(jù)則不寫入緩存,這將導(dǎo)致這個(gè)不存在的數(shù)據(jù)每次請(qǐng)求都要到存儲(chǔ)層去查詢,失去了緩存的意義。
有很多種方法可以有效地解決緩存穿透問題,最常見的則是采用布隆過濾器,將所有可能存在的數(shù)據(jù)哈希到一個(gè)足夠大的bitmap中,一個(gè)一定不存在的數(shù)據(jù)會(huì)被這個(gè)bitmap攔截掉,從而避免了對(duì)底層存儲(chǔ)系統(tǒng)的查詢壓力。在數(shù)據(jù)魔方里,我們采用了一個(gè)更為簡(jiǎn)單粗暴的方法,如果一個(gè)查詢返回的數(shù)據(jù)為空(不管是數(shù)據(jù)不存在,還是系統(tǒng)故障),我們?nèi)匀话堰@個(gè)空結(jié)果進(jìn)行緩存,但它的過期時(shí)間會(huì)很短,最長(zhǎng)不超過五分鐘。
緩存失效時(shí)的雪崩效應(yīng)對(duì)底層系統(tǒng)的沖擊非??膳隆_z憾的是,這個(gè)問題目前并沒有很完美的解決方案。大多數(shù)系統(tǒng)設(shè)計(jì)者考慮用加鎖或者隊(duì)列的方式保證緩存的單線程(進(jìn)程)寫,從而避免失效時(shí)大量的并發(fā)請(qǐng)求落到底層存儲(chǔ)系統(tǒng)上。在數(shù)據(jù)魔方中,我們?cè)O(shè)計(jì)的緩存過期機(jī)制理論上能夠?qū)⒏鱾€(gè)客戶端的數(shù)據(jù)失效時(shí)間均勻地分布在時(shí)間軸上,一定程度上能夠避免緩存同時(shí)失效帶來(lái)的雪崩效應(yīng)。
結(jié)束語(yǔ)
正是基于本文所描述的架構(gòu)特點(diǎn),數(shù)據(jù)魔方目前已經(jīng)能夠提供壓縮前80TB的數(shù)據(jù)存儲(chǔ)空間,數(shù)據(jù)中間層glider支持每天4000萬(wàn)的查詢請(qǐng)求,平均響應(yīng)時(shí)間在28毫秒(6月1日數(shù)據(jù)),足以滿足未來(lái)一段時(shí)間內(nèi)的業(yè)務(wù)增長(zhǎng)需求。
盡管如此,整個(gè)系統(tǒng)中仍然存在很多不完善的地方。一個(gè)典型的例子莫過于各個(gè)分層之間使用短連接模式的HTTP協(xié)議進(jìn)行通信。這樣的策略直接導(dǎo)致在流量高峰期單機(jī)的TCP連接數(shù)非常高。所以說(shuō),一個(gè)良好的架構(gòu)固然能夠在很大程度上降低開發(fā)和維護(hù)的成本,但它自身一定是隨著數(shù)據(jù)量和流量的變化而不斷變化的。我相信,過不了幾年,淘寶數(shù)據(jù)產(chǎn)品的技術(shù)架構(gòu)一定會(huì)是另外的樣子。
其他文章摘要
【1】海量數(shù)據(jù)領(lǐng)域涵蓋分布式數(shù)據(jù)庫(kù)、分布式存儲(chǔ)、數(shù)據(jù)實(shí)時(shí)計(jì)算、分布式計(jì)算等多個(gè)技術(shù)方向。
對(duì)于海量數(shù)據(jù)處理,從數(shù)據(jù)庫(kù)層面來(lái)講無(wú)非就是兩點(diǎn):1、壓力如何分?jǐn)?,分?jǐn)偟哪康木褪菫榱税鸭惺阶優(yōu)榉植际健?、采用多種的存儲(chǔ)方案,針對(duì)不同的業(yè)務(wù)數(shù)據(jù),不同的數(shù)據(jù)特點(diǎn),采用RDBMS或采用KV Store,選擇不同數(shù)據(jù)庫(kù)軟件,使用集中式或分布式存儲(chǔ),或者是其他的一些存儲(chǔ)方案。
【2】將數(shù)據(jù)庫(kù)進(jìn)行拆分,包括水平拆分和垂直拆分。
水平拆分主要解決兩個(gè)問題:1、底層存儲(chǔ)的無(wú)關(guān)性。2、通過線性的去增加機(jī)器,支持?jǐn)?shù)據(jù)量以及訪問請(qǐng)求包括TPS(Transaction Per Second)、QPS(Query Per Second)的壓力增長(zhǎng)。其方式如把一張大數(shù)據(jù)表按一定的方式拆分到不同的數(shù)據(jù)庫(kù)服務(wù)器上。
海量數(shù)據(jù)從集中式走向分布式,可能涉及跨多個(gè)IDC容災(zāi)備份特性。
【3】阿里巴巴的數(shù)據(jù)對(duì)不同地域數(shù)據(jù)的處理方法。
由三個(gè)產(chǎn)品密切配合解決:是Erosa、Eromanga和Otter。
Erosa做MySQL(或其他數(shù)據(jù)庫(kù)庫(kù))的Bin-Log時(shí)時(shí)解析,解析后放到Eromanga。Eromanga是增量數(shù)據(jù)的發(fā)布訂閱的產(chǎn)品。Erosa產(chǎn)生了時(shí)時(shí)變更的數(shù)據(jù)發(fā)布到Eromanga。然后各個(gè)業(yè)務(wù)端(搜索引擎、數(shù)據(jù)倉(cāng)庫(kù)或關(guān)聯(lián)的業(yè)務(wù)方)通過訂閱的方式,把時(shí)時(shí)變更的數(shù)據(jù)時(shí)時(shí)的通過Push或Pull的方式拉到其業(yè)務(wù)端,進(jìn)行一些業(yè)務(wù)處理。而Otter就是跨IDC的數(shù)據(jù)同步,把數(shù)據(jù)能及時(shí)反映到不同的AA站。
數(shù)據(jù)同步可能會(huì)有沖突,暫時(shí)是以那個(gè)站點(diǎn)數(shù)據(jù)為優(yōu)先,比如說(shuō)A機(jī)房的站點(diǎn)的數(shù)據(jù)是優(yōu)先的,不管怎么樣,它就覆蓋到B的。
【4】對(duì)于緩存。
1、注意切分力度,根據(jù)業(yè)務(wù)選擇切分力度。把緩存力度劃分的越細(xì),緩存命中率相對(duì)會(huì)越高。
2、確認(rèn)緩存的有效生命周期。
【5】拆分策略
1、按字段拆分(最細(xì)力度)。如把表的Company字段拆掉,就按COMPANY_ID來(lái)拆。
2、按表來(lái)拆,把一張表拆到MySQL,那張表拆到MySQL集群,更類似于垂直拆分。
3、按Schema拆分,Schema拆分跟應(yīng)用相關(guān)的。如把某一模塊服務(wù)的數(shù)據(jù)放到某一機(jī)群,另一模塊服務(wù)的數(shù)據(jù)放到其他MySQL機(jī)群。但對(duì)外提供的整體服務(wù)是這些機(jī)群的整體組合,用Cobar來(lái)負(fù)責(zé)協(xié)調(diào)處理。
Cobar類似于MySQL Proxy,解析MySQL所有的協(xié)議,相當(dāng)于可以把它看成MySQL Server來(lái)訪問的。
it知識(shí)庫(kù):淘寶應(yīng)對(duì)"雙11"的技術(shù)架構(gòu)分析,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。