高效穩定的大型網站系統架構分析(轉)

作者:zhen-liang
鏈接:https://www.zhihu.com/question/29774509/answer/105214270
來源:知乎
著作權歸作者所有,轉載請聯繫作者獲得授權。

千萬人同時訪問的網站,一般是有很多個數據庫同時工作,說明白一點就是數據庫集羣和併發控制,這樣的網站實時性也是相對的。這些網站都有一些共同的特點:數據量大,在線人數多,併發請求多,pageview高,響應速度快。總結了一下各個大網站的架構,主要提高效率及穩定性的幾個地方包括:

    1、程序

    程序開發是一方面,系統架構設計(硬件+網絡+軟件)是另一方面。

    軟件架構方面,做網站首先需要很多web服務器存儲靜態資源,比如圖片、視頻、靜態頁等,千萬不要把靜態資源和應用服務器放在一起。

    一個好的程序員寫出來的程序會非常簡潔、性能很好,一個初級程序員可能會犯很多低級錯誤,這也是影響網站性能的原因之一。

    網站要做到效率高,不光是程序員的事情,數據庫優化、程序優化這是必須的,在性能優化上要數據庫和程序齊頭並進!緩存也是兩方面同時入手。第一,數據庫緩存和數據庫優化,這個由dba完成(而且這個有非常大的潛力可挖,只是由於我們都是程序員而忽略了他而已)。第二,程序上的優化,這個非常的有講究,比如說重要一點就是要規範SQL語句,少用in 多用or,多用preparestatement,另外避免程序冗餘如查找數據少用雙重循環等。另外選用優秀的開源框架加以支持,我個人認爲中後臺的支持是最最重要的,可以選取spring+ibatis。因爲ibatis直接操作SQL並有緩存機制。spring的好處就不用我多說了,IOC的機制可以避免new對象,這樣也節省開銷。據我分析,絕大部分的開銷就是在NEW的時候和連接數據庫時候產生的,請儘量避免。另外可以用一些內存測試工具來做一個demo說明hibernate和ibatis誰更快!前臺你想用什麼就用什麼,struts,webwork都成,如果覺得自己挺牛X可以試試tapestry。

    用數據庫也未必不能解決訪問量巨大所帶來的問題,作成靜態文件硬盤的尋址時間也未必少於數據庫的搜索時間,當然對資料的索引要下一翻工夫。我自己覺得門戶往往也就是當天、熱門的資料點擊率較高,將其做緩存最多也不過1~2G的數據量吧,舉個例子:

  拿網易新聞來ÉîÛÚ¸£ÌïÇøÒ

    格式化一下,方便理解:http://域名/年/月日/新聞所屬分類/新聞ID.html

    可以把當天發佈的、熱門的、流攬量大的作個緩寸,用hashtable(key:年-月-日-分類-ID,value:新聞對象),靜態將其放到內存(速度絕對快過硬盤尋址靜態頁面)。

  通常是採用oracle存儲過程+2個weblogic,更新機制也幾乎一樣每簽發一條新聞,就會生成靜態頁面,然後發往前端的web服務器,前端的web都是做負載均衡的。另外還有定時的程序,每5-15分鐘自動生成一次。在發佈新聞的同時將數據緩存。當然緩存也不會越來越大,在個特定的時間段(如凌晨)剔除過期的數據。做一個大的網站遠沒有想象中那麼簡單,服務器基本就要百十個的。

    這樣可以大大增加一臺計算機的處理速度,如果一臺機器處理不了,可以用httpserver集羣來解決問題了。

    2、網絡

    中國的網絡分南北電信和網通,訪問的ip就要區分南北進入不同的網絡。

    3、集羣

    通常會使用CDN與GSBL與DNS負載均衡技術,每個地區一組前臺服務器羣,例如:網易,百度使用了DNS負載均衡技術,每個頻道一組前臺服務器,一搜使用了DNS負載技術,所有頻道共用一組前臺服務器集羣。

    網站使用基於Linux集羣的負載均衡,失敗恢復,包括應用服務器和數據庫服務器,基於linux-ha的服務狀態檢測及高可用化。

    應用服務器集羣可以採用apache+tomcat集羣和weblogic集羣等;web服務器集羣可以用反向代理,也可以用NAT的方式,或者多域名解析都可以;Squid也可以,方法很多,可以根據情況選擇。

   4、數據庫

    因爲是千萬人同時訪問的網站,所以一般是有很多個數據庫同時工作的,說明白一點就是數據庫集羣和併發控制,數據分佈到地理位置不同的數據中心,以免發生斷電事故。另外還有一點的是,那些網站的靜態化網頁並不是真的,而是通過動態網頁與靜態網頁網址交換做出現的假象,這可以用urlrewrite 這樣的開源網址映射器實現。這樣的網站實時性也是相對的,因爲在數據庫複製數據的時候有一個過程,一般在技術上可以用到hibernate和 ecache,但是如果要使網站工作地更好,可以使用EJB和websphere,weblogic這樣大型的服務器來支持,並且要用oracle這樣的大型數據庫。

    大型門戶網站不建議使用Mysql數據庫,除非你對Mysql數據的優化非常熟悉。Mysql數據庫服務器的master-slave模式,利用數據庫服務器在主從服務器間進行同步,應用只把數據寫到主服務器,而讀數據時則根據負載選擇一臺從服務器或者主服務器來讀取,將數據按不同策略劃分到不同的服務器(組)上,分散數據庫壓力。

    大型網站要用oracle,數據方面操作儘量多用存儲過程,絕對提升性能;同時要讓DBA對數據庫進行優化,優化後的數據庫與沒優化的有天壤之別;同時還可以擴展分佈式數據庫,以後這方面的研究會越來越多;

    5、頁面

    從開始就考慮使用虛擬存儲/簇文件系統。它能讓你大量並行IO訪問,而且不需要任何重組就能夠增加所需要的磁盤。

    頁面數據調用更要認真設計,一些數據查詢可以不通過數據庫的方式,實時性要求不高的可以使用lucene來實現,即使有實時性的要求也可以用lucene,lucene+compass還是非常優秀的。

    新聞類的網站可以用靜態頁存儲,採用定時更新機制減輕服務器負擔;首頁每個小模塊可以使用oscache緩存,這樣不用每次都拉數據。

    前端的基於靜態頁面緩存的web加速器,主要應用有squid等。squid 將大部分靜態資源(圖片,js,css等)緩存起來,直接返回給訪問者,減少應用服務器的負載網站的靜態化網頁並不是真的,而是通過動態網頁與靜態網頁網址交換做出現的假象,這可以用urlrewrite這樣的開源網址映射器實現,後綴名爲htm或者html並不能說明程序生成了靜態頁面,可能是通過 url重寫來實現的,爲的只不過是在搜索引擎中提升自己網站的覆蓋面積罷了。

    生成靜態頁面的服務器和www服務器是兩組不同的服務器,頁面生成後纔會到www服務器,一部分數據庫並不是關係數據庫,這樣更適合信息衍生,www、mail服務器、路由器多,主要用負載平衡解決訪問瓶頸。

    靜態頁面的缺點:

    1) 增加了程序的複雜度

    2) 不利於管理資料

    3) 速度不是最快

    4) 傷硬盤

    6、緩存

    從一開始就應該使用緩存,高速緩存是一個更好的地方存儲臨時數據,比如Web站點上跟蹤一個特定用戶的會話產生的臨時文件,就不再需要記錄到數據庫裏。

    不能用lucene實現的可以用緩存,分佈式緩存可以用memcached,如果有錢的話用10來臺機器做緩存,> 10G的存儲量相信存什麼都夠了;如果沒錢的話可以在頁面緩存和數據緩存上下功夫,多用OSCACHE和EHCACHE,SWARMCACHE也可以,不過據說同步性不是很好;

    可以使用Memcache進行緩存,用大內存把這些不變的數據全都緩存起來,而當修改時就通知cache過期,memcache是LJ開發的一款分佈式緩存產品,很多大型網站在應用,我們可以把Cache Server與AppServer裝在一起。因爲Cache Server對CPU消耗不大,而有了Cache Server的支援,App Server對內存要求也不是太高,所以可以和平共處,更有效的利用資源。

 根據我現有的閱讀和談話,我所理解的今天Facebook的架構如下:

