構建高可擴Web架構和分布式系統實戰

2020-12-11 CSDN技術社區

本文作者Kate Matsudaira是一位美麗的女工程副總裁,曾在Sun Microsystems、微軟、亞馬遜這些一流的IT公司任職。她有著非常豐富的工作經驗和團隊管理經驗,當過程式設計師、項目經理、產品經理以及人事經理。專注於構建和操作大型Web應用程式/網站,目前她的主要研究方向是SaaS(軟體即服務)應用程式和雲計算(如大家所說的大數據)。

本文是作者在AOSA一書介紹如何構建可擴展的分布式系統裡的內容,在此翻譯並分享給大家。

開源軟體已經成為許多大型網站的基本組成部分,隨著這些網站的逐步壯大,他們的網站架構和一些指導原則也開放在開發者們的面前,給予大家切實有用的指導和幫助。

這篇文章主要側重於Web系統,並且也適用於其他分布式系統。

Web分布式系統設計的原則

構建並運營一個可伸縮的Web站點或應用程式到底是指什麼?在最初,僅是通過網際網路連接用戶和訪問遠程資源。

和大多數事情一樣,當構建一個Web服務時,需要提前抽出時間進行規劃。了解大型網站創建背後的注意事項以及學會權衡,會給你帶來更加明智的決策。下面是設計大型Web系統時,需要注意的一些核心原則:

上面的這些原則給設計分布式Web架構提供了一定的基礎和理論指導。然而,它們也可能彼此相左,例如實現這個目標的代價是犧牲成本。一個簡單的例子:選擇地址容量,僅通過添加更多的伺服器(可伸縮性),這個可能以易管理(你不得不操作額外的伺服器)和成本作為代價(伺服器價格)。

無論你想設計哪種類型的Web應用程式,這些原則都是非常重要的,甚至這些原則之間也會互相羈絆,做好它們之間的權衡也非常重要。

基礎

當涉及到系統架構問題時,這幾件事情是必須要考慮清楚的:什麼樣的模塊比較合適?如何把它們組合在一起?如何進行恰當地權衡?在擴大投資之前,它通常需要的並不是一個精明的商業命題,然而,一些深謀遠慮的設計可以幫你在未來節省大量的時間和資源。

本文討論的重點幾乎是構建所有大型Web應用程式的核心:服務、冗餘、分區和故障處理能力。這裡的每個因素都會涉及到選擇和妥協,特別是前面所討論的那些原則。解釋這些核心的最佳辦法就是舉例子。

圖片託管應用程式

有時,你會在線上傳圖片,而一些大型網站需要託管和傳送大量的圖片,這對於構建一個具有成本效益、高可用性並具有低延時(快速檢索)的架構是一項挑戰。

在一個圖片系統中,用戶可以上傳圖片到一個中央伺服器裡,通過網絡連接或API對這些圖片進行請求,就像Flickr或者Picasa。簡單點,我們就假設這個應用程式只包含兩個核心部分:上傳(寫)圖片和檢索圖片。圖片上傳時最好能夠做到高效,傳輸速度也是我們最關心的,當有人向圖片發出請求時(例如是一個Web頁面或其他應用程式)。這是非常相似的功能,提供Web服務或內容分發網絡(一個CDN伺服器可以在許多地方存儲內容,所以無論是在地理上還是物理上都更加接近用戶,從而導致更快的性能)邊緣伺服器。

該系統需要考慮的其他重要方面:

  • 圖片存儲的數量是沒有限制的,所以存儲應具備可伸縮,另外圖片計算也需要考慮
  • 下載/請求需要做到低延遲
  • 用戶上傳一張圖片,那麼圖片就應該始終在那裡(圖片數據的可靠性)
  • 系統應該易於維護(易管理)
  • 由於圖片託管不會有太高的利潤空間,所以系統需要具備成本效益

圖1是個簡化的功能圖

圖1 圖片託管系統的簡化結構圖

