互聯(lián)網(wǎng)架構(gòu)模板:“存儲(chǔ)層”技術(shù)
很多人對(duì)于 BAT 的技術(shù)有一種莫名的崇拜感,覺(jué)得只有天才才能做出這樣的系統(tǒng),但經(jīng)過(guò)前面對(duì)架構(gòu)的本質(zhì)、架構(gòu)的設(shè)計(jì)原則、架構(gòu)的設(shè)計(jì)模式、架構(gòu)演進(jìn)等多方位的探討和闡述,你可以看到,其實(shí)并沒(méi)有什么神秘的力量和魔力融合在技術(shù)里面,而是業(yè)務(wù)的不斷發(fā)展推動(dòng)了技術(shù)的發(fā)展,這樣一步一個(gè)腳印,持續(xù)幾年甚至十幾年的發(fā)展,才能達(dá)到當(dāng)前技術(shù)復(fù)雜度和先進(jìn)性。
拋開(kāi) BAT 各自差異很大的業(yè)務(wù),站在技術(shù)的角度來(lái)看,其實(shí) BAT 的技術(shù)架構(gòu)基本是一樣的。再將視角放大,你會(huì)發(fā)現(xiàn)整個(gè)互聯(lián)網(wǎng)行業(yè)的技術(shù)發(fā)展,最后都是殊途同歸。
如果你正處于一個(gè)創(chuàng)業(yè)公司,或者正在為成為另一個(gè) BAT 拼搏,那么深入理解這種技術(shù)模式(或者叫技術(shù)結(jié)構(gòu)、技術(shù)架構(gòu)),對(duì)于自己和公司的發(fā)展都大有裨益。
互聯(lián)網(wǎng)的標(biāo)準(zhǔn)技術(shù)架構(gòu)如下圖所示,這張圖基本上涵蓋了互聯(lián)網(wǎng)技術(shù)公司的大部分技術(shù)點(diǎn),不同的公司只是在具體的技術(shù)實(shí)現(xiàn)上稍有差異,但不會(huì)跳出這個(gè)框架的范疇。

