淘寶網採用什麼技術架構來實現網站高負載的

 

淘寶網採用什麼技術架構來實現網站高負載的

2012-11-15 12:30 佚名 轉載 我要評論(0) 字號:T | T
一鍵收藏,隨時查看,分享好友!

下面就結合淘寶目前的一些底層技術框架以及自己的一些感觸來說說如何構建一個可 伸縮,高性能,高可用性的分佈式互聯網應用。

AD:

 

時間過得很快,來淘寶已經兩個月了,在這兩個月的時間裏,自己也感受頗深。下面就結合淘寶目前的一些底層技術框架以及自己的一些感觸來說說如何構建一個可 伸縮,高性能,高可用性的分佈式互聯網應用。

一 應用無狀態(淘寶session框架)

俗話說,一個系 統的伸縮性的好壞取決於應用的狀態如何管理。爲什麼這麼說呢?咱們試想一下,假如我們在session中保存了大量與客戶端的狀態信 息的話,那麼當保存狀態信息的server宕機的時候,我們怎麼辦?通常來說,我們都是通過集羣來解決這個問題,而通常所說的集羣,不僅有負載均衡,更重要的是要有失效恢復failover,比如tomcat採 用的集羣節點廣播複製,jboss採 用的配對複製等session狀 態複製策略,但是集羣中的狀態恢復也有其缺點,那就是嚴重影響了系統的伸縮性,系統不能通過增加更多的機器來達到良好的水平伸縮,因爲集羣節點間session的 通信會隨着節點的增多而開銷增大,因此要想做到應用本身的伸縮性,我們需要保證應用的無狀態性,這樣集羣中的各個節點來說都是相同的,從而是的系統更好的水平伸縮。

OK,上面說了無狀態的重要性,那麼具體如何實現無狀態呢?此時一個session框架就會發揮作用了。幸運的是淘 寶已經具有了此類框架。淘寶的session框架採用的是client cookie實現,主要將狀態保存到了cookie裏 面,這樣就使得應用節點本身不需要保存任何狀態信息,這樣在系統用戶變多的時候,就可以通過增加更多的應用節點來達到水平擴展的目的.但 是採用客戶端cookie的 方式來保存狀態也會遇到限制,比如每個cookie一般不能超過4K的大小,同時很多瀏覽器都限制一個站點最多保存20個cookie.淘 寶cookie框 架採用的是“多值cookie”, 就是一個組合鍵對應多個cookie的 值,這樣不僅可以防止cookie數 量超過20, 同時還節省了cookie存 儲有效信息的空間,因爲默認每個cookie都會有大約50個字節的元信息來描述cookie。

除了淘寶目前的session框 架的實現方式以外,其實集中式session管理來完成,說具體點就是多個無狀態的應用節點連接一個session 服 務器,session服 務器將session保 存到緩存中,session服 務器後端再配有底層持久性數據源,比如數據庫,文件系統等等。

二 有效使用緩存(Tair)

做互聯網應用的兄弟應該都清楚,緩存對於一個互聯網應用是多麼的重要,從瀏覽器緩存,反向代理緩存,頁面緩存,局部頁面緩存,對象緩存等等都是緩存應用的場景。

一 般來說緩存根據與應用程序的遠近程度不同可以分爲:local cache 和 remote cache。 一般系統中要麼採用local cache,要麼採用remote cache,兩者混合使用的話對於local cache和remote cache的數據一致性處理會變 大比較麻煩.

在大部分情況下,我 們所說到的緩存都是讀緩存,緩存還有另外一個類型:寫緩存. 對 於一些讀寫比不高,同時對數據安全性需求不高的數據,我們可以將其緩存起來從而減少對底層數據庫的訪問,比如 統計商品的訪問次數,統 計API的 調用量等等,可 以採用先寫內存緩存然後延遲持久化到數據庫,這樣可以大大減少對數據庫的寫壓力。

OK,我以店鋪線的系統爲例,在用戶瀏覽店鋪的時候,比如店鋪介紹,店鋪交流區頁面,店鋪服務條款頁面,店鋪試衣間頁面,以及店鋪內搜索界面這些界面更新不是非常頻繁,因此適合放到緩存中,這樣可以大大減低DB的負載。另外寶貝詳情頁面相對也更新比較 少,因此也適合放到緩存中來減低DB負載。

三 應用拆分(HSF)

首先,在說明應用拆分之前,我們先來回顧一下一個系統從小變大的過程中遇到的一些問題,通過這些問題我們會發現拆分對於構建一個大型系統是如何的重要。