Web 前端是由 PHP 寫的。Facebook 的 HipHop [1] 會把PHP轉成 C++並用 g++編譯,這樣就可以爲模板和Web邏賀業務層提供高的性能。
業務邏輯以Service的形式存在,其使用Thrift [2]。這些Service根據需求的不同由PHP,C++或Java實現(也可以用到了其它的一些語言……)
用Java寫的Services沒有用到任何一個企業級的應用服務器,但用到了Facebook自己的定製的應用服務器。看上去好像是重新發明輪子,但是這些Services只被暴露給Thrift使用(絕大所數是這樣),Tomcat太重量級了,即使是Jetty也可能太過了點,其附加值對Facebook所需要的沒有意義。
持久化由MySQL, Memcached [3], Facebook 的 Cassandra [4], Hadoop 的 HBase [5] 完成。Memcached 使用了MySQL的內存Cache。Facebook 工程師承認他們的Cassandra 使用正在減少,因爲他們更喜歡HBase,因爲它的更簡單的一致性模型,以到其MapReduce能力。
離線處理使用Hadoop 和 Hive。
日誌,點擊,feeds數據使用Scribe [6],把其聚合並存在 HDFS,其使用Scribe-HDFS [7],因而允許使用MapReduce進行擴展分析。
BigPipe [8] 是他們的定製技術,用來加速頁面顯示。
Varnish Cache [9]用作HTTP代理。他們用這個的原因是高速和有效率。 [10].
用來搞定用戶上傳的十億張照片的存儲,其由Haystack處理,Facebook自己開發了一個Ad-Hoc存儲方案,其主要做了一些低層優化和“僅追加”寫技術 [11].
Facebook Messages 使用了自己的架構,其明顯地構建在了一個動態集羣的基礎架構上。業務邏輯和持久化被封裝在一個所謂的’Cell’。每個‘Cell’都處理一部分用戶,新的‘Cell’可以因爲訪問熱度被添加[12]。持久化歸檔使用HBase [13]。
Facebook Messages 的搜索引擎由存儲在HBase中的一個倒置索引的構建。 [14]
Facebook 搜索引擎實現細節據我所知目前是未知狀態。
Typeahead 搜索使用了一個定製的存儲和檢索邏輯。 [15]
Chat 基於一個Epoll 服務器,這個服務器由Erlang 開發,由Thrift存取 [16]
  關於那些供給給上述組件的資源,下面是一些信息和數量,但是有一些是未知的:

Facebook估計有超過60,000 臺服務器[16]。他們最新的數據中心在俄勒岡州的Prineville,其基於完全自定設計的硬件[17] 那是最近才公開的 Open Compute 項目[18]。
300 TB 的數據存在 Memcached 中處理 [19]
他們的Hadoop 和 Hive 集羣由3000 服務器組成,每臺服務器有8個核,32GB的內存,12TB的硬盤,全部有2萬4千個CPU的核,96TB內存和36PB的硬盤。 [20]
每天有1000億的點擊量,500億張照片,100 billion hits per day, 50 billion photos, 3 萬億個對象被 Cache,每天130TB的日誌(2010年7月的數據) [21]

北京時間4月8日消息,據國外媒體報道,北京時間今天凌晨在其總部舉行發佈會,公開了底層服務器和數據中心的具體方案。

  Facebook此次公開了服務器電源供應、服務器機箱、服務器主板、服務器機櫃、後備電源機櫃規格。另外,它還公開了數據中心電力及機械系統規格的具體規格。通過公開這些情況,Facebook展示了它在爲不同任務配置合適的計算工作量時,是如何儘可能降低能耗和成本的。

  Facebook的方案有一些創新之處,比如風扇更大但數量較少。這些風扇佔每臺服務器能源消耗的2-4%,遠遠低於行業中10-20%的平均水平。以下是方案中的具體細節:

服務器方面:

  1、服務器使用1.2mm鍍鋅、防腐蝕鋼板,無前面板;

  2、部分部件採用卡和連接:主板利用多個安裝孔,卡入機箱;硬盤使用咬合導軌,安裝在驅動器托架上。一個單元只有一個接地螺絲。這使得Facebook可以在3分鐘內搭建整臺服務器;

  3、Facebook服務器高1.5U,比一般服務器高50%,空間更大,散熱也更快;

  4、具有局域網重啓功能,可以讓系統管理員發送特定網絡指令,立即重啓服務器;

  5、主板揚聲器被替換爲LED指示燈,以節省電源,服務器還提健康狀態指示燈;

  6、同時支持交流和直流電源,使得服務器可以在停電時轉爲直流後備電池供電;

  7、使用Xeon 5500系列和5600系列兩種處理器,搭載英特爾主板,內置英特爾5500 I/O Hub芯片,內存最大可擴展至144GB。AMD的粉絲可以選擇兩個Magny-Cours 12核心或8核心處理器,搭配AMD SR5650芯片組,內存最高可擴展至192GB。

數據中心方面:

  Facebook不僅公開了服務器方案,同時它還公開了數據中心的設計方案,以便能幫助其他初創公司建立自己的基礎架構,並儘可能的減少功率消耗。

  Facebook將這些方案都運用到了位於俄勒岡州的普林維爾(Prineville)數據中心上。用了兩年的時間,從服務器到電池組再到後備服務器,Facebook致力於讓設備變得更加綠色、環保。比如,Facebook利用集成設計,可以有效的降低能耗。房間內的風扇和服務器風扇成對連接在一起。動作感應LED照明也可用於內部照明。

  整個數據中心的能耗按PUE(Power Usage Effectiveness,電能使用效率)衡量是1.07,大大低於美國環保署規定的最優方法比值1.5。

  Facebook的設計方案可以讓設備在更爲潮溼的環境中運行。普林維爾數據中心的設備運行環境爲30攝氏度、65%的相對溼度。這樣可以使Facebook依賴蒸發冷卻來降溫,而不需使用空調。其他建設工程方面的創新還包括,普林維爾數據中心使用277伏特的配電系統,而一般數據中心使用的是208伏特的配電系統。Facebook的做法可以減少一個主變壓器,減少轉換時的能耗。在一般的數據中心中,電力轉換要損失22-25%的能量。在普林維爾只損失7%。

  當辦公室太冷的時候,Facebook還利用來自服務器的熱量加熱空氣。夏天,數據中心會向進入室內的暖空氣噴水降溫。同時Facebook數據中心的機箱和服務器設計也非常適合於集裝箱裝運,這樣可以減少運輸中的浪費。Facebook的方案儘可能挖掘這些服務器的潛能,使得它不需要在進行基礎架構的建設。

  雖然並不是每家初創公司都要打造這種規模的數據中心,但Facebook公佈的方案肯定會在數據中心運營商和提供商中引起話題爭論。


轉自:https://www.zhihu.com/question/29774509

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