在這個例子中,系統必須具備快速、數據存儲必須做到可靠和高度可擴展。構建一個小型的應用程式就微不足道了,一臺伺服器即可實現託管。如果這樣,這篇文章就毫無興趣和吸引力了。假設我們要做的應用程式會逐漸成長成Flickr那麼大。

服務

當我們考慮構建可伸縮的系統時,它應有助於解耦功能,系統的每個部分都可以作為自己的服務並且擁有清晰的接口定義。在實踐中,這種系統設計被稱作面向服務的體系結構(SOA)。對於此類系統,每個服務都有它自己的獨特功能,通過一個抽象接口可以與外面的任何內容進行互動,通常是面向公眾的另一個服務API。

把系統分解成一組互補性的服務,在互相解耦這些操作塊。這種抽象有助於在服務、基本環境和消費者服務之間建立非常清晰的關係。這種分解可以有效地隔離問題,每個塊也可以互相伸縮。這種面向服務的系統設計與面向對象設計非常相似。

在我們的例子中,所有上傳和檢索請求都在同一臺伺服器上處理。然而,因為系統需要具備可伸縮性,所以把這兩個功能打破併集成到自己的服務中是有意義的。

快進並假設服務正在大量使用;在這種情況下,很容易看到寫圖片的時間對讀圖片時間會產生多大影響(他們兩個功能在彼此競爭共享資源)。根據各自體系,這種影響會是巨大的。即使上傳和下載速度相同(這是不可能的,對於大多數的IP網絡來說,下載速度:上傳速度至少是3:1),通常,文件可以從緩存中讀取,而寫入,最終是寫到磁碟中(也許在最終一致的情況下,可以被多寫幾次)。即使是從緩存或者磁碟(類似SSD)中讀取,數據寫入都會比讀慢(Pole Position,一個開源DB基準的開源工具和結果)。

這種設計的另一個潛在問題是像Apache或者Lighttpd這些Web伺服器通常都會有一個並發連接數上限(默認是500,但也可以更多),這可能會花費高流量,寫可能會迅速消掉所有。既然讀可以異步或利用其他性能優化,比如gzip壓縮或分塊傳輸代碼,Web服務可以快速切換讀取和客戶端來服務於更多的請求,超過每秒的最大連接數(Apache的最大連接數設置為500,這種情況並不常見,每秒可以服務幾千個讀取請求)。另一方面,寫通常傾向於保持一個開放的連結進行持續上傳,所以,使用家庭網絡上傳一個1 MB的文件花費的時間可能會超過1秒,所以,這樣的伺服器只能同時滿足500個寫請求。

圖2:讀取分離

規劃這種瓶頸的一個非常好的做法是把讀和寫進行分離,如圖2所示。這樣我們就可以對它們單獨進行擴展(一直以來讀都比寫多)但也有助於弄明白每個點的意思。這種分離更易於排除故障和解決規模方面問題,如慢讀。

這種方法的優點就是我們能夠彼此獨立解決問題——在同種情況下,無需寫入和檢索操作。這兩種服務仍然利用全球語料庫的圖像,但是他們可以自由地優化性能和服務方法(例如排隊請求或者緩存流行圖片——下面會介紹更多)。從維護和成本角度來看,每一個服務都可以根據需要獨立進行擴展,但如果把它們進行合併或交織在一起,那麼有可能無意中就會對另一個性能產生影響,如上面討論的情景。

當然,如果你有兩個不同的端點,上面的例子可能會運行的很好(事實上,這非常類似於幾個雲存儲供應商之間的實現和內容分發網絡)。雖然有很多種方法可以解決這些瓶頸,但每個人都會有不同的權衡,所以採用適合你的方法才是最重要的。

