為什麼不能用自己的筆電當伺服器:雲端運算、虛擬化與 VPS 的關係
上一篇把伺服器程式碼跑了起來,也在瀏覽器裡看到了畫面。這一節先解釋「那為什麼不能就這樣把自己的電腦當伺服器用」,再從這個問題一路帶到雲端運算、虛擬化,最後停在 VPS(虛擬私有伺服器)這個現代網路應用共通的解法。
為什麼不能直接用自己的電腦當伺服器
伺服器最核心的原則是必須 100% 可用:網頁一旦掛掉,就是在流失使用者與金錢,等於直接抵銷了寫這個應用程式的意義。用自己的筆電當伺服器,會立刻碰到幾個實際問題:
- 可用性:作業系統需要更新、筆電需要闔上、記憶體可能要拿去玩遊戲,都會讓伺服器停擺
- 協作:多人要同時開發同一個伺服器時,複製一份各自修改會很快變得混亂,也沒辦法沿用開發伺服器(development server)的工作流程
- 擴充性:流量成長時,用「多買幾台筆電」來擴充規模並不現實
這些問題呼應了上一篇之前那篇提到的「正式伺服器需要專用硬體」的原因:光靠一台個人電腦,既撐不住持續運作的要求,也沒辦法應付多人協作與流量成長。
伺服器永遠不會只有一台
正式環境的伺服器一定是多台一起運作,而不是單一一台。多台伺服器背後有幾個目的:
- 備援(redundancy):分攤流量、避免單點故障
- 容錯移轉(fail over):一台掛掉時其他台能接手
- 應付停電與更新:更新時讓一半伺服器下線更新、另一半維持運作對外服務,這種做法稱為藍綠部署(red and green,即 blue-green deployment 的另一種說法)
這整套維運多台伺服器的知識,就是伺服器管理(server management)與 DevOps 這個領域,對大多數只接觸前端的工程師來說相對陌生,因為平常很少需要去想「是什麼在支撐這一切正常運作」。
從自建機房到雲端運算
早年(大約十年前)想要有自己的伺服器,做法是在公司放一整排伺服器機架,通常放在建築物的地下室或防火隔間,因為伺服器運作時非常燙。像高盛這類金融公司至今仍有這樣的自建機房。但對一般開發者而言,把伺服器機架放在自己家裡並不現實,插頭一拔、電力一斷,整個服務就跟著掛掉,使用者也不會體諒。
現在普遍的做法是雲端運算(cloud computing):某個地方有一座巨大的資料中心、一整排伺服器機架,使用者只需要向這些伺服器租用時間與資源,而不必自己擁有硬體。這是網頁開發領域重要的轉變之一:20 年前每家公司都得自己養 IT 人員、自己找系統管理員來處理伺服器,現在這些工作可以外包給 AWS、DigitalOcean、Rackspace 這類更專精的雲端服務供應商。雲端運算本身沒有什麼神秘之處,說穿了就是「跟別人租一段伺服器時間」,只是常被當成行銷用的時髦詞彙。
虛擬化:雲端運算真正的關鍵技術
讓雲端運算真正能運作的技術是虛擬化(virtualization):把硬體資源切分成一台一台的虛擬電腦,也就是前面提到「伺服器晶片組之所以跟家用電腦不同」背後的原因之一。以前如果只想跑一個很單純的 Node 伺服器,也得整台租下一顆 32 核心的 Intel 處理器;虛擬化之後,可以只租其中一個核心,等於把那顆 32 核心的處理器變成 32 台獨立的虛擬電腦。
這個概念聽起來簡單,實作上卻相當困難,因為電腦原本的設計是拿來做多工處理(multi-processing)與多執行緒(multi-threading),而不是「一個執行緒對應一個核心」這種切分方式,這對電腦架構來說是相當陌生的用法。早期的雲端運算因此經歷過一段顛簸期,直到後來出現專門擅長處理虛擬化、擅長處理這種一執行緒對一核心模式的處理器,才把這些問題逐漸解決。
虛擬機(virtual machine)則是虛擬化更完整的一種形式:把整台電腦,包含記憶體、硬體、GPU 等所有組成部分,都做成虛擬版本,等於是把電腦整台複製一份出來。但這種做法非常消耗資源,就像把自己的筆電整台複製、再放回硬碟裡一樣,因此現在較少直接使用虛擬機這種方式,只有在真的需要完全一致的複製環境時才會用到。
VPS:現代網路應用的共通解法
接下來課程要實際購買的,是一種稱為 VPS(Virtual Private Server,虛擬私有伺服器)的資源。之所以叫「虛擬」,是因為它本質上是被憑空劃分出來的:可以買四個核心,也可以只買一個核心,數量完全是虛擬化出來的結果。
不論是 Netflix、Facebook,還是其他各種現代網路應用,幾乎都是靠某種形式的 VPS 運作(Facebook 因為使用自有硬體,是比較特殊的例外)。有了這個基礎概念後,接下來會實際去購買一台自己的伺服器:挑選作業系統、理解為什麼選它、學會登入與身份驗證的方式,最終擁有一台真正跑在雲端某處的伺服器。
複習
為什麼不能直接把本機開發伺服器當成正式伺服器使用?
因為本機伺服器沒辦法保持 100% 可用(作業系統要更新、電腦要闔上)、不利於多人協作開發,也沒辦法透過增加硬體來應付流量成長。
什麼是雲端運算,它跟過去自建機房的做法有什麼不同?
雲端運算是向巨大的資料中心租用伺服器時間與資源,不需要自己維護實體伺服器與 IT 人員;相較之下,過去的做法是每家公司自己建置機房、自己聘請系統管理員。
什麼是虛擬化,為什麼它是雲端運算能夠運作的關鍵?
虛擬化是把硬體資源(例如處理器核心)切分成多台獨立的虛擬電腦,讓使用者可以只租用自己需要的一小部分資源,而不必整台硬體都買下來,是雲端運算能夠低成本、有彈性地提供資源的核心技術。
VPS 跟虛擬機有什麼差別?
VPS(虛擬私有伺服器)只虛擬化部分運算資源(如處理器核心),相對輕量;虛擬機則是把整台電腦(記憶體、硬體、GPU 等)都完整複製成虛擬版本,資源消耗大得多,因此現在較少使用。
早期雲端運算的實作面臨了什麼困難?
電腦原本是為多工處理與多執行緒設計的,「一個執行緒對應一個核心」這種虛擬化所需的切分方式與原本的架構相衝突,導致早期雲端運算很不穩定,後來靠專門擅長虛擬化的處理器才逐漸解決。
小測驗
雲端運算在網頁開發中最主要的優勢是什麼?
可以向巨大的資料中心租用伺服器時間與資源VPS 是什麼的縮寫?
Virtual Private Server(虛擬私有伺服器)早期雲端運算實作面臨的關鍵挑戰是什麼?
把一個執行緒對應到一個核心的做法很難實現此文章是 FrontendMasters 上的 Full Stack Fundamentals, v3 課程筆記
