2013年11月17日 星期日

一至千萬的藝術 - 網站擴展架構

市面上有許多以網頁作為營運工作的公司,如掏寶或Amazon , 而網站架構也不是一步登天, 一定有演化順序

不能停

有些網站除非世界末日不然也不能停,如google或FB等...,現今開發網路服務,必須考量三樣重要因素:可靠性(Reliability)、可得性(Availability)、擴展性(Scalability)。
可靠性是指一個服務運行期間出現錯誤的狀況。擴展性是指這一個網路服務,可以透過增加主機數量台提升整體的承載能力。可得性簡單來說就是服務時間,如果1%機率當機則99%時間可服務,然而降低當機率與成本是反向指數成長。
例如github網站上有顯示:
https://status.github.com/

艦隊的第一艘船

往往會把網頁應用伺服器(Web Application Server)和資料庫伺服器(Database server)放置於同一台主機上,如下圖:
這種架構能勉強支撐十萬至數十萬等級的使用者。實際能承受的量依照機器硬體的等級而定。然而硬體的等級不管如何提升,終究有一定的上限。屆時,當承載量再次增加,問題就會顯露無遺。在專業術語上我們稱之為瓶頸(Bottleneck)。
另一個更嚴重的名詞叫失效單點(Single point of failure),也就是說當這一台機器故障就會造成整個服務停擺。目前的單一主機就是這樣的一個點。


各司其職 - 船隊分工

將網頁伺服器和資料庫獨立放到不同的主機上

艦隊添購新船

為了讓網頁應用伺服器能夠處理大量請求,因此會增設多台網頁應用伺服器。使用者只認得一個網址,為了讓連線到同一個網址的請求分配到不同主機上,還得在前面擺一個「負載平衡器」(Load balancer)。
當走到這一步,大約的承載能力大略可以突破百萬使用者。但從圖中相信讀者也可以看出,資料庫只有一台,因此成為了新的瓶頸。這台伺服器來不及處理讀取或寫入資料的請求時,前端有再多的網頁應用伺服器也沒有用。


讀寫分離

為了減輕資料庫的負擔,接著要引入一個概念 –「讀寫分離」。資料庫面對的有讀取和寫入兩種請求。主要寫入資料庫為一個,負責讀取的為另外資料庫
大略的承載能力可能落在數百萬的數量級


資料庫碎片

事情似乎很美好。但不幸的是當購物量也不停增加時,主要的資料庫還是很快會成為瓶頸。除此之外,若主要資料庫一旦當機,也會造成購物無法進行,形成了失效單點。
為了解決此問題,在此時一般會引入資料庫的碎片(Shrading)技術。簡單的來說,將大量的資料分成一小群一小群,分別塞到不同的資料庫主機裡,當要查詢或寫入時,再看這一筆資料落在哪一台機器裡。
當走到這一步,整體艦隊的承載能力已經可以達到千萬等級了。
然而資料庫碎片雖然可以分散承載量到不同的機器,卻也增加了應用程式的難度與複雜度。有些企業會用 NoSQL 而非用碎片來解決這類問題,例如CassandraHBase;也有人自行發展技術來處理這部份的問題。