例如,Flickr解決這個讀/寫問題是通過分發用戶跨越不同的碎片,每個碎片只能處理一組用戶,但是隨著用戶數的增加,更多的碎片也會相應的添加到群集裡(請參閱Flickr的擴展介紹)。在第一個例子中,它更容易基於硬體的實際用量進行擴展(在整個系統中的讀/寫數量),而Flickr是基於其用戶群進行擴展(but forces the assumption of equal usage across users so there can be extra capacity)。而前面的那個例子,任何一個中斷或者問題都會降低整個系統功能(例如任何人都沒辦法執行寫操作),而Flickr的一個中斷只會影響到其所在碎片的用戶數。在第一個例子中,它更容易通過整個數據集進行操作——例如,更新寫服務,包括新的元數據或者通過所有的圖片元數據進行搜索——而Flickr架構的每個碎片都需要被更新或搜索(或者需要創建一個搜索服務來收集元數據——事實上,他們就是這樣做的)。

當談到這些系統時,其實並沒有非常正確的答案,但有助於我們回到文章開始處的原則上看問題。確定系統需求(大量的讀或寫或者兩個都進行、級別並發、跨數據查詢、範圍、種類等等),選擇不同的基準、理解系統是如何出錯的並且對以後的故障發生情況做些紮實的計劃。

冗餘

為了可以正確處理錯誤,一個Web架構的服務和數據必須具備適當的冗餘。例如,如果只有一個副本文件存儲在這臺單獨的伺服器上,那麼如果這臺伺服器出現問題或丟失,那麼該文件也隨即一起丟失。丟失數據並不是什麼好事情,避免數據丟失的常用方法就是多創建幾個文件或副本或冗餘。

同樣也適用於伺服器。如果一個應用程式有個核心功能,應確保有多個副本或版本在同時運行,這樣可以避免單節點失敗。

在系統中創建冗餘,當系統發生危機時,如果需要,可以消除單點故障並提供備份或備用功能。例如,這裡有兩個相同的服務示例在生產環境中運行,如果其中一個發生故障或者降低,那麼該系統容錯轉移至那個健康的副本上。容錯轉移可以自動發生也可以手動幹預。

服務冗餘的另一重要組成部分是創建一個無共享架構。在這種體系結構中,每個節點都能相互獨立運行,並且沒有所謂的中央「大腦」管理狀態或協調活動其他節點。這對系統的可擴展幫助很大,因為新節點在沒有特殊要求或知識的前提下被添加。然而,最重要的是,這些系統是沒有單點故障的,所以失敗的彈性就更大。

例如在我們的圖片伺服器應用程式中,所有的圖片在另一個硬體上都有冗餘副本(理想情況下是在不同的地理位置,避免在數據中心發生一些火災、地震等自然事故),服務去訪問圖片將被冗餘,所有潛在的服務請求。(參見圖3:採用負載均衡是實現這點的最好方法,在下面還會介紹更多方法)

圖3 圖片託管應用程式冗餘

分區

數據集有可能非常大,無法安裝在一臺伺服器上。也有可能這樣,某操作需要太多的計算資源、性能降低並且有必要增加容量。在這兩種情況下,你有兩種選擇:縱向擴展或橫向擴展。

縱向擴展意味著在單個伺服器上添加更多的資源。所以,對於一個非常大的數據集來說,這可能意味著添加更多(或更大)的硬體設備,來使一臺伺服器能容下整個數據集。在計算操作下,這可能意味著移動計算到一個更大的伺服器上,擁有更快的CPU或更大的內存。在各種情況下,縱向擴展可以通過提升單個資源的處理能力來完成。

橫向擴展在另一方面是添加更多的節點,在大數據集下,這可能會使用第二伺服器來存儲部分數據集,對於計算資源來說,這意味著分割操作或跨節點加載。為了充分利用橫向擴展,它應作為一種內在的系統架構設計原則,否則修改或拆分操作將會非常麻煩。

當談到橫向擴展時,最常見的做法是把服務進行分區或碎片。分區可以被派發,這樣每個邏輯組的功能就是獨立的。可以通過地理界限或其他標準,如非付費與付費用戶來完成分區。這些方案的優點是他們會隨著容量的增加提供一個服務或數據存儲。

