Vagrant Tutorial(1)雲端研發人員,你也需要虛擬機! by William Yeh | CodeData
top

Vagrant Tutorial(1)雲端研發人員,你也需要虛擬機!

分享:

前言

在進入本系列文章的正題之前,讓我們先問一個問題:為什麼研發人員也需要虛擬機呢?

虛擬機?那不是伺服器維運人員才需要知道的嗎?

常見的原因是,研發者用的本機電腦,與真正上線服務的電腦,兩者的作業系統及相關組態,甚至連本性都很不一樣。我們需要一種方法,模擬出一個遠端的環境,既是獨立於本機的乾淨隔離環境,又要保持與本機互連的彈性。最後,為了讓整個團隊能在一致的環境下協同研發,這種組態設定知識,也要形諸文件,可程式化,可再現,予以版本控制,也就是所謂的 “infrastructure as code”。

為什麼兩者會不一樣呢?這得從頭說起⋯⋯

雲端主機的作業系統市占率

拜 Xen、KVM、Hyper-V 等 hypervisor 虛擬化技術進步之賜,雲端主機產業發達。你可以選用像 LinodeDigitalOcean 這類的 VPS,也可以像 Amazon EC2Google Compute Engine 這類更重量級的雲端服務。大概快則一分鐘,慢則數分鐘,就可新開或複製一份執行個體 (instance) 上線運作。

就是因為太方便了,許多沒有舊包袱的研發團隊,除了人手一台筆電外,早已不再採購高規格的實體主機,全盤雲端化。你隨時可以 ssh 或 RDP 遠端登入進去(也許會再多加一層 VPN);至於這主機本體,是擺在台灣的內湖、板橋、彰化機房,還是位於美國、新加坡或日本,老實說,除了連線速度之外,可能根本沒有人會在意。

這些雲端主機,在 hypervisor 上面所搭載的作業系統,多半是哪些呢?

根據 W3Techs 的全球調查,純以 Web 網站的市占率而言,泛 Unix 家族就占了 2/3。若再針對其中的 Linux 予以細分:

Linux 市占率
Debian 30.6%
Ubuntu 25.0%
CentOS 19.7%
Unknown 14.6%
Red Hat 4.9%
Gentoo 2.0%
Fedora 1.7%
SuSE 1.1%
其他
資料來源:http://w3techs.com/technologies/details/os-linux/all/all – 2014/08/05

不難發現,這些最受歡迎的 Linux 發行版,也都是各大雲端主機服務商優先提供的預載系統。

這項調查只針對 Web 網站,沒涵蓋到 API、資料庫、中介軟體等後端伺服器或大型主機,但雖不中亦不遠矣。事實上,打自 LAMP 浪潮以降,接續 NoSQL 革命,幾乎已經宣判 Linux 是低成本、高性能雲端伺服器的王道。

對這議題有興趣的,請參閱 Wikipedia 的 Usage share of operating systems 條目。

你自己的桌機或筆電,也是用 Linux 嗎?

以上講的是遠在天邊的伺服器。那麼,近在眼前的桌機或筆電呢?仍然是 Linux 當道嗎?

一般老百姓的上網電腦,據 Net Applications 顧問機構調查,Windows 新舊版本的總市占率超過八成;另一個機構 StatCounter 也有類似的結論(詳細數據請見本文附錄)。

不過,軟體研發人員這種奇特生物,對於朝夕相處的謀生工具,評估角度不見得和普通老百姓一樣。這方面似乎沒有可靠的普查,但若不求量化數字,仍可從許多角度側面觀察質化內涵。

首先,這種生物每天都在跟程式語言打交道,不會故意選一個不合身的工作環境(作業系統、編輯器、編譯器、整合開發環境⋯⋯)來開發程式。譬如說,如果你每天都在寫 Objective-C 程式,幾乎可以斷定,你身邊會有一台 Mac OS X 的電腦。同理,如果你的主力是 C#,那麼,如果你不在 Windows 裡面打滾,等於是自找麻煩。

因此,我們拿程式語言及所屬的技術圈,做為旁敲側擊切入點。即使不是決定因素,至少也是高度相關的指標。

