Web分布式系統(tǒng)設(shè)計(jì)的原則。開源軟件已經(jīng)成為許多大型網(wǎng)站的基本組成部分,隨著這些網(wǎng)站的逐步壯大,他們的網(wǎng)站架構(gòu)和一些指導(dǎo)原則也出現(xiàn)在開發(fā)者們的面前,給予切實(shí)有用的指導(dǎo)和幫助。本文旨在介紹一些核心問題以及通過構(gòu)建模塊來制作大型網(wǎng)站,實(shí)現(xiàn)終目標(biāo)。
構(gòu)建并運(yùn)營(yíng)一個(gè)可伸縮的Web站點(diǎn)或應(yīng)用程序到底指的是什么?在初,僅是通過互聯(lián)網(wǎng)連接用戶和訪問遠(yuǎn)程資源。
和大多數(shù)事情一樣,當(dāng)構(gòu)建一個(gè)Web服務(wù)時(shí),需要提前抽出時(shí)間進(jìn)行規(guī)劃。了解大型網(wǎng)站創(chuàng)建背后的注意事項(xiàng)以及權(quán)衡可能會(huì)給你帶來更加明智的決策,當(dāng)你在創(chuàng)建小網(wǎng)站時(shí)。下面是設(shè)計(jì)大型Web系統(tǒng)時(shí),需要注意的一些核心原則:
1.可用性
2.性能
3.可靠性
4.可擴(kuò)展
5.易管理
6.成本
上面的這些原則給設(shè)計(jì)分布式Web架構(gòu)提供了一定的基礎(chǔ)和理論指導(dǎo)。然而,它們也可能彼此相左,例如實(shí)現(xiàn)這個(gè)目標(biāo)的代價(jià)是犧牲成本。一個(gè)簡(jiǎn)單的例子:選擇地址容量,僅通過添加更多的服務(wù)器(可伸縮性),這個(gè)可能以易管理(你不得不操作額外的服務(wù)器)和成本作為代價(jià)(服務(wù)器價(jià)格)。
無論你想設(shè)計(jì)哪種類型的Web應(yīng)用程序,這些原則都是非常重要的,甚至這些原則之間也會(huì)互相羈絆,做好它們之間的權(quán)衡也非常重要。
一、基礎(chǔ)
當(dāng)涉及到系統(tǒng)架構(gòu)問題時(shí),這幾件事情是必須要考慮清楚的:什么樣的模塊比較合適?如何把它們組合在一起?如何進(jìn)行恰當(dāng)?shù)貦?quán)衡?在擴(kuò)大投資之前,它通常需要的并不是一個(gè)精明的商業(yè)命題,然而,一些深謀遠(yuǎn)慮的設(shè)計(jì)可以幫你在未來節(jié)省大量的時(shí)間和資源。
討論的重點(diǎn)幾乎是構(gòu)建所有大型Web應(yīng)用程序的核心:服務(wù)、冗余、分區(qū)和故障處理能力。這里的每個(gè)因素都會(huì)涉及到選擇和妥協(xié),特別是前面所討論的那些原則。解釋這些核心的佳辦法就是舉例子。
圖片托管應(yīng)用程序
有時(shí),你會(huì)在線上傳圖片,而一些大型網(wǎng)站需要托管和傳送大量的圖片,這對(duì)于構(gòu)建一個(gè)具有成本效益、高可用性并具有低延時(shí)(快速檢索)的架構(gòu)是一項(xiàng)挑戰(zhàn)。
在一個(gè)圖片系統(tǒng)中,用戶可以上傳圖片到一個(gè)中央服務(wù)器里,通過網(wǎng)絡(luò)連接或API對(duì)這些圖片進(jìn)行請(qǐng)求,就像Flickr或者Picasa。簡(jiǎn)單點(diǎn),我們就假設(shè)這個(gè)應(yīng)用程序只包含兩個(gè)核心部分:上傳(寫)圖片和檢索圖片。圖片上傳時(shí)好能夠做到高效,傳輸速度也是我們關(guān)心的,當(dāng)有人向圖片發(fā)出請(qǐng)求時(shí)(例如是一個(gè)Web頁面或其他應(yīng)用程序)。這是非常相似的功能,提供Web服務(wù)或內(nèi)容分發(fā)網(wǎng)絡(luò)(一個(gè)CDN服務(wù)器可以在許多地方存儲(chǔ)內(nèi)容,所以無論是在地理上還是物理上都更加接近用戶,從而導(dǎo)致更快的性能)邊緣服務(wù)器。
該系統(tǒng)需要考慮的其他重要方面:
1.圖片存儲(chǔ)的數(shù)量是沒有限制的,所以存儲(chǔ)應(yīng)具備可伸縮,另外圖片計(jì)算也需要考慮
2.下載/請(qǐng)求需要做到低延遲
3.用戶上傳一張圖片,那么圖片就應(yīng)該始終在那里(圖片數(shù)據(jù)的可靠性)
4.系統(tǒng)應(yīng)該易于維護(hù)(易管理)
5.由于圖片托管不會(huì)有太高的利潤(rùn)空間,所以系統(tǒng)需要具備成本效益
二、 服務(wù)
當(dāng)我們考慮構(gòu)建可伸縮的系統(tǒng)時(shí),它應(yīng)有助于解耦功能,系統(tǒng)的每個(gè)部分都可以作為自己的服務(wù)并且擁有清晰的接口定義。在實(shí)踐中,這種系統(tǒng)設(shè)計(jì)被稱作面向服務(wù)的體系結(jié)構(gòu)(SOA)。對(duì)于此類系統(tǒng),每個(gè)服務(wù)都有它自己的獨(dú)特功能,通過一個(gè)抽象接口可以與外面的任何內(nèi)容進(jìn)行互動(dòng),通常是面向公眾的另一個(gè)服務(wù)API。
把系統(tǒng)分解成一組互補(bǔ)性的服務(wù),在互相解耦這些操作塊。這種抽象有助于在服務(wù)、基本環(huán)境和消費(fèi)者服務(wù)之間建立非常清晰的關(guān)系。這種分解可以有效地隔離問題,每個(gè)塊也可以互相伸縮。這種面向服務(wù)的系統(tǒng)設(shè)計(jì)與面向?qū)ο笤O(shè)計(jì)非常相似。
快進(jìn)并假設(shè)服務(wù)正在大量使用;在這種情況下,很容易看到寫圖片的時(shí)間對(duì)讀圖片時(shí)間有多大影響(他們兩個(gè)功能在彼此競(jìng)爭(zhēng)共享資源)。根據(jù)各自體系,這種影響會(huì)是巨大的。即使上傳和下載速度相同(這是不可能的,對(duì)于大多數(shù)的IP網(wǎng)絡(luò)來說,下載速度:上傳速度至少是3:1),通常,文件可以從緩存中讀取,而寫入,終是寫到磁盤中(也許在終一致的情況下,可以被多寫幾次)。即使是從緩存或者磁盤(類似SSD)中讀取,數(shù)據(jù)寫入都會(huì)比讀慢(Pole Position,一個(gè)開源DB基準(zhǔn)的開源工具和結(jié)果)。
這種設(shè)計(jì)的另一個(gè)潛在問題是像Apache或者Lighttpd這些Web服務(wù)器通常都會(huì)有一個(gè)并發(fā)連接數(shù)上限(默認(rèn)是500,但也可以更多),這可能會(huì)花費(fèi)高流量,寫可能會(huì)迅速消掉所有。既然讀可以異步或利用其他性能優(yōu)化,比如gzip壓縮或分塊傳輸代碼,Web服務(wù)可以快速切換讀取和客戶端來服務(wù)于更多的請(qǐng)求,超過每秒的成都接數(shù)(Apache的成都接數(shù)設(shè)置為500,這種情況并不常見,每秒可以服務(wù)幾千個(gè)讀取請(qǐng)求)。另一方面,寫通常傾向于保持一個(gè)開放的鏈接進(jìn)行持續(xù)上傳,所以,使用家庭網(wǎng)絡(luò)上傳一個(gè)1 MB的文件花費(fèi)的時(shí)間可能會(huì)超過1秒,所以,這樣的服務(wù)器只能同時(shí)滿足500個(gè)寫請(qǐng)求。
當(dāng)然,如果你有兩個(gè)不同的端點(diǎn),上面的例子可能會(huì)運(yùn)行的很好(事實(shí)上,這非常類似于幾個(gè)云存儲(chǔ)供應(yīng)商之間的實(shí)現(xiàn)和內(nèi)容分發(fā)網(wǎng)絡(luò))。雖然有很多種方法可以解決這些瓶頸,但每個(gè)人都會(huì)有不同的權(quán)衡,所以采用適合你的方法才是重要的。
當(dāng)談到這些系統(tǒng)時(shí),其實(shí)并沒有非常正確的答案,但有助于我們回到文章開始處的原則上看問題。確定系統(tǒng)需求(大量的讀或?qū)懟蛘邇蓚€(gè)都進(jìn)行、級(jí)別并發(fā)、跨數(shù)據(jù)查詢、范圍、種類等等),選擇不同的基準(zhǔn)、理解系統(tǒng)是如何出錯(cuò)的并且對(duì)以后的故障發(fā)生情況做些扎實(shí)的計(jì)劃。
三、冗余
為了可以正確處理錯(cuò)誤,一個(gè)Web架構(gòu)的服務(wù)和數(shù)據(jù)必須具備適當(dāng)?shù)娜哂唷@?,如果只有一個(gè)副本文件存儲(chǔ)在這臺(tái)單獨(dú)的服務(wù)器上,那么如果這臺(tái)服務(wù)器出現(xiàn)問題或丟失,那么該文件也隨即一起丟失。丟失數(shù)據(jù)并不是什么好事情,避免數(shù)據(jù)丟失的常用方法就是多創(chuàng)建幾個(gè)文件或副本或冗余。
同樣也適用于服務(wù)器。如果一個(gè)應(yīng)用程序有個(gè)核心功能,應(yīng)確保有多個(gè)副本或版本在同時(shí)運(yùn)行,這樣可以避免單節(jié)點(diǎn)失敗。
在系統(tǒng)中創(chuàng)建冗余,當(dāng)系統(tǒng)發(fā)生危機(jī)時(shí),如果需要,可以消除單點(diǎn)故障并提供備份或備用功能。例如,這里有兩個(gè)相同的服務(wù)示例在生產(chǎn)環(huán)境中運(yùn)行,如果其中一個(gè)發(fā)生故障或者降低,那么該系統(tǒng)容錯(cuò)轉(zhuǎn)移至那個(gè)健康的副本上。容錯(cuò)轉(zhuǎn)移可以自動(dòng)發(fā)生也可以手動(dòng)干預(yù)。
服務(wù)冗余的另一重要組成部分是創(chuàng)建一個(gè)無共享架構(gòu)。在這種體系結(jié)構(gòu)中,每個(gè)節(jié)點(diǎn)都能相互獨(dú)立運(yùn)行,并且沒有所謂的中央“大腦”管理狀態(tài)或協(xié)調(diào)活動(dòng)其他節(jié)點(diǎn)。這對(duì)系統(tǒng)的可擴(kuò)展幫助很大,因?yàn)樾鹿?jié)點(diǎn)在沒有特殊要求或知識(shí)的前提下被添加。然而,重要的是,這些系統(tǒng)是沒有單點(diǎn)故障的,所以失敗的彈性就更大。
例如在我們的圖片服務(wù)器應(yīng)用程序中,所有的圖片在另一個(gè)硬件上都有冗余副本(理想情況下是在不同的地理位置,避免在數(shù)據(jù)中心發(fā)生一些火災(zāi)、地震等自然事故),服務(wù)去訪問圖片將被冗余,所有潛在的服務(wù)請(qǐng)求。
四、分區(qū)
數(shù)據(jù)集有可能非常大,無法安裝在一臺(tái)服務(wù)器上。也有可能這樣,某操作需要太多的計(jì)算資源、性能降低并且有必要增加容量。在這兩種情況下,你有兩種選擇:縱向擴(kuò)展或橫向擴(kuò)展。
縱向擴(kuò)展意味著在單個(gè)服務(wù)器上添加更多的資源。所以,對(duì)于一個(gè)非常大的數(shù)據(jù)集來說,這可能意味著添加更多(或更大)的硬件設(shè)備,來使一臺(tái)服務(wù)器能容下整個(gè)數(shù)據(jù)集。在計(jì)算操作下,這可能意味著移動(dòng)計(jì)算到一個(gè)更大的服務(wù)器上,擁有更快的CPU或更大的內(nèi)存。在各種情況下,縱向擴(kuò)展可以通過提升單個(gè)資源的處理能力來完成。
橫向擴(kuò)展在另一方面是添加更多的節(jié)點(diǎn),在大數(shù)據(jù)集下,這可能會(huì)使用第二服務(wù)器來存儲(chǔ)部分?jǐn)?shù)據(jù)集,對(duì)于計(jì)算資源來說,這意味著分割操作或跨節(jié)點(diǎn)加載。為了充分利用橫向擴(kuò)展,它應(yīng)作為一種內(nèi)在的系統(tǒng)架構(gòu)設(shè)計(jì)原則,否則修改或拆分操作將會(huì)非常麻煩。
當(dāng)談到橫向擴(kuò)展時(shí),常見的做法是把服務(wù)進(jìn)行分區(qū)或碎片。分區(qū)可以被派發(fā),這樣每個(gè)邏輯組的功能就是獨(dú)立的。可以通過地理界限或其他標(biāo)準(zhǔn),如非付費(fèi)與付費(fèi)用戶來完成分區(qū)。這些方案的優(yōu)點(diǎn)是他們會(huì)隨著容量的增加提供一個(gè)服務(wù)或數(shù)據(jù)存儲(chǔ)。
在我們的圖片服務(wù)器案例中,用來存儲(chǔ)圖片的單個(gè)文件服務(wù)器可能被多個(gè)文件服務(wù)器取代,每個(gè)里面都會(huì)包含一套自己獨(dú)特的圖像。這種架構(gòu)將允許系統(tǒng)來填充每一個(gè)文件/圖片服務(wù)器,當(dāng)磁盤填滿時(shí)會(huì)添加額外的服務(wù)器。這樣的設(shè)計(jì)需要一個(gè)命名方案,用來捆綁圖片文件名到其相應(yīng)的服務(wù)器上。圖像名字可以形成一個(gè)一致的哈希方案并映射到整個(gè)服務(wù)器上;或者給每張圖片分配一個(gè)增量ID,當(dāng)客戶端對(duì)圖片發(fā)出請(qǐng)求時(shí),圖片檢索服務(wù)只需要檢索映射到每個(gè)服務(wù)器上(例如索引)的ID。
當(dāng)然,跨越多個(gè)服務(wù)器對(duì)數(shù)據(jù)或功能進(jìn)行分區(qū)還是有許多挑戰(zhàn)的。其中的關(guān)鍵問題是數(shù)據(jù)本地化。在分布式系統(tǒng)中,數(shù)據(jù)操作或計(jì)算點(diǎn)越接近,系統(tǒng)性能就會(huì)越好。因此,它也可能是個(gè)潛在問題,當(dāng)數(shù)據(jù)分散在多個(gè)服務(wù)器上時(shí)。有時(shí)數(shù)據(jù)不是在本地,那么就要迫使服務(wù)器通過網(wǎng)絡(luò)來獲取所需的信息,這個(gè)獲取的過程就會(huì)設(shè)計(jì)到成本。
另一潛在問題是不一致。當(dāng)這里有多個(gè)服務(wù)對(duì)一個(gè)共享資源執(zhí)行讀寫操作時(shí),潛在可能會(huì)有另一個(gè)服務(wù)器或數(shù)據(jù)存儲(chǔ)參與進(jìn)來,作為競(jìng)選條件——一些數(shù)據(jù)需要更新,但是讀的優(yōu)先級(jí)高于更新——在這種情況下,數(shù)據(jù)就是不一致的。例如在圖片托管方案中,有可能出現(xiàn)的不一致是:如果一個(gè)客戶端發(fā)送更新“狗”圖片請(qǐng)求,進(jìn)行重新命名,把“Dog”改成“Gizmo”,但同時(shí),另一個(gè)客戶端正在讀這張圖片。在這種情況下,標(biāo)題就是不清楚的。“Dog”或“Gizmo”應(yīng)該被第二個(gè)客戶端接收。
當(dāng)然,在進(jìn)行數(shù)據(jù)分區(qū)時(shí)會(huì)產(chǎn)生一些障礙,但是分區(qū)允許把每個(gè)問題拆分到管理群里——通過數(shù)據(jù)、負(fù)載、使用模式等。這樣對(duì)可擴(kuò)展和易管理都是有幫助的,但也不是沒有風(fēng)險(xiǎn)的。這里有很多方式來降低風(fēng)險(xiǎn)和故障處理;然而,為了簡(jiǎn)便起見,并未在本文中詳細(xì)說明,如果你有興趣,可以訪問我的博客。
總結(jié)
以上介紹的都是設(shè)計(jì)分布式系統(tǒng)需要考慮的核心要素??捎眯浴⑿阅?、可靠性、可擴(kuò)展、易管理、成本這幾個(gè)原則非常重要,但在實(shí)際應(yīng)用中可能會(huì)以犧牲某個(gè)原則來實(shí)現(xiàn)另外一個(gè)原則,在這個(gè)過程中就要做好權(quán)衡工作,做到因時(shí)制宜。
網(wǎng)頁名稱:網(wǎng)站建設(shè):Web設(shè)計(jì)分布式系統(tǒng)的四個(gè)核心原則
標(biāo)題網(wǎng)址:http://www.rwnh.cn/news45/260395.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、移動(dòng)網(wǎng)站建設(shè)、做網(wǎng)站、App設(shè)計(jì)、標(biāo)簽優(yōu)化、響應(yīng)式網(wǎng)站
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源:
創(chuàng)新互聯(lián)