在我們的圖片伺服器案例中,用來存儲圖片的單個文件伺服器可能被多個文件伺服器取代,每個裡面都會包含一套自己獨特的圖像。(見圖4)這種架構將允許系統來填充每一個文件/圖片伺服器,當磁碟填滿時會添加額外的伺服器。這樣的設計需要一個命名方案,用來捆綁圖片文件名到其相應的伺服器上。圖像名字可以形成一個一致的哈希方案並映射到整個伺服器上;或者給每張圖片分配一個增量ID,當客戶端對圖片發出請求時,圖片檢索服務只需要檢索映射到每個伺服器上(例如索引)的ID。

圖4 圖片託管應用程式冗餘和分區

當然,跨越多個伺服器對數據或功能進行分區還是有許多挑戰的。其中的關鍵問題是數據本地化。在分布式系統中,數據操作或計算點越接近,系統性能就會越好。因此,它也可能是個潛在問題,當數據分散在多個伺服器上時。有時數據不是在本地,那麼就要迫使伺服器通過網絡來獲取所需的信息,這個獲取的過程就會設計到成本。

另一潛在問題是不一致。當這裡有多個服務對一個共享資源執行讀寫操作時,潛在可能會有另一個伺服器或數據存儲參與進來,作為競選條件——一些數據需要更新,但是讀的優先級高於更新——在這種情況下,數據就是不一致的。例如在圖片託管方案中,有可能出現的不一致是:如果一個客戶端發送更新「狗」圖片請求,進行重新命名,把「Dog」改成「Gizmo」,但同時,另一個客戶端正在讀這張圖片。在這種情況下,標題就是不清楚的。「Dog」或「Gizmo」應該被第二個客戶端接收。

當然,在進行數據分區時會產生一些障礙,但是分區允許把每個問題拆分到管理群裡——通過數據、負載、使用模式等。這樣對可擴展和易管理都是有幫助的,但也不是沒有風險的。這裡有很多方式來降低風險和故障處理;然而,為了簡便起見,並未在本文中詳細說明,如果你有興趣,可以訪問我的博客。

總結

以上介紹的都是設計分布式系統需要考慮的核心要素。可用性、性能、可靠性、可擴展、易管理、成本這幾個原則非常重要,但在實際應用中可能會以犧牲某個原則來實現另外一個原則,在這個過程中就要做好權衡工作,做到因時制宜。

在下面的構建分布式系統實戰中,我們將會深入介紹如何設計可擴展的數據訪問,包括負載均衡、代理、全局緩存、分布式緩存等。

相關閱讀:

構建高可擴Web架構和分布式系統實戰(下)

來自:Dr.Dobb's