從本期開(kāi)始,我將逐層介紹每個(gè)技術(shù)點(diǎn)的產(chǎn)生背景、應(yīng)用場(chǎng)景、關(guān)鍵技術(shù),有的技術(shù)點(diǎn)可能已經(jīng)在前面的架構(gòu)模式部分有所涉及,因此就不再詳細(xì)展開(kāi)技術(shù)細(xì)節(jié)了,而是將關(guān)鍵技術(shù)點(diǎn)分門別類,進(jìn)而形成一張架構(gòu)大圖,讓架構(gòu)師對(duì)一個(gè)公司的整體技術(shù)架構(gòu)有一個(gè)完整的全貌認(rèn)知。
今天我們首先來(lái)聊聊互聯(lián)網(wǎng)架構(gòu)模板的“存儲(chǔ)層”技術(shù)。
SQL
SQL 即我們通常所說(shuō)的關(guān)系數(shù)據(jù)。前幾年 NoSQL 火了一陣子,很多人都理解為 NoSQL 是完全拋棄關(guān)系數(shù)據(jù),全部采用非關(guān)系型數(shù)據(jù)。但經(jīng)過(guò)幾年的試驗(yàn)后,大家發(fā)現(xiàn)關(guān)系數(shù)據(jù)不可能完全被拋棄,NoSQL 不是 No SQL,而是 Not Only SQL,即 NoSQL 是 SQL 的補(bǔ)充。
所以互聯(lián)網(wǎng)行業(yè)也必須依賴關(guān)系數(shù)據(jù),考慮到 Oracle 太貴,還需要專人維護(hù),一般情況下互聯(lián)網(wǎng)行業(yè)都是用 MySQL、PostgreSQL 這類開(kāi)源數(shù)據(jù)庫(kù)。這類數(shù)據(jù)庫(kù)的特點(diǎn)是開(kāi)源免費(fèi),拿來(lái)就用;但缺點(diǎn)是性能相比商業(yè)數(shù)據(jù)庫(kù)要差一些。隨著互聯(lián)網(wǎng)業(yè)務(wù)的發(fā)展,性能要求越來(lái)越高,必然要面對(duì)一個(gè)問(wèn)題:將數(shù)據(jù)拆分到多個(gè)數(shù)據(jù)庫(kù)實(shí)例才能滿足業(yè)務(wù)的性能需求(其實(shí) Oracle 也一樣,只是時(shí)間早晚的問(wèn)題)。
數(shù)據(jù)庫(kù)拆分滿足了性能的要求,但帶來(lái)了復(fù)雜度的問(wèn)題:數(shù)據(jù)如何拆分、數(shù)據(jù)如何組合?這個(gè)復(fù)雜度的問(wèn)題解決起來(lái)并不容易,如果每個(gè)業(yè)務(wù)都去實(shí)現(xiàn)一遍,重復(fù)造輪子將導(dǎo)致投入浪費(fèi)、效率降低,業(yè)務(wù)開(kāi)發(fā)想快都快不起來(lái)。
所以互聯(lián)網(wǎng)公司流行的做法是業(yè)務(wù)發(fā)展到一定階段后,就會(huì)將這部分功能獨(dú)立成中間件,例如百度的 DBProxy、淘寶的 TDDL。不過(guò)這部分的技術(shù)要求很高,將分庫(kù)分表做到自動(dòng)化和平臺(tái)化,不是一件容易的事情,所以一般是規(guī)模很大的公司才會(huì)自己做。中小公司建議使用開(kāi)源方案,例如 MySQL 官方推薦的 MySQL Router、360 開(kāi)源的數(shù)據(jù)庫(kù)中間件 Atlas。
假如公司業(yè)務(wù)繼續(xù)發(fā)展,規(guī)模繼續(xù)擴(kuò)大,SQL 服務(wù)器越來(lái)越多,如果每個(gè)業(yè)務(wù)都基于統(tǒng)一的數(shù)據(jù)庫(kù)中間件獨(dú)立部署自己的 SQL 集群,就會(huì)導(dǎo)致新的復(fù)雜度問(wèn)題,具體表現(xiàn)在:
數(shù)據(jù)庫(kù)資源使用率不高,比較浪費(fèi)。
各 SQL 集群分開(kāi)維護(hù),投入的維護(hù)成本越來(lái)越高。
因此,實(shí)力雄厚的大公司此時(shí)一般都會(huì)在 SQL 集群上構(gòu)建 SQL 存儲(chǔ)平臺(tái),以對(duì)業(yè)務(wù)透明的形式提供資源分配、數(shù)據(jù)備份、遷移、容災(zāi)、讀寫分離、分庫(kù)分表等一系列服務(wù),例如淘寶的 UMP(Unified MySQL Platform)系統(tǒng)。
NoSQL
首先 NoSQL 在數(shù)據(jù)結(jié)構(gòu)上與傳統(tǒng)的 SQL 的不同,例如典型的 Memcache 的 key-value 結(jié)構(gòu)、Redis 的復(fù)雜數(shù)據(jù)結(jié)構(gòu)、MongoDB 的文檔數(shù)據(jù)結(jié)構(gòu);其次,NoSQL 無(wú)一例外地都會(huì)將性能作為自己的一大賣點(diǎn)。NoSQL 的這兩個(gè)特點(diǎn)很好地彌補(bǔ)了關(guān)系數(shù)據(jù)庫(kù)的不足,因此在互聯(lián)網(wǎng)行業(yè) NoSQL 的應(yīng)用基本上是基礎(chǔ)要求。
由于 NoSQL 方案一般自己本身就提供集群的功能,例如 Memcache 的一致性 Hash 集群、Redis 3.0 的集群,因此 NoSQL 在剛開(kāi)始應(yīng)用時(shí)很方便,不像 SQL 分庫(kù)分表那么復(fù)雜。一般公司也不會(huì)在開(kāi)始時(shí)就考慮將 NoSQL 包裝成存儲(chǔ)平臺(tái),但如果公司發(fā)展很快,例如 Memcache 的節(jié)點(diǎn)有上千甚至幾千時(shí),NoSQL 存儲(chǔ)平臺(tái)就很有意義了。首先是存儲(chǔ)平臺(tái)通過(guò)集中管理能夠大大提升運(yùn)維效率;其次是存儲(chǔ)平臺(tái)可以大大提升資源利用效率,2000 臺(tái)機(jī)器,如果利用率能提升 10%,就可以減少 200 臺(tái)機(jī)器,一年幾十萬(wàn)元就節(jié)省出來(lái)了。
所以,NoSQL 發(fā)展到一定規(guī)模后,通常都會(huì)在 NoSQL 集群的基礎(chǔ)之上再實(shí)現(xiàn)統(tǒng)一存儲(chǔ)平臺(tái),統(tǒng)一存儲(chǔ)平臺(tái)主要實(shí)現(xiàn)這幾個(gè)功能:
資源動(dòng)態(tài)按需動(dòng)態(tài)分配:例如同一臺(tái) Memcache 服務(wù)器,可以根據(jù)內(nèi)存利用率,分配給多個(gè)業(yè)務(wù)使用。
資源自動(dòng)化管理:例如新業(yè)務(wù)只需要申請(qǐng)多少 Memcache 緩存空間就可以了,無(wú)需關(guān)注具體是哪些 Memcache 服務(wù)器在為自己提供服務(wù)。
故障自動(dòng)化處理:例如某臺(tái) Memcache 服務(wù)器掛掉后,有另外一臺(tái)備份 Memcache 服務(wù)器能立刻接管緩存請(qǐng)求,不會(huì)導(dǎo)致丟失很多緩存數(shù)據(jù)。
當(dāng)然要發(fā)展到這個(gè)階段,一般也是大公司才會(huì)這么做,簡(jiǎn)單來(lái)說(shuō)就是如果只有幾十臺(tái) NoSQL 服務(wù)器,做存儲(chǔ)平臺(tái)收益不大;但如果有幾千臺(tái) NoSQL 服務(wù)器,NoSQL 存儲(chǔ)平臺(tái)就能夠產(chǎn)生很大的收益。
小文件存儲(chǔ)
除了關(guān)系型的業(yè)務(wù)數(shù)據(jù),互聯(lián)網(wǎng)行業(yè)還有很多用于展示的數(shù)據(jù)。例如,淘寶的商品圖片、商品描述;Facebook 的用戶圖片;新浪微博的一條微博內(nèi)容等。這些數(shù)據(jù)具有三個(gè)典型特征:一是數(shù)據(jù)小,一般在 1MB 以下;二是數(shù)量巨大,F(xiàn)acebook 在 2013 年每天上傳的照片就達(dá)到了 3.5 億張;三是訪問(wèn)量巨大,F(xiàn)acebook 每天的訪問(wèn)量超過(guò) 10 億。
由于互聯(lián)網(wǎng)行業(yè)基本上每個(gè)業(yè)務(wù)都會(huì)有大量的小數(shù)據(jù),如果每個(gè)業(yè)務(wù)都自己去考慮如何設(shè)計(jì)海量存儲(chǔ)和海量訪問(wèn),效率自然會(huì)低,重復(fù)造輪子也會(huì)投入浪費(fèi),所以自然而然就要將小文件存儲(chǔ)做成統(tǒng)一的和業(yè)務(wù)無(wú)關(guān)的平臺(tái)。
和 SQL 和 NoSQL 不同的是,小文件存儲(chǔ)不一定需要公司或者業(yè)務(wù)規(guī)模很大,基本上認(rèn)為業(yè)務(wù)在起步階段就可以考慮做小文件統(tǒng)一存儲(chǔ)。得益于開(kāi)源運(yùn)動(dòng)的發(fā)展和最近幾年大數(shù)據(jù)的火爆,在開(kāi)源方案的基礎(chǔ)上封裝一個(gè)小文件存儲(chǔ)平臺(tái)并不是太難的事情。例如,HBase、Hadoop、Hypertable、FastDFS 等都可以作為小文件存儲(chǔ)的底層平臺(tái),只需要將這些開(kāi)源方案再包裝一下基本上就可以用了。
典型的小文件存儲(chǔ)有:淘寶的 TFS、京東 JFS、Facebook 的 Haystack。
下圖是淘寶 TFS 的架構(gòu):