系統剛上線初期,用戶數並不多,所有的邏輯也許都是放在一個系統中的,所有邏輯跑到一個進程或者一個應用當中,這個時候因爲比較用戶少,系統訪問量低,因此將全部的邏輯都放在一個應用未嘗不可。但是,兄弟們都清楚,好景不長,隨着系統用戶的不斷增加,系統的訪問壓力越來越多,同時隨着系統發展,爲了滿足用戶 的需求,原有的系統需要增加新的功能進來,系統變得越來越複雜的時候,我們會發現系統變得越來越難維護,難擴展,同時系統伸縮性和可用性也會受到影響。那麼這個時候我們如何解決這些問題呢?明智的辦法就是拆分(這也算是一種解耦),我們需要將原來的系統根據一定的標準,比如業務相關性等分爲不同的子系統, 不同的系統負責不同的功能,這樣切分以後,我們可以對單獨的子系統進行擴展和維護,從而提高系統的擴展性和可維護性,同時我們系統的水平伸縮性scale out大 大的提升了,因爲我們可以有針對性的對壓力大的子系統進行水平擴展而不會影響到其它的子系統,而不會像拆分以前,每次系統壓力變大的時候,我們都需要對整個大系統進行伸縮,而這樣的成本是比較大的,另外經過切分,子系統與子系統之間的耦合減低了,當某個子系統暫時不可用的時候,整體系統還是可用的,從而整 體系統的可用性也大大增強了。

因此一個大型的互聯網應用,肯定是要經過拆分,因爲只有拆分了,系統的擴展性,維護性,伸縮性,可用性纔會變的更好。但是拆分也給系統帶來了問題,就是子系統之間如何通信的問題,而具體的通信方式有哪些呢?一般有同步通信和異步通信,這裏我們首先來說下同步通信,下面的主題“消息系 統”會說到異步通信。既然需要通信,這個時候一個高性能的遠程調用框架就顯得非常總要啦,因此咱們淘寶也有了自己的HSF框 架。

上 面所說的都是拆分的好處,但是拆分以後必然的也會帶來新的問題,除了剛纔說的子系統通信問題外,最值得關注的問題就是系統之間的依賴關係,因爲系統多了,系統的依賴關係就會變得複雜,此時就需要更好的去關注拆分標準,比如能否將一些有依賴的系統進行垂直化,使得這些系統的功能儘量的垂直,這也是目前淘寶正 在做的系統垂直化,同時一定要注意系統之間的循環依賴,如果出現循環依賴一定要小心,因爲這可能導致系統連鎖啓動失敗。

OK,既然明白了拆分的重要性,我們看看隨着淘寶的發展,淘寶本身是如何拆分系統的。

首先我們來看以下這個圖:(作者圖片已無法打開,請見諒)

從上面的圖可以看出淘寶系統的一個演變過程,在這個演變的過程中,我們所說的拆分就出現V2.2和V3.0之 間。在V2.2版 本中,淘寶幾乎所有的邏輯都放在(Denali)系統中,這樣導致的問題就是系統擴展和修改非常麻煩,並且更加致命的是隨着淘寶業務量的增加,如果按照V2.2的架構已經沒有辦法支撐以後淘寶的快速發展,因此大家決定對整個系統進行拆分,最 終V3.0版本的淘寶系統架構圖如下:(作者圖片已無法打開,請見諒)

從上圖可以看出V3.0版 本的系統對整個系統進行了水平和垂直兩個方向的拆分,水平方向上,按照功能分爲交易,評價,用戶,商品等系統,同樣垂直方向上,劃分爲業務系統,核心業務系統以及以及基礎服務,這樣以來,各個系統都可以獨立維護和獨立的進行水平伸縮,比如交易系統可以在不影響其它系統的情況下獨立的進行水平伸縮以及功能擴展。

從上面可以看出,一個大型系統要想變得可維護,可擴展,可伸縮,我們必須的對它進行拆分,拆分必然也帶來系統之間如何通信以及系統之間依賴管理等問題,關於通信方面,淘寶目前獨立開發了自己的高性 能服務框架HSF, 此框架主要解決了淘寶目前所有子系統之間的同步和異步通信(目前HSF主要用於同步場合,FutureTask方 式的調用場景還比較少)。至於系統間的依賴管理,目前淘寶還做的不夠好,這應該也是我們以後努力解決的問題。

四 數據庫拆分(TDDL)

在前面“應用拆分”主題中,我們提到了一個大型互聯網應用需要進行良好的拆分,而那裏我們僅僅說了”應用級別”的拆 分,其實我們的互聯網應用除了應用級別的拆分以外,還有另外一個很重要的層面就是存儲如何拆分的。因此這個主題主要涉及到如何對存儲系統,通常就是所說的RDBMS進 行拆分。

好了,確定了這個小節的主題之後,我們回顧一下,一個互聯網應用從小變大的過程中遇到的一些問題,通過遇到的問題來引出我們拆分RDBMS的 重要性。

