大型分佈式網站所必須知曉的概念


一. I/O優化


  1. 增長緩存,減小磁盤的訪問次數。css


  2. 優化磁盤的管理系統,設計最優的磁盤方式策略,以及磁盤的尋址策略,這是在底層操做系統層面考慮的。html


  3. 設計合理的磁盤存儲數據塊,以及訪問這些數據庫的策略,這是在應用層面考慮的。例如,咱們能夠給存放的數據設計索引,經過尋址索引來加快和減小磁盤的訪問量,還能夠採用異步和非阻塞的方式加快磁盤的訪問速度。前端


  4. 應用合理的RAID策略提高磁盤I/O。java


二. Web前端調優


  1. 減小網絡交互的次數(屢次請求合併)web

  2. 減小網絡傳輸數據量的大小(壓縮)算法

  3. 儘可能減小編碼(儘可能提早將字符轉化爲字節,或者減小從字符到字節的轉化過程。)數據庫

  4. 使用瀏覽器緩存後端

  5. 減小Cookie傳輸瀏覽器

  6. 合理佈局頁面緩存

  7. 使用頁面壓縮

  8. 延遲加載頁面

  9. CSS在最上面,JS在最下面

  10. CDN

  11. 反向代理

  12. 頁面靜態化

  13. 異地部署


三.服務降級(自動優雅降級)


拒絕服務和關閉服務


四.冪等性設計


有些服務自然具備冪等性,好比講用戶性別設置爲男性,無論設置多少次,結果都同樣。可是對轉帳交易等操做,問題就會比較複雜,須要經過交易編號等信息進行服務調用有效性校驗,只有有效的操做才能繼續執行。


(注:冪等性是系統的接口對外一種承諾(而不是實現), 承諾只要調用接口成功, 外部屢次調用對系統的影響是一致的. 聲明爲冪等的接口會認爲外部調用失敗是常態, 而且失敗以後必然會有重試.)


五.失效轉移


若數據服務器集羣中任何一臺服務器宕機,那麼應用程序針對這臺服務器的全部讀寫操做都須要從新路由到其餘服務器,保證數據訪問不會失敗,這個過程叫失效轉移。


失效轉移包括:失效確認(心跳檢測和應用程序訪問失敗報告)、訪問轉移、數據恢復。


失效轉移保證當一個數據副本不可訪問時,能夠快速切換訪問數據的其餘副本,保證系統可用。


六.性能優化


根據網站分層架構,性能優化可分爲:web前端性能優化、應用服務器性能優化、存儲服務器性能優化。


1. web前端性能優化


  • 瀏覽器訪問優化:減小http請求;使用瀏覽器緩存;啓用壓縮;css放在頁面最上面、javaScript放在頁面最下面;減小Cookie傳輸

  • CDN加速

  • 反向代理


2. 應用服務器性能優化


  • 分佈式緩存(Redis等)

  • 異步操做(消息隊列)

  • 使用集羣(負載均衡)

  • 代碼優化


3. 存儲性能優化


  • 機械硬盤vs固態硬盤

  • B+樹 vs LSM樹

  • RAID vs HDFS


七. 代碼優化


  • 多線程(Q:怎麼確保線程安全?無鎖機制有哪些?)

  • 資源複用(單例模式,鏈接池,線程池)

  • 數據結構

  • 垃圾回收


八. 負載均衡


HTTP重定向負載均衡


當用戶發來請求的時候,Web服務器經過修改HTTP響應頭中的Location標記來返回一個新的url,而後瀏覽器再繼續請求這個新url,實際上就是頁面重定向。經過重定向,來達到「負載均衡」的目標。例如,咱們在下載PHP源碼包的時候,點擊下載連接時,爲了解決不一樣國家和地域下載速度的問題,它會返回一個離咱們近的下載地址。重定向的HTTP返回碼是302。


優勢:比較簡單。


缺點:瀏覽器須要兩次請求服務器才能完成一次訪問,性能較差。重定向服務自身的處理能力有可能成爲瓶頸,整個集羣的伸縮性國模有限;使用HTTP302響應碼重定向,有可能使搜索引擎判斷爲SEO做弊,下降搜索排名。


DNS域名解析負載均衡


DNS(Domain Name System)負責域名解析的服務,域名url其實是服務器的別名,實際映射是一個IP地址,解析過程,就是DNS完成域名到IP的映射。而一個域名是能夠配置成對應多個IP的。所以,DNS也就能夠做爲負載均衡服務。


事實上,大型網站老是部分使用DNS域名解析,利用域名解析做爲第一級負載均衡手段,即域名解析獲得的一組服務器並非實際提供Web服務的物理服務器,而是一樣提供負載均衡服務的內部服務器,這組內部負載均衡服務器再進行負載均衡,將請求分發到真是的Web服務器上。