拿本文附錄所列的熱門程式語言,逐一分析,約可粗分為幾類:

  1. 沒有明顯作業系統偏好:
    • 老字號的 C,加上影響力不如前的 C++,仍是系統程式的要角,隨處可見,各主流作業系統也早有合適的開發工具鏈。
    • PHP、JavaScript:簡易普及的網站前後端技術,各主流作業系統也早有合適的開發工具鏈。
    • Python:原本應該是 Unix 或 Mac 的勢力範圍,但隨著 AnacondaCanopy 這類整合套件包的出現,已經不太有疆界之分了。
  2. 明顯的 Windows 派:C#、Visual Basic。
  3. 明顯的 Mac OS X 派:Objective-C。未來的 Swift 大概也是這樣。
  4. 理論上應該沒有明顯偏好,但在高手圈裡卻別有一番風光:
    • Java:高可攜性的血統,讓 Eclipse、IntelliJ IDEA、NetBeans 這些優秀的整合開發工具,也都能在任何主流作業系統上順暢運作。但有趣的是,據 9TO5 媒體報導,在 Google I/O 2011 這種技術密集的場子裡,不管是講員、聽眾、記者,幾乎人手一台 Mac 筆電(有圖為證)!此外,據 ZeroTurnaround 對兩千多名 Java 從業人員的 “Java Tools and Technologies Landscape for 2014” 調查報告指出,Unix 及 Mac 開發者分別占 26% 及 24%,已經堪與 Windows 三分天下,版圖挪移現象明顯。
    • Ruby + Rails:打自 RailsConf 2006 起,就有人注意到 Mac 比例異常的高(有圖為證)。儘管 RailsBridge 團體有整理一份〈裝機趴 Installfest〉:「這裡有把 Ruby、Rails 和其他重要工具安裝在 Mac、Windows、Linux 電腦上的逐步指引」,但容我引述 Rails 達人 XDite 在 Rails 101 書中所說:

      世界上絕大多數的 Rails Developer 開發都是使用 MacBook […] 更重要的是每當 OS 更新、Gem 版本更新、Rails 地雷…Linux 使用者都會因為 package system maintainer 不是 Rails Developer 而不熟生態圈的關係,被雷炸的像次等公民。

      開發者的時間就是金錢,想想好的設備會為你的生產力帶來多大的改善?好的 framework 會多節省你的開發時間?

      你都已經打算開始學習 Rails 改善你悲慘的開發人生了,為什麼不買一台 Mac 讓自己更節省力氣呢?

很顯然的,研發者用的本機電腦,百花齊放,各有所好;與真正上線服務的電腦,兩者的作業系統,難以強求完全相同。

什麼?軟體組態問題?我就是升級狂呀!

除了作業系統之外,軟體組態也是另一個有差異的地方。

傳統上,軟體團隊可分為開發組 (development) 及維運組 (operation)。開發組走在技術最前線,求新求變,愛嘗鮮;維運組則力求服務穩定,傾向保守,座右銘是:“if it ain’t broke, don’t fix it”。

電腦會忠實反映這兩種不同的心態取向。

研發人員總是克制不住想升級到最新軟體,實驗最新功能;但真正上線服務的電腦,往往還停留在「傳說中最穩定的某個舊版本」,不輕易競逐版本。一段時間過後,歧異就會出現。

就以幾個典型的伺服器軟體為例。以下是 2014 年 8 月 8 日父親節當天,用 Ubuntu 14.04 LTS 的查詢結果,皆以各軟體的 stable 版為準:

軟體 Ubuntu 套件名 預設安裝版本 ** 自訂安裝版本
Apache apache2 2.4.7 2.4.10
memcached memcached 1.4.14 1.4.20
MongoDB mongodb-server 2.4.9 2.6.3
MySQL mysql-server 5.5.38 5.6.20
Nginx nginx 1.4.6 1.6.1
Redis redis-server 2.8.4-2 2.8.13

補充說明:

符號 安裝方式
** 正常 apt-get 機制:apt-get update ; apt-get install
自軟體官網下載 tar.gz 之後,編譯,安裝。
添加軟體官網 APT repository,再透過正常 apt-get 機制安裝。

軟體版本不同,就有機會出現不一致的執行結果,出現所謂 “it works on my machine” 這種很難 debug 的問題。

這畢竟是研發黑手專用的機器呀!