相關焦點

  • 光大銀行分布式實戰:國內最大繳費平臺的資料庫架構轉型
    從事資料庫運維管理工作十餘年,在資料庫的性能優化,升級遷移,高可用容災等方面具有豐富經驗。 我今天分享的主題是《高並發場景下,光大銀行分布式資料庫的架構轉型實戰》。 光大銀行也是很有魄力的,拿出了一個重要的業務系統進行一次試點,做了一次這種分布式架構轉型的項目。
  • 閱讀架構和權限方面的書籍,更好的輔助設計產品
    主要從大型網站架構的特點,架構目標(高性能,高可用,可伸縮等)基本理論講起,並介紹了幾個很有特色的案例。之前群內分享的大型網站架構系列的基礎理論大部分出自此書。 第二本:《大型網站系統與Java中間件實踐》同樣出自阿里的技術牛人。此書對分布式系統的演進做了較好的介紹。
  • 從Elasticsearch來看分布式系統架構設計
    【IT168 技術】分布式系統類型多,涉及面非常廣,不同類型的系統有不同的特點,批量計算和實時計算就差別非常大。這篇文章中,重點會討論下分布式數據系統的設計,比如分布式存儲系統,分布式搜索系統,分布式分析系統等。  我們先來簡單看下Elasticsearch的架構。
  • Android系統架構圖及簡單的系統架構介紹
    Android的系統架構和其作業系統一樣,採用了分層的架構。從架構圖看,android分為四個層,從高層到低層分別是應用程式層、應用程式框架層、系統運行庫層和linux核心層。  1.應用程式 Android會同一系列核心應用程式包一起發布,該應用程式包包括email客戶端,SMS短消息程序,日曆,地圖,瀏覽器,聯繫人管理程序等。所有的應用程式都是使用JAVA語言編寫的。
  • 公司全網率先完成營銷業務系統雙活架構改造
    營銷系統雙活架構改造 隨著營銷系統的深化應用和業務的不斷擴展,用電客戶數量由上線初期的300萬增長到目前的980萬左右,承載著全疆居民繳費、業擴報裝等核心業務。
  • web開發實戰教程:Apache Shiro在web項目的應用
    web開發實戰教程今天準備分享一下Apache Shiro 在web開發中的應用。shiro安全框架是目前為止作為登錄註冊最常用的框架,因為它十分的強大簡單,提供了認證、授權、加密和會話管理等功能 。Cryptography(加密):通過使用加密算法保持數據安全shiro的三個核心組件:Subject :正與系統進行交互的人,或某一個第三方服務。所有 Subject 實例都被綁定到(且這是必須的)一個SecurityManager 上。
  • 哪種Scale out架構能更有效滿足分布式計算?
    「邏輯分布,物理集中」的部署方式從軟體部署層面來看,是完全的Scale out 架構,再從硬體部署層面看,它又具有集中部署的優勢,可以說是結合了分布式和集中式部署的優勢,同時又摒棄了兩者的缺陷,具有如下優點:1、高可靠,高容錯性。
  • 青雲QingCloud面向核心業務的全閃分布式存儲架構設計與實踐
    在全快閃記憶體和高速 RDMA 網絡的加持下,分布式全閃架構已經成為企業核心業務的理想之選。NeonSAN 核心模塊由數據層和控制層組成,此外包括前端接口與運維管理工具層。NeonSAN 核心模塊採用並行流水線技術,設計了全快閃記憶體儲系統的資源調度系統、內存管理系統、元數據管理系統、RDMA 網絡收發系統等,打造高可用、高可靠、高性能、擴展靈活的全閃分布式存儲。
  • 基於Java的大型分布式網絡爬蟲體系結構
    2、基於廣域網分布式網絡爬蟲:當並行爬行器的爬蟲分別運行在不同地理位置(或網絡位置),我們稱這種並行爬行器為分布式爬行器。例如,分布式爬行器的爬蟲可能位於中國,日本,和美國,分別負責下載這三地的網頁;或者位於CHINANET,CERNET,CEINET,分別負責下載這三個網絡的中的網頁。分布式爬行器的優勢在於可以子在一定程度上分散網絡流量,減小網絡出口的負載。
  • IPFS的分布式Web新協議∣實現分布式雲存儲
    HTTP和IPFS 的關係就好比「中心化存儲」與「分布式存儲」一樣,HTTP依賴中心化伺服器,容易遭受攻擊,訪問量暴增伺服器容易宕機,下載速度慢,存儲成本高;而IPFS是分布式節點,更加安全不易被DDoS攻擊,不依賴主幹網,降低存儲成本且存儲空間大,下載速度快還能查找文件歷史版本記錄,並且理論上能永久儲存。
  • 直擊臺北Modern Web 2016:搜狗「雙擎」齊發洪荒之力
    作為技術領域的頂級盛宴,Modern Web匯聚了Google、Paypal、Nginx等科技企業技術大牛,以及中國大陸與臺灣的業界精英共同探討Web發展動態及應用場景,分享網站開發、運維等實戰經驗。搜狗營銷事業部架構師董澤光、搜狗營銷事業部技術經理梁宵受邀出席並分別發表精彩演講,向海內外同行展示了搜狗兩項炫目「神技」——分布式追蹤系統「馭風」和移動開發「銀彈」React Native,廣受業內讚許。
  • Scale Out將是未來的企業架構
    各大搜尋引擎普遍採用普通x86伺服器+Linux組成的scale out架構,其它主流web服務也大多採用這種架構,例如Yahoo、Taobao、新浪等,而一些ERP廠商入用友近兩年來也開始大量放棄價格昂貴的RISC架構。從數據存儲的角度來看,曾經當我們需要構架一個不斷增長的大型數據中心時,Scale up存儲系統幾乎是最好的,唯一的的選擇。
  • 你知道嗎 機房動環系統架構
    機房動環系統架構是為了優化機房自身業務而作重新的構架;目前我們斯必得在機房中運用最多得架構是分為動力監控、能耗監控、環境監控、安防監控、消防監控、視頻監控等幾大主流系統。
  • 分布式微服務架構成確定性趨勢 撬動銀行新一輪IT改造
    新一輪升級改造重點在銀行業務的底層系統架構,因為分布式架構可解決集中式的諸多痛點,優勢凸顯,銀行或將核心系統全面升級為分布式。  首先,分布式架構普遍採用x86平臺,基於開源軟體技術框架,使技術支撐成本最小化,計算資源和成本可控。因傳統架構最大特點是專有、封閉,核心技術壟斷在少數廠商手中,使得銀行IT建設和使用成本高居不下,大型銀行僅每年的維護費用動輒以億元美金計算。
  • 雙態IT研討會-分布式核心和雙活數據中心建設實踐專場演講實錄
    雙態IT研討會-分布式核心和雙活數據中心建設實踐專場定向邀請25位金融、央企和地方國資企業、政府部門技術部門管理者、網絡運維負責人、CTO和基礎架構負責人,共同探討交流金融雙活數據中心建設和運行的實踐,以及可能的技術路線。
  • 並行和分布式系統國際會議ICPADS 2019今日在天津召開!
    重磅乾貨,第一時間送達 會議之眼B類,CCF C類,國際並行和分布式系統會議ICPADS(International Conference on Parrallel and Distributed Systems)旨在介紹並行和分布式計算中的網絡、系統、算法、框架和體系結構的前言思想和最新成果
  • 華為金融開放創新聯盟與國泰君安合作打造新一代分布式核心業務系統
    當前,有相當數量的證券公司核心系統採用小型機或者基於傳統資料庫的集中式架構,很難滿足證券核心業務對系統可靠性和交易性能的極致追求;同時在系統的橫向擴展性方面存在不足,不能滿足證券業務網際網路化和機構業務蓬勃發展雙重背景下交易峰值的需求。華為公司、華銳和國泰君安致力於實現證券行業核心業務的低時延分布式架構轉型,聯合打造相關解決方案。
  • 網際網路系統架構的演進
    分庫分表作為DB架構中重要的一環,使DB更加穩健,但它給業務代碼帶來了額外的複雜性,最好通過中間件來屏蔽DB的底層分布,對業務透明。作為高性能網站必不可少的組件,Cache在各種主流架構中也起著重要的作用。從部署模式上看,它可分為本地Cache和分布式Cache。
  • 618實戰課:無線信號覆蓋不用愁,Mesh分布式路由器推薦
    傳統擴展中,中繼和橋接模式高度依賴和主路由之間的信號質量,中繼雖然SSID統一但是設備無法智能切換至最佳信號源,橋接的話SSID全屋還不統一十分麻煩;有線擴展出去的AP方式高度依賴裝修時網線鋪設,如果基礎條件不允許也無法實現。此時一種全新的分布式路由器出現了,統稱為Mesh分布式路由。