優勢:將負載均衡的工做轉交給DNS,省掉了網站管理維護負載均衡服務器的麻煩,同時許多DNS還支持基於地理位置的域名解析,即會將域名解析成舉例用戶地理最近的一個服務器地址,這樣能夠加快用戶訪問速度,改善性能。


缺點:不能自由定義規則,並且變動被映射的IP或者機器故障時很麻煩,還存在DNS生效延遲的問題。並且DNS負載均衡的控制權在域名服務商那裏,網站沒法對其作更多改善和更強大的管理。


反向代理負載均衡


反向代理服務能夠緩存資源以改善網站性能。實際上,在部署位置上,反向代理服務器處於Web服務器前面(這樣纔可能緩存Web相應,加速訪問),這個位置也正好是負載均衡服務器的位置,因此大多數反向代理服務器同時提供負載均衡的功能,管理一組Web服務器,將請求根據負載均衡算法轉發到不一樣的Web服務器上。Web服務器處理完成的響應也須要經過反向代理服務器返回給用戶。因爲web服務器不直接對外提供訪問,所以Web服務器不須要使用外部ip地址,而反向代理服務器則須要配置雙網卡和內部外部兩套IP地址。


優勢:和反向代理服務器功能集成在一塊兒,部署簡單。


缺點:反向代理服務器是全部請求和響應的中轉站,其性能可能會成爲瓶頸。


  • LVS-NAT:修改IP地址


  • LVS-TUN: 一個IP報文封裝在另外一個IP報文的技術。


  • LVS-DR:將數據幀的MAC地址改成選出服務器的MAC地址,再將修改後的數據幀在與服務器組的局域網上發送。


九.緩存


緩存就是將數據存放在距離計算最近的位置以加快處理速度。緩存是改善軟件性能的第一手段,如今CPU愈來愈快的一個重要因素就是使用了更多的緩存,在複雜的軟件設計中,緩存幾乎無處不在。大型網站架構設計在不少方面都使用了緩存設計。


  • CDN: 及內容分發網絡,部署在距離終端用戶最近的網絡服務商,用戶的網絡請求老是先到達他的網絡服務商哪裏,在這裏緩存網站的一些靜態資源(較少變化的數據),能夠就近以最快速度返回給用戶,如視頻網站和門戶網站會將用戶訪問量大的熱點內容緩存在CDN中。


  • 反向代理:反向代理屬於網站前端架構的一部分,部署在網站的前端,當用戶請求到達網站的數據中心時,最早訪問到的就是反向代理服務器,這裏緩存網站的靜態資源,無需將請求繼續轉發給應用服務器就能返回給用戶。


  • 本地緩存:在應用服務器本地緩存着熱點數據,應用程序能夠在本機內存中直接訪問數據,而無需訪問數據庫。


  • 分佈式緩存:大型網站的數據量很是龐大,即便只緩存一小部分,須要的內存空間也不是單機能承受的,因此除了本地緩存,還須要分佈式緩存,將數據緩存在一個專門的分佈式緩存集羣中,應用程序經過網絡通訊訪問緩存數據。


使用緩存有兩個前提條件,一是數據訪問熱點不均衡,某些數據會被更頻繁的訪問,這些數據應該放在緩存中;二是數據在某個時間段內有效,不會很快過時,不然緩存的數據就會因已經失效而產生髒讀,影響結果的正確性。網站應用中,緩存處理能夠加快數據訪問速度,還能夠減輕後端應用和數據存儲的負載壓力,這一點對網站數據庫架構相當重要,網站數據庫幾乎都是按照有緩存的前提進行負載能力設計的。


十. 負載均衡算法


  • 輪詢 Round Robin

  • 增強輪詢 Weight Round Robin

  • 隨機 Random

  • 增強隨機 Weight Random

  • 最少鏈接 Least Connections

  • 增強最少鏈接

  • 源地址散列 Hash


其餘算法


  • 最快算法(Fastest):傳遞鏈接給那些響應最快的服務器。當其中某個服務器發生第二到第7 層的故障,BIG-IP 就把其從服務器隊列中拿出,不參加下一次的用戶請求的分配,直到其恢復正常。


  • 觀察算法(Observed):鏈接數目和響應時間以這兩項的最佳平衡爲依據爲新的請求選擇服務器。當其中某個服務器發生第二到第7 層的故障,BIG-IP就把其從服務器隊列中拿出,不參加下一次的用戶請求的分配,直到其恢復正常。


  • 預測算法(Predictive):BIG-IP利用收集到的服務器當前的性能指標,進行預測分析,選擇一臺服務器在下一個時間片內,其性能將達到最佳的服務器相應用戶的請求。(被BIG-IP 進行檢測)


  • 動態性能分配算法(Dynamic Ratio-APM):BIG-IP 收集到的應用程序和應用服務器的各項性能參數,動態調整流量分配。


  • 動態服務器補充算法(Dynamic Server Act.):當主服務器羣中因故障致使數量減小時,動態地將備份服務器補充至主服務器羣。


  • 服務質量算法(QoS):按不一樣的優先級對數據流進行分配。


  • 服務類型算法(ToS): 按不一樣的服務類型(在Type of Field中標識)負載均衡對數據流進行分配。


  • 規則模式算法:針對不一樣的數據流設置導向規則,用戶可自行