其實更根本的差異是,研發人員的本機,本來就是為了研發軟體而存在,會盡可能給人方便。反之,真正上線服務的電腦,只要把這台電腦被賦予的少樣特定任務做好就夠了,不必成為樣樣都裝的萬能機器,反而要做足防護,並榨乾最後一滴性能。因此:

  • 研發人員的本機,為了研發及實驗,Java 會同時安裝 1.7 & 1.8,Python 會同時安裝 2.7 & 3.4。反之,上線主機為了瘦身,也為了避免漏洞,如非必要,一台電腦會只安裝一份必要版本。
  • 研發人員的本機,在研發及實驗的過程中,常會把電腦環境「弄髒」,也無暇弄乾淨(所謂的「黑手」嘛)。但這是上線主機所不容許的。
  • 研發人員的本機,為了加速編程、編譯、測試、除錯循環,會安裝一些立即回饋的組件;但上線主機通常不會部署這些東西。像在 Node.js 陣營,開發時可能會用 Livenode 之類的東西來執行主程式;但這只是研發者的祕技,不該部署出去。像在 Rails 陣營,以 XDite 創的工作室公開的 Rails 裝機實務為例,建議 Ubuntu 上線主機安裝 Nginx + Passenger,對 Mac 開發環境則另行推薦「使用 Pow 作為 HTTP Server,其標榜的就是 Zero Config⋯⋯相較起來,以往的 Passenger 搭配 Mac 本機端 Apache 的 solution 就顯得太笨重了。」
  • 研發人員的本機,為了方便,不會故意啟動 SELinux、iptables 等讓自己綁手綁腳的保全機制。

很顯然的,研發者用的本機電腦,與真正上線服務的電腦,兩者之間,不僅是作業系統,就連軟體組態,也都難以強求完全相同。研發者必須意識到這種現實,學習在兩種系統之間切換心智模式。

好吧,有黑客精神的你,或許為了自我挑戰,刻意把手邊桌機或筆電多切出一塊 Linux 開機分割區(像我的 MacBook Air 就挪出一個 Ubuntu 14.04 開機選項),軟體組態都刻意與伺服器主機分毫不差,以方便在本機進行某些逼真的實驗。但萬一你想在一台本機上玩玩 Hadoop cluster 呢?你的電腦可以無性生殖 N 台嗎?

那,該怎麼辦?

小結

拜敏捷開發 (agile) 思潮所賜,及早測試、及早整合、頻繁整合、持續整合等機制,成為研發團隊流程改善的目標。DevOps 觀念也告訴我們:研發者若能在毋需大幅改變自身習慣的情況下,常與正式上線機雷同的環境為伍,就能盡早揭露出潛在的功能面及非功能面瑕疵。

因此,研發者需要一種方法,能在本機模擬出那些電腦叢集,越像越好。模擬出來的環境,既是獨立於本機的乾淨隔離環境,又要保持與本機互連的彈性。最後,為了讓整個團隊能在一致的環境下協同研發,這種組態設定知識,也要形諸文件,可程式化,可再現,予以版本控制,也就是所謂的 “infrastructure as code”。

簡單的答案是:你需要虛擬機

複雜一點的答案呢,且聽下回分解。

附錄A:桌機筆電作業系統市占率

Net Applications 顧問機構調查,一般老百姓的上網電腦,Windows 新舊版本的總市占率超過八成:

Desktop Top Operating System Share Trend (July, 2013 to July, 2014)

另一個機構 StatCounter 也有類似的結論:

Top 7 Desktop & Console OSs (Aug 2013 to July 2014)
Source: StatCounter Global Stats – OS Market Share

附錄B:程式語言市占率

根據 TIOBE Programming Community Index(常簡稱為 TIOBE Index)的調查,最熱門的程式語言分別是:

排名 程式語言 熱門度
1 C 30.6%
2 Java 15.7%
3 Objective-C 10.3%
4 C++ 5.5%
5 (Visual) Basic 4.3%
6 C# 4.1%
7 PHP 2.9%
8 Python 2.7%
9 JavaScript 1.8%
10 Transact-SQL 1.8%

資料來源:http://www.tiobe.com/index.php/content/paperinfo/tpci/ – 2014/07/06

再看另一份由 DedaSys 所做的 Programming Language Popularity 調查:

Programming Language Popularity (Oct 25, 2013)
Source: Programming Language Popularity – by LangPop.com

後續 >> Vagrant Tutorial(2)跟著流浪漢把玩虛擬機

分享:
按讚!加入 CodeData Facebook 粉絲群

相關文章

留言

留言請先。還沒帳號註冊也可以使用FacebookGoogle+登錄留言

alexk110712/04

大的方向與結構受用充實了,謝謝!

關於作者

擔任過許多職場角色:程式設計師、技術團隊領班、技術作家及譯者、教授、顧問、技術佈道者,但目前最喜歡的身份,還是「軟體架構師」。

熱門論壇文章

熱門技術文章