黃冬,多年軟件開發(fā)、系統(tǒng)架構(gòu)、系統(tǒng)運營的經(jīng)驗。長期關(guān)注高可用性、高可擴展性的系統(tǒng)架構(gòu)設計。主持設計和運行過多個大型高容量產(chǎn)品和系統(tǒng)。是中國FreeBSD、Python社區(qū)的發(fā)起者和積極參與者,也是國內(nèi)啄木鳥(http://www..woodpecker.org.cn)社區(qū)的創(chuàng)始人之一?,F(xiàn)在北京從事系統(tǒng)架構(gòu)咨詢及系統(tǒng)運營外包的的創(chuàng)業(yè)。
鄧毅,網(wǎng)易有道技術(shù)總監(jiān),負責新技術(shù)與應用研究團隊的工作,帶領(lǐng)很多有道核心技術(shù)的開發(fā)。清華大學計算機系博士學位,在模式識別、計算機視覺等領(lǐng)域有豐富的研究經(jīng)驗。
黃冬:互聯(lián)網(wǎng)在過去的數(shù)年中發(fā)展迅速,交換帶寬已經(jīng)從10M迅速提升到了萬M,而計算機的總線、CPU計算能力出現(xiàn)了很多瓶頸。經(jīng)常會發(fā)現(xiàn)一臺服務器的帶寬有千M甚至更高,而使用的卻不足,在架構(gòu)上有什么考慮,讓一臺服務器能更多用起這樣的帶寬來?
鄧毅:網(wǎng)絡技術(shù)的高速發(fā)展的確使得單臺服務器的帶寬有了很大的提高,這可以使得一些以前不太好做的事情更容易的實現(xiàn)。
一方面,對于后臺計算服務部分,高速的帶寬使得我們可以把更多的服務器通過以太網(wǎng)連接起來,進行大規(guī)模的分布式運算,讓不同的機器處理大數(shù)據(jù)的不同部分,再通過網(wǎng)絡把數(shù)據(jù)進行匯總,從而得到以前需要大型機才能獲得的超大規(guī)模的計算能力,這讓我們可以從海量的數(shù)據(jù)中分析出更加有用的信息。此外,通過網(wǎng)絡,我們可以把多臺機器聯(lián)合起來組成分布式的存儲系統(tǒng),從而提高系統(tǒng)的存儲容量、訪問帶寬以及可靠性。
另一方面,在前端與用戶直接接觸的部分,由于帶寬的提升、網(wǎng)速的變快,用戶的客戶端程序可以更加頻繁的與服務器進行通訊,傳輸更多的數(shù)據(jù),“云計算”或者“軟件加服務”的模式,使得原來單機服務無法實現(xiàn)的功能或者服務質(zhì)量得以實現(xiàn)。例如有道的詞典,當存在網(wǎng)絡連接的時候,客戶端的軟件會把查詢需求發(fā)送到服務器端,服務器端可以在一個非常大的詞庫中進行查詢,還可以做一些智能分析的操作,從而在不占用用戶本地資源的情況下,大大提升用戶的體驗。另一個例子是類似“云殺毒”之類的應用,通過網(wǎng)絡把數(shù)據(jù)傳回服務器進行殺毒,也是充分利用當今互聯(lián)網(wǎng)的帶寬。
黃冬:作為負載均衡的一種方式,基于四層、七層的負載均衡交換在很長的時間里都是一種非常簡單和常用的解決方案,隨著服務器計算能力的提升,這種解決方案會發(fā)現(xiàn)越來越像是一個瓶頸點,有什么更好的考慮來解決這樣的問題?
鄧毅:當網(wǎng)站的流量不斷變大的時候,負載均衡交換的方法是一個較為簡單的擴展系統(tǒng)容量的辦法,但是它畢竟是一個通用的解決方案,有一定的局限性。所以,當這個方案遇到瓶頸的時候,就需要對業(yè)務流程和用戶訪問行為進行更細致的分析,找到可能的瓶頸。通常,解決這一些瓶頸的辦法來源于對一些冗余運算或 I/O 的優(yōu)化。例如,負載均衡有可能導致一些重復的運算(可能被均衡到不同的機器上去了),此時通過優(yōu)化均衡方法、優(yōu)化系統(tǒng)結(jié)構(gòu),可能可以在某個地方放入一個合適的緩存,保存中間結(jié)果,從而避免重復的運算,最終提高系統(tǒng)的吞吐。再進一步,如果還存在瓶頸,就可能需要在系統(tǒng)架構(gòu)的層次做妥協(xié),比如通過犧牲一定程度上事務的一致性換取更高的性能。
黃冬:互聯(lián)網(wǎng)的即時計算越來越多,而這樣的計算越來越多的依賴大量的數(shù)據(jù)存儲,比如依據(jù)數(shù)千萬甚至更多的用戶使用習慣和用戶自身的使用歷史,得出該次搜索的排充。在這樣的計算面前是否有什么巧妙的方法?
鄧毅:使用大量的用戶行為數(shù)據(jù)進行智能的分析,的確能夠得到一些非常有用的數(shù)據(jù),從而提升用戶的體驗。當然,這里需要大量的計算資源。
對于一些即時計算的場合,如果想享受這些數(shù)據(jù)帶來的好處,一個辦法就是把一些計算模型進行劃分:對于規(guī)模較大且較長時期不會變化從而可以預處理的部分,在后臺花費一些計算資源預先計算好,然后通過分布式的只讀系統(tǒng)提供快速的讀取服務;中等規(guī)模變化較快的數(shù)據(jù),可以建立快速計算流程,定時計算,并立即可以訪問;而與本次操作直接相關(guān)的數(shù)據(jù),如用戶特征、搜索詞等,才是真正的即時計算,這時候需要考慮到足夠短的響應時間。
把計算模型分解成這樣的三個層次并不總是一件特別容易的時候,有時候甚至需要對計算模型進行必要少量的修改,在不大幅度犧牲準確度的情況下做一些簡化,從而可以讓不同類型的數(shù)據(jù)分開計算,最后再綜合一起處理。
黃冬:垂直搜索引擎已經(jīng)成為各個網(wǎng)站及業(yè)務系統(tǒng)的必備功能,在這方面是否有一些良好的現(xiàn)成產(chǎn)品和架構(gòu)方案?
鄧毅:隨著互聯(lián)網(wǎng)用戶對于搜索這個概念的認識,垂直搜索日益成為各個網(wǎng)站的一個重要功能。當用戶不知道某個東西在哪里的時候,可能不愿意一層層的去找,而會去搜。
相比通用搜索引擎,垂直搜索首先需要保證較低的開發(fā)成本,因為網(wǎng)站最大的技術(shù)力量需要花在其自身的核心價值上;其次,這樣的引擎需要滿足一定的性能和質(zhì)量要求,雖然不必與通用過的搜索引擎那樣快、那樣準;最后,網(wǎng)站通常有自己特有的一些東西,比如一些結(jié)構(gòu)較為特殊的數(shù)據(jù)需要搜索或者影響搜索排序,這就要求一個結(jié)構(gòu)和功能可以方便定制的引擎。
互聯(lián)網(wǎng)上有不少優(yōu)秀的開源項目, 我個人比較了解的有Apache 的分布式存儲與計算軟件Hadoop、搜索索引軟件Lucene 等。
黃冬:大量的用戶使用行為記錄需要留存,而留存下的數(shù)據(jù)量非常大,對于相關(guān)的數(shù)據(jù)也要進行頻繁和復雜的業(yè)務計算,對于這樣的存儲有什么解決方案嗎?對于這樣的分析型計算有什么有效的架構(gòu) ?
鄧毅:首先存儲方面,根據(jù)計算對于數(shù)據(jù)的讀寫需求,可以有兩種方案:
一種方式是采用適合流式處理的分布式文件系統(tǒng),如 HDFS、GFS,通過自動數(shù)據(jù)塊的備份等技術(shù),可以保證數(shù)據(jù)的可靠存儲,同時利用大數(shù)據(jù)塊的存儲保證流式順序數(shù)據(jù)讀寫的高性能。當一些數(shù)據(jù)需要經(jīng)常性的全量訪問,且這樣的訪問較容易流式的處理的時候,可以把這些數(shù)據(jù)存在這類文件系統(tǒng)中。
另一種方式是采用分布式的Key-Value 結(jié)構(gòu),如HBase、BigTable 等,他們的特點是可以支持隨機讀寫,而簡化的操作限制又使得它比數(shù)據(jù)庫更容易實現(xiàn)大規(guī)模的分布式結(jié)構(gòu),因而適合計算中只需要讀寫海量數(shù)據(jù)中隨機一部分條目的情況。
運算框架只要是支持大規(guī)模分布運算的都可以,例如前面提到的基于Map/Reduce 的分布式計算框架Hadoop。
(本文來自《程序員》雜志0911期,更多精彩內(nèi)容敬請關(guān)注0911期)