系 統剛開始的時候,因爲系統剛上線,用戶不多,那個時候,所有的數據都放在了同一個數據庫中,這個時候因爲用戶少壓力小,一個數據庫完全可以應付的了,但是隨着運營那些哥們辛苦的吶喊和拼命的推廣以後,突然有一天發現,oh,god,用戶數量突然變多了起來,隨之而 來的就是數據庫這哥們受不了,它終於在某一天大家都和愜意的時候掛掉啦。此時,咱們搞技術的哥們,就去看看究竟是啥原因,我們查了查以後,發現原來是數據庫讀取壓力太大了,此時咱們都清楚是到了讀寫分離的時候,這個時候我們會配置一個server爲master節 點,然後配幾個salve節 點,這樣以來通過讀寫分離,使得讀取數據的壓力分攤到了不同的salve節點上面,系統終於又恢復了正常,開始正常運行了。但是好景還是不長,有一天我們發現master這哥們撐不住了,它負載老高了,汗 流浹背,隨時都有翹掉的風險,這個時候就需要咱們垂直分區啦(也就是所謂的分庫),比如將商品信息,用戶信息,交易信息分別存儲到不同的數據庫中,同時還可以針對商品信息的庫採用master,salve模式,OK, 通過分庫以後,各個按照功能拆分的數據庫寫壓力被分擔到了不同的server上面,這樣數據庫的壓力終於有恢復到正常狀態。但是是不是這樣,我們就可以高枕無憂了呢?NO,這個NO, 不是我說的,是前輩們通過經驗總結出來的,隨着用戶量的不斷增加,你會發現系統中的某些表會變的異常龐大,比如好友關係表,店鋪的參數配置表等,這個時候無論是寫入還是讀取這些表的數據,對數據庫來說都是一個很耗費精力的事情,因此此時就需要我們進行“水平分區”了(這就是俗話說的分表,或者說sharding).

OK,上 面說了一大堆,無非就是告訴大家一個事實“數據庫是系統中最不容易scale out的一層”,一個大型的互聯網 應用必然會經過一個從單一DB server,到Master/salve,再到垂直分區(分庫),然後再到水平分區(分表,sharding)的過程,而在這個過程中,Master/salve 以 及垂直分區相對比較容易,對應用的影響也不是很大,但是分表會引起一些棘手的問題,比如不能跨越多個分區join查 詢數據,如何平衡各個shards的 負載等等,這個時候就需要一個通用的DAL框架來屏蔽底層數據存儲對應用邏輯的影響,使得底層數據的訪問對應用透明化。

拿淘寶目前的情況來說,淘寶目前也正在從昂貴的高端存儲(小型機+ORACLE)切換到MYSQL,切 換到MYSQL以 後,勢必會遇到垂直分區(分庫)以及水平分區(Sharding)的問題,因此目前淘寶根據自 己的業務特點也開發了自己的TDDL框架,此框架主要解決了分庫分表對應用的透明化以及異構數據庫之間的數據複製

五 異步通信(Notify)

在”遠 程調用框架”的 介紹中,我 們說了一個大型的系統爲了擴展性和伸縮性方面的需求,肯定是要進行拆分,但是 拆分了以後,子 系統之間如何通信就成了我們首要的問題,在”遠程調用框架”小節 中,我 們說了同步通信在一個大型分佈式系統中的應用,那麼這一小節我們就來說說異步通信.好了,既 然說到了異步通信,那 麼”消 息中間件”就 要登場了,採 用異步通信這其實也是關係到系統的伸縮性,以及最大化的對各個子系統進行解耦.

說 到異步通信,我們需要關注的一點是這裏的異步一定是根據業務特點來的,一定是針對業務的異步,通常適合異步的場合是一些鬆耦合的通信場合,而對於本身業務上關聯度比較大的業務系統之間,我們還是要採用同步通信比較靠譜。

OK,那 麼下一步我們說說異步能給系統帶來什麼樣子的好處。首先我們想想,假如系統有A和B兩個 子系統構成,假如A和B是 同步通信的話,那麼要想使得系統整體伸縮性提高必須同時對A和B進行 伸縮,這就影響了對整個系統進行scale out.其次,同步調用還會影響到可用性,從數學推理的角度來說,A同 步調用B, 如果A可 用,那麼B可 用,逆否命題就是如果B不 可用,那麼A也 不可用,這將大大影響到系統可用性,再次,系統之間異步通信以後可以大大提高系統的響應時間,使得每個請求的響應時間變短,從而提高用戶體驗,因此異步在提高了系統的伸縮性以及可用性的同時,也大大的增強了請求的響應時間(當然了,請求的總體處理時間也許不會變少)。

