當(dāng)一個(gè)開發(fā)人員提升計(jì)算機(jī)系統(tǒng)負(fù)荷時(shí)兜蠕,通常會考慮兩種方式垂直擴(kuò)展和水平擴(kuò)展扰肌。選用哪種策略主要依賴于要解決的問題以及系統(tǒng)資源的限制。在這篇文章中我們將講述這兩種策略并討論每種策越的優(yōu)缺點(diǎn)熊杨。如果你已經(jīng)有一個(gè)軟件系統(tǒng)需要不斷成長曙旭,那么你將有意或者無意中選擇這兩種策略中的一種。
垂直擴(kuò)展
在垂直擴(kuò)展模型中晶府,想要增加系統(tǒng)負(fù)荷就意味著要在系統(tǒng)現(xiàn)有的部件上下工夫桂躏,即通過提高系統(tǒng)部件的能力來實(shí)現(xiàn)。例如川陆,假設(shè)你現(xiàn)在負(fù)責(zé)一批木材采伐的操作剂习。
在這個(gè)例子中,我們假設(shè)有3輛卡車较沪,每輛車一次可以運(yùn)25根木材鳞绕,計(jì)算花費(fèi)1小時(shí)的情況下可以運(yùn)送到指定地點(diǎn)等待處理的木材數(shù)量。通過這些數(shù)字我們可以算出我們系統(tǒng)最大的負(fù)荷量:
3輛卡車 * 25根木材 * 1小時(shí)=75根木材/小時(shí)
如果我們選擇垂直擴(kuò)展模型购对,那么我們將怎么做來使我們每小時(shí)可以處理150根木材猾昆?我們需要至少做以下兩件事中的一件:
使每輛卡車的運(yùn)輸量增加一倍(50棵樹每小時(shí)),或者使每輛卡車的運(yùn)輸時(shí)間減半(每輛卡車30分鐘)骡苞。
3輛卡車 * 50棵樹 * 1小時(shí) = 150棵樹/每小時(shí)
或者
3輛卡車 * 25棵樹 * 30分鐘 = 150棵樹/每小時(shí)
我們沒有增加系統(tǒng)的成員數(shù)垂蜗,但是我們通過增加系統(tǒng)成員的生產(chǎn)效率來獲得期望的負(fù)荷量。
水平擴(kuò)展
在水平擴(kuò)展模型中解幽,我們不是通過增加單個(gè)系統(tǒng)成員的負(fù)荷而是簡單的通過增加更多的系統(tǒng)成員來實(shí)現(xiàn)贴见。也就是說,在以上運(yùn)送木材的例子中躲株,通過增加卡車的數(shù)量來運(yùn)送木材片部。因此,當(dāng)我們需要將負(fù)荷從75棵樹每小時(shí)增加到150棵樹每小時(shí)霜定,那么只需要增加3輛卡車档悠。
6輛卡車 * 25棵樹 * 1小時(shí) = 150棵樹/每小時(shí)
假如我們已經(jīng)選擇了垂直擴(kuò)展方式,那么我們想要每小時(shí)處理150棵被砍伐的樹時(shí)需要怎么做呢望浩?我們需要做到以下兩方面之一:要么使每輛卡車的運(yùn)輸量翻倍(50棵木材一次)辖所,要么使每輛開車的運(yùn)輸時(shí)間減半(30分鐘)。
3輛卡車 * 50棵樹 * 1小時(shí) = 150棵樹/每小時(shí)
或者
3輛卡車 * 50棵樹 * 30分鐘 = 150棵樹/每小時(shí)
在這個(gè)例子中磨德,系統(tǒng)每個(gè)成員的生產(chǎn)力依然沒變缘回,我們通過增加更多的卡車來提高系統(tǒng)的能力吆视。
擴(kuò)展你的web數(shù)據(jù)庫
通過對水平擴(kuò)展和垂直擴(kuò)展的基本了解,下面讓我們來關(guān)注web系統(tǒng)的擴(kuò)展酥宴。一個(gè)網(wǎng)站通常有很多組件都需要去考慮它們的擴(kuò)展性啦吧,但是我通常喜歡關(guān)注處在最邊緣的一個(gè):數(shù)據(jù)庫。為什么數(shù)據(jù)庫是最邊緣的拙寡?因?yàn)閿?shù)據(jù)庫通常是共享資源授滓,是幾乎所有請求最終的連接點(diǎn)。
你的系統(tǒng)是什么類型的倒庵?
在擴(kuò)展你的數(shù)據(jù)庫時(shí)褒墨,你必須要問的一個(gè)重要問題是:“我所面對的系統(tǒng)是什么類型的?”你所面對的是一個(gè)讀操作多還是寫操作多的系統(tǒng)擎宝?讀操作多的網(wǎng)站一般包括:在線商城郁妈,在商城里用戶大部時(shí)間是在瀏覽(讀操作),只有少數(shù)時(shí)間在付款(寫操作)绍申、或者博客噩咪,在博客上人們大部分時(shí)間是在瀏覽博文(讀操作),只有少數(shù)時(shí)間是在評論或者發(fā)表博文(寫操作)极阅。相反的胃碾,關(guān)于寫操作非常多的很好的例子包括:信用卡交易處理器,這個(gè)系統(tǒng)的主要負(fù)載時(shí)在處理記錄交易(寫操作)筋搏,偶爾會查找交易(讀操作)仆百、或者Google分析,主要工作實(shí)在記錄業(yè)務(wù)數(shù)據(jù)(寫操作)奔脐,偶爾會展示分析圖(讀操作)俄周。
了解你所創(chuàng)建的網(wǎng)站是什么類型的,可以在網(wǎng)站成長過程中幫助你選擇正確的技術(shù)髓迎。
讀操作擴(kuò)展
如果你的系統(tǒng)讀操作非常多峦朗,那么通過關(guān)系型數(shù)據(jù)庫如MySQL或者PostgreSql來垂直擴(kuò)展數(shù)據(jù)存儲是一個(gè)不錯(cuò)的選擇。結(jié)合你的關(guān)系型數(shù)據(jù)庫通過使用memcached或者CDN來構(gòu)建一個(gè)健壯的緩存系統(tǒng)排龄,那么你的系統(tǒng)將非常容易擴(kuò)展波势。在這種模式中,如果數(shù)據(jù)庫超負(fù)荷運(yùn)行橄维,那么將更多的數(shù)據(jù)放入緩存中來緩解系統(tǒng)的讀壓力尺铣。當(dāng)沒有更多的數(shù)據(jù)往緩存中放時(shí),可以更換更快的數(shù)據(jù)存儲硬件或者買更多核的處理器來獲取更多的運(yùn)行通道争舞。摩爾定律使通過這種方法來垂直擴(kuò)展變得和購買更好的硬件一樣簡單迄埃。
寫操作擴(kuò)展
如果你的系統(tǒng)寫操作非常多,那么你可能更希望考慮使用可水平擴(kuò)展的數(shù)據(jù)存儲方式兑障,比如Riak,Cassandra或者HBase。和大多數(shù)關(guān)系型數(shù)據(jù)管理系統(tǒng)不同流译,這種數(shù)據(jù)存儲隨著增長增加更多的節(jié)點(diǎn)逞怨。由于你的系統(tǒng)大部分時(shí)間是在寫入,所以緩存曾并不能像在讀操作比較頻繁的系統(tǒng)中起到那么大作用福澡。很多寫頻繁的系統(tǒng)一開始使用垂直擴(kuò)展的方式叠赦,但是很快發(fā)現(xiàn)并不能根本解決問題。為什么革砸?因?yàn)橛脖P數(shù)和處理器數(shù)在某一點(diǎn)達(dá)到平衡除秀,在這個(gè)邊界上再增加一個(gè)處理器或者一個(gè)硬盤都會是每秒鐘的I/O操作數(shù)成指數(shù)性增長。相反算利,如果對寫頻繁的系統(tǒng)采取水平擴(kuò)展策略册踩,那么你將達(dá)到一個(gè)拐點(diǎn),在這個(gè)拐點(diǎn)之后如果在增加一個(gè)節(jié)點(diǎn)都遠(yuǎn)比使用更多的硬盤來的實(shí)惠效拭。
其他注意事項(xiàng)
另一件事需要記住的是每種擴(kuò)展策略下預(yù)想不到的開銷暂吉。采用垂直擴(kuò)展的系統(tǒng)將開銷凡在單獨(dú)的組件上。當(dāng)我們?nèi)ヌ嵘到y(tǒng)負(fù)荷時(shí)缎患,這些單獨(dú)的組件需要在管理上花費(fèi)更多慕的。拿我們運(yùn)送木材的例子來說,如果需要使每輛卡車的貨運(yùn)量翻倍挤渔,那么我們需要更寬肮街、更長、或者更高的車廂判导。也許有的路因?yàn)闃虻母叨葘囕v高度有要求嫉父,或者基于巷子寬度車寬不能太大,又或者由于機(jī)動車安全駕駛要求車廂不能太長骡楼。這里的限制就是對單個(gè)卡車做垂直擴(kuò)展做的什么程度熔号。同樣的概念延伸到服務(wù)器垂直擴(kuò)展:更多的處理器要求更多的空間,進(jìn)而要求更多的服務(wù)器存儲架鸟整。
相反的引镊,采用水平擴(kuò)展的系統(tǒng)將額外的開銷放在系統(tǒng)中連接起來的共享組件上。當(dāng)我們?nèi)ヌ嵘到y(tǒng)負(fù)荷時(shí)篮条,共享的開銷和新增加的成員之間的協(xié)調(diào)性有關(guān)弟头。在我們運(yùn)送木材的例子中,當(dāng)我們在路上增加更多卡車時(shí)涉茧,那么路就是共享資源也就成了約束條件赴恨。這條路上適合同時(shí)跑多少量卡車?我們是否有足夠的安全緩沖區(qū)使得所有的車可以同時(shí)裝運(yùn)木材伴栓?如果再來看我們水平擴(kuò)展的數(shù)據(jù)庫系統(tǒng)伦连,那么經(jīng)常被忽略的開銷就是服務(wù)器同時(shí)連接時(shí)的網(wǎng)絡(luò)開銷(譯者注:網(wǎng)絡(luò)為各個(gè)系統(tǒng)的共享資源)雨饺。當(dāng)你為系統(tǒng)增加更多的節(jié)點(diǎn)時(shí),共享資源的負(fù)荷也就越來越重惑淳,通常呈非線性改變额港。
綜合說明
和計(jì)算機(jī)的大多數(shù)東西一樣,好的解決辦法通常并不像我這里列出來的這么簡單歧焦。而我在這里嘗試簡化這種思想用來來說明這中概念而不是講具體的解決辦法移斩。擴(kuò)展是個(gè)困難的問題,這是個(gè)需要在實(shí)際處理的每個(gè)步驟中都要思考的問題绢馍。擴(kuò)展策略沒有魔法向瓷,也沒有魔法般的軟件幫你建立一個(gè)完整可靠的可擴(kuò)展系統(tǒng)。就像擴(kuò)展中的其他問題一樣舰涌,一個(gè)大的解決方案通常是由很多個(gè)一起協(xié)調(diào)工作的小的解決辦法組成的猖任。這需對每一個(gè)中解決方案進(jìn)行精心正確的設(shè)計(jì)和開發(fā)。