大文件存儲(chǔ)
互聯(lián)網(wǎng)行業(yè)的大文件主要分為兩類:一類是業(yè)務(wù)上的大數(shù)據(jù),例如 Youtube 的視頻、電影網(wǎng)站的電影;另一類是海量的日志數(shù)據(jù),例如各種訪問(wèn)日志、操作日志、用戶軌跡日志等。和小文件的特點(diǎn)正好相反,大文件的數(shù)量沒(méi)有小文件那么多,但每個(gè)文件都很大,幾百 MB、幾個(gè) GB 都是常見(jiàn)的,幾十 GB、幾 TB 也是有可能的,因此在存儲(chǔ)上和小文件有較大差別,不能直接將小文件存儲(chǔ)系統(tǒng)拿來(lái)存儲(chǔ)大文件。
說(shuō)到大文件,特別要提到 Google 和 Yahoo,Google 的 3 篇大數(shù)據(jù)論文(Bigtable/Map- Reduce/GFS)開(kāi)啟了一個(gè)大數(shù)據(jù)的時(shí)代,而 Yahoo 開(kāi)源的 Hadoop 系列(HDFS、HBase 等),基本上壟斷了開(kāi)源界的大數(shù)據(jù)處理。當(dāng)然,江山代有才人出,長(zhǎng)江后浪推前浪,Hadoop 后又有更多優(yōu)秀的開(kāi)源方案被貢獻(xiàn)出來(lái),現(xiàn)在隨便走到大街上拉住一個(gè)程序員,如果他不知道大數(shù)據(jù),那基本上可以確定是“火星程序員”。
對(duì)照 Google 的論文構(gòu)建一套完整的大數(shù)據(jù)處理方案的難度和成本實(shí)在太高,而且開(kāi)源方案現(xiàn)在也很成熟了,所以大數(shù)據(jù)存儲(chǔ)和處理這塊反而是最簡(jiǎn)單的,因?yàn)槟銢](méi)有太多選擇,只能用這幾個(gè)流行的開(kāi)源方案,例如,Hadoop、HBase、Storm、Hive 等。實(shí)力雄厚一些的大公司會(huì)基于這些開(kāi)源方案,結(jié)合自己的業(yè)務(wù)特點(diǎn),封裝成大數(shù)據(jù)平臺(tái),例如淘寶的云梯系統(tǒng)、騰訊的 TDW 系統(tǒng)。
下面是 Hadoop 的生態(tài)圈:

小結(jié)
今天我為你講了互聯(lián)網(wǎng)架構(gòu)模板中的存儲(chǔ)層技術(shù),可以看到當(dāng)公司規(guī)模發(fā)展到一定階段后,基本上都是基于某個(gè)開(kāi)源方案搭建統(tǒng)一的存儲(chǔ)平臺(tái),希望對(duì)你有所幫助。
這就是今天的全部?jī)?nèi)容,留一道思考題給你吧,既然存儲(chǔ)技術(shù)發(fā)展到最后都是存儲(chǔ)平臺(tái),為何沒(méi)有出現(xiàn)存儲(chǔ)平臺(tái)的開(kāi)源方案,但云計(jì)算卻都提供了存儲(chǔ)平臺(tái)方案?
歡迎你把答案寫到留言區(qū),和我一起討論。相信經(jīng)過(guò)深度思考的回答,也會(huì)讓你對(duì)知識(shí)的理解更加深刻。