下面我們就以淘寶的業務來看看異步在淘寶的具體應用。交易系統會與很多其它的業務系統交互,如果在一次交易過程中採用同步調用的話,這就要求要向交易成功,必須依賴的所有系統都可用,而如果採用異步通信以後,交易系 統藉助於消息中間件Notify和 其它的系統進行了解耦,這樣以來當其它的系統不可用的時候,也不會影響到某此交易,從而提高了系統的可用性。

最後,關於異步方面的討論,我可以 推薦大家一些資源:

1 . J2EE meets web2.0

2. Ebay架構特點(HPTS 2009)

六 非結構化數據存儲 ( TFS,NOSQL)

在 一個大型的互聯網應用當中,我們會發現並不是所有的數據都是結構化的,比如一些配置文件,一個用戶對應的動態,以及一次交易的快照等信息,這些信息一般不適合保存到RDBMS中, 它們更符合一種Key-value的 結構,另外還有一類數據,數據量非常的大,但是實時性要求不高,此時這些數據也需要通過另外的一種存儲方式進行存儲,另外一些靜態文件,比如各個商品的圖片,商品描述等信息,這些信息因爲比較大,放入RDBMS會引起讀取性能問題,從而影響到其它 的數據讀取性能,因此這些信息也需要和其它信息分開存儲,而一般的互聯網應用系統都會選擇把這些信息保存到分佈式文件系統中,因此淘寶目前也開發了自己的分佈式文件系統TFS,TFS目 前限制了文件大小爲2M, 適合於一些小於2M數 據的存放。

隨 着互聯網的發展,業界從08年 下半年開始逐漸流行了一個概念就是NOSQL。我們都知道根據CAP理論,一致性,可用性和分區容錯性3者 不能同時滿足,最多隻能同時滿足兩個,我們傳統的關係數據採用了ACID的事務策略,而ACID的 事務策略更加講究的是一種高一致性而降低了可用性的需求,但是互聯網應用往往對可用性的要求要略高於一致性的需求,這個時候我們就需要避免採用數據的ACID事 務策略,轉而採用BASE事 務策略,BASE事 務策略是基本可用性,事務軟狀態以及最終一致性的縮寫,通過BASE事務策略,我們可以通過最終一致性來提升系統的可用性,這也是目前很多NOSQL產品所採用的策略,包括facebook 的cassandra,apache hbase,google bigtable等,這些產品非常適合一些非結構化的數據,比如key-value形 式的數據存儲,並且這些產品有個很好的優點就是水平伸縮性。目前淘寶也在研究和使用一些成熟的NOSQL產品。

七 監控、預警系統

對於大型的系統 來說,唯一可靠的就是系統的各個部分是不可靠。

因 爲一個大型的分佈式系統中勢必會涉及到各種各樣的設備,比如網絡交換機,普通PC機,各種型號的網卡,硬盤,內存等等,而這些東東都在數量非常多的時候,出現錯誤的概率也會變大,因此我們需要時時刻刻監控系統的狀態,而監控也有粒度的粗細之分,粒度粗一點的話,我們需要對整個 應用系統進行監控,比如目前的系統網絡流量是多少,內存利用率是多少,IO,CPU的 負載是多少,服務的訪問壓力是多少,服務的響應時間是多少等這一系列的監控,而細粒度一點的話,我們就需對比如應用中的某個功能,某個URL的 訪問量是多,每個頁面的PV是 多少,頁面每天佔用的帶寬是多少,頁面渲染時間是多少,靜態資源比如圖片每天佔用的帶寬是多少等等進行進一步細粒度的監控。因此一個監控系統就變得必不可少了。

前 面說了一個監控系統的重要性,有了監控系統以後,更重要的是要和預警系統結合起來,比如當某個頁面訪問量增多的時候,系統能自動預警,某臺Server的CPU和 內存佔用率突然變大的時候,系統也能自動預警,當併發請求丟失嚴重的時候,系統也能自動預警等等,這樣以來通過監控系統和預警系統的結合可以使得我們能快速響應系統出現的問題,提高系統的穩定性和可用性。

八 配置統一管理

一個大型的分佈 式應用,一般都是有很多節點構成的,如果每次一個新的節點加入都要更改其它節點的配置,或者每次刪除一個節點也要更改配置的話,這樣不僅不利於系統的維護和管理,同時也更加容易引入錯誤。另外很多時候集羣中的很多系統的配置都是一樣的,如果不進行統一的配置管理,就需要再所有的系統上維護一份配置,這樣會 造成配置的管理維護很麻煩,而通過一個統一的配置管理可以使得這些問題得到很好的解決,當有新的節點加入或者刪除的時候,配置管理系統可以通知各個節點更新配置,從而達到所有節點的配置一致性,這樣既方便也不會出錯。

【責任編輯:張玉 TEL:(010)68476606】

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章