十一. 擴展性和伸縮性的區別


擴展性:指對現有系統影響最小的狀況下,系統功能可持續擴展或替身的能力。表如今系統基礎設施穩定不須要常常變動,應用之間較少依賴和耦合,對需求變動能夠敏捷響應。它是系統架構設計層面的開閉原則(對擴展開放,對修改關閉),架構設計考慮將來功能擴展,當系統增長新功能時,不須要對現有系統的結構和代碼進行修改。


衡量網站架構擴展性好壞的主要標準就是在網站增長新的業務產品時,是否能夠實現對現有產品透明無影響,不須要任何改動或者不多改動既有業務功能就能夠上線新產品。不一樣產品之間是否不多耦合,一個產品改動對其餘產品無影響,其餘產品和功能不須要受牽連進行改動。


伸縮性:所謂網站的伸縮性指是不須要改變網站的軟硬件設計,僅僅經過改變部署的服務器數量就能夠擴大或者縮小網站的服務處理能力。


指系統可以增長(減小)自身資源規模的方式加強(減小)本身計算處理事務的能力。若是這種增減是成比例的,就被稱做線性伸縮性。在網站架構中,一般指利用集羣的方式增長服務器數量、提升系統的總體事務吞吐能力。


衡量架構伸縮性的主要標準就是能夠用多臺服務器構建集羣,是否容易向集羣中添加新的服務器。加入新的服務器後是否能夠提供和原來服務無差異的服務、集羣中的可容納的總的服務器數量是否有限制。


十二.分佈式緩存的一致性hash


具體算法過程:先構造一個長度爲2^32的整數環(這個環被稱做一致性Hash環)根據節點名稱的Hash值(其分佈範圍爲[0,2^32 - 1])將緩存服務器階段設置在這個Hash環上。而後根據須要緩存的數據的Key值計算獲得Hash值(其分佈範圍也一樣爲[0,2^32 - 1]),而後在Hash環上順時針查找舉例這個KEY的hash值最近的緩存服務器節點,完成KEY到服務器的Hash映射查找。


優化策略:將每臺物理服務器虛擬爲一組虛擬緩存服務器,將虛擬服務器的Hash值放置在Hash環上,key在換上先找到虛擬服務器節點,再獲得物理服務器的信息。


一臺物理服務器設置多少個虛擬服務器節點合適呢?經驗值:150。


十三. 網絡安全


1. XSS攻擊


跨站點腳本攻擊(Cross Site Script),指黑客經過篡改網頁,注入惡意的HTML腳本,在用戶瀏覽網頁時,控制用戶瀏覽器進行惡意操做的一種攻擊方式。


防範手段:消毒(XSS攻擊者通常都是經過在請求中嵌入惡意腳本大道攻擊的目的,這些腳本是通常用戶輸入中不使用的,若是進行過濾和消毒處理,即對某些html危險字符轉移,如「>」轉譯爲「& gt;」);HttpOnly(防止XSS攻擊者竊取Cookie).


2. 注入攻擊:SQL注入和OS注入


SQL防範:預編譯語句PreparedStatement; ORM;避免密碼明文存放;處理好相應的異常。


3. CSRF(Cross Site Request Forgery,跨站點請求僞造)。聽起來與XSS有點類似,事實上二者區別很大,XSS利用的是站內的信任用戶,而CSRF則是經過假裝來自受信任用戶的請求來利用受信任的網站。


防範:httpOnly;增長token;經過Referer識別。



4. 文件上傳漏洞


5. DDos攻擊


十四. 加密技術


  1. 摘要加密:MD5, SHA

  2. 對稱加密:DES算法,RC算法, AES

  3. 非對稱加密:RSA


非對稱加密技術一般用在信息安全傳輸,數字簽名等場合。

HTTPS傳輸中瀏覽器使用的數字證書實質上是通過權威機構認證的非對稱加密的公鑰。


十五. 流控(流量控制)


  1. 流量丟棄


  2. 經過單機內存隊列來進行有限的等待,直接丟棄用戶請求的處理方式顯得簡單而粗暴,而且若是是I/O密集型應用(包括網絡I/O和磁盤I/O),瓶頸通常再也不CPU和內存。所以,適當的等待,既可以替身用戶體驗,又可以提升資源利用率。


  3. 經過分佈式消息隊列來將用戶的請求異步化。


參考資料


1. LVS:三種負載均衡方式比較+另三種負載均衡方式

2. 《大型網站技術架構——核心原理與技術分析》李智慧 著。

3. 億級Web系統搭建:單機到分佈式集羣

4. 《大型分佈式網站架構設計與實現》陳康賢 著。

相關文章
相關標籤/搜索