Gogolook伺服器總監葉秉哲表示,架構脆弱的應用程式,如果搬遷上雲端,只會讓其缺點更加倍放大,像是雲端環境自動水平擴充的功能,讓原本只出現在一臺伺服器上的程式臭蟲,蔓延到更多主機上。

圖片來源: 

iThome

從實體伺服器、虛擬機,到現在火紅的容器及無伺服器技術,IT技術的演進,讓軟體無論在部署、調度,或是硬體資源使用都更有效率。在2014年Docker熱潮剛掀起不久,Gogolook伺服器總監葉秉哲就已經嘗試在公司正式環境導入Docker容器。每當他在授課或是與開發社群交流示範使用Docker快速部署,這門技術的便利性,往往都讓在場人士感到相當興奮,但是他不時聽到許多人反應:「用Docker部署像是上太空,但是回到自己的工作職場時,工作手法仍然感覺像在殺豬公。」

為何相比利用Docker,傳統手動部署方式會讓開發者感受如此落差?葉秉哲表示,由於許多公司目前的IT架構仍仰賴傳統應用程式的設計方法,過多的老舊包袱,導致企業沒辦法導入Docker、微服務架構,甚至是無伺服器技術。

而追根究柢,葉秉哲歸納出這些傳統應用程式往往存在三大弊病,即使雲端技術已經發展10年有餘,這些企業仍只能望洋興嘆,始終無法踏入這道門。第一項弊病是,這些應用程式自動化程度不足,仰賴過多手動程序部署,雖然可以在小規模叢集上順利運作,「但離上雲端還有一大段路。」

其次,老舊應用程式過度脆弱,可能肇因過去的設計沒有納入容錯度或N+1備援設計等,「導致軟體架構非常脆弱,只要部分元件失靈,整個系統就會無法運作。」最後一項常見問題則是應用程式與底層架構的相依性過高,導致搬遷上雲端的工作相當不易。

葉秉哲直言,如此架構的應用程式,如果搬遷上雲端,只會讓缺點更加倍放大,雲端環境自動水平擴充的功能,讓原本只出現在一臺伺服器上的程式臭蟲,蔓延到更多主機上。

軟體要上雲端先搞定自動化

軟體如果想要上雲端,免不了的第一優先任務,就是先讓IT架構更加自動化。開發過程高度依賴手動作業的企業,常得靠開發團隊有自己獨特的一套解決方法,但葉秉哲表示,假設應用程式每次改版,都必須仰賴工程師手動測試、部署,「容易發生低級錯誤。」

像是在現代軟體開發中,每個開發者理應熟悉版本控制系統,但他曾與一些開發者分享敏捷開發失敗經驗時,葉秉哲才發覺,原來臺灣某些公司的軟體開發流程竟然還沒有導入版本控制系統。

因此葉秉哲認為,導入自動化的第一步,就是使用版本控制系統。他解釋,利用版本控制系統,才能夠統一管理企業內部運作的軟體,也讓散落在各處的系統元件進行集中管理,「如果開發者自己留了一些系統元件在個人電腦、桌電,都是非常危險的舉動。」

不只程式碼要納入版本控制系統,在現在軟體開發過程中,開發者多半也會引用不同的函式庫,但是Java、Ruby或Python等不同的程式語言,都有自家的套件管理系統,葉秉哲建議,這些軟體應該也要一併列入版本控制系統,「套件管理系統的版本也要管理,未來追溯問題才會更容易。」

在程式碼管理完成自動化後,下一個重點就是部署流程自動化。引入部署自動化時,「一定可以發現某些隱藏的系統元件,沒有納入集中管理」,葉秉哲表示,這也是企業沒辦法提高自動化程度的一部分原因。他認為,當程式碼提交至版本控制系統後,「後續的編譯、QA流程,或是部署到正式環境,都要設法自動化。」在實作上可用傳統腳本程式自動部署的作法,或是使用Ansible或Jenkins這類的DevOps工具。

在自動化流程中,葉秉哲提醒,企業也要一併處理每臺電腦的組態設定問題。他舉例,許多開發者在導入版本控制軟體GitLab時,以為只需部署到本地伺服器就能順利運作,但是GitLab是利用Ruby on Rails開發的軟體,必須注意Ruby版本支援度的問題。葉秉哲表示,軟體部署牽扯到許多細節,「如果軟體沒有統一系統組態管理,貿然搬遷到雲端上運作會很危險。」而當自動化流程建置完成後,企業就能讓開發環境與正式環境的組態設定趨於一致,也能避免軟體雖然可在開發端順利運作,但是卻在測試、正式環境中失靈的情況,「這樣企業就拿到上雲端的第一張門票。」他說。

強化軟體結構,單一節點故障照樣運作

而軟體上雲端的第二項重要任務,就是處理軟體脆弱性問題。葉秉哲比喻,受傷流血時,人體會產生新組織取老舊組織,同理,在設計架構時,不該預設系統不會失靈,「即使其中一臺伺服器停止服務,軟體也要能夠正常運作。」

而在軟體開發的實作觀念,就是納入冗餘(Redundancy)的設計理念,降低系統執行對單一伺服器的依賴程度。葉秉哲解釋,也就是要做到,沒有一臺伺服器或軟體元件是系統執行時不可或缺的項目。即使單一節點運作失靈,其餘節點還可以繼續正常運作,並且快速地複製出另一提供同樣服務的節點,為故障基礎架構爭取恢復正常運作的時間。

而冗餘設計的實作技巧中,系統要先具有並行(Concurrency)運算的能力。在開發軟體中,葉秉哲建議,開發者可以加入多執行緒、多程序、協程(Coroutine)或非同步運算,「這樣才滿足冗餘設的先決條件。」

加入無狀態設計

強化軟體結構時,無狀態(Stateless)也是一個設計重點,如此系統才能更方便的增生服務。葉秉哲表示,如果軟體的狀態儲存在記憶體或某臺伺服器中,一旦該設備毀損,無法找尋相關遺留的數據。

但有些軟體元件不易納入無狀態的設計,此時開發者就得從持久儲存的設計著手,「減低軟體與後端儲存系統的相依性」,葉秉哲建議,資料存取層(Data Access Layer,DAL)不應該與軟體綁死,而要獨立抽象化為一個軟體層,未來想要更換解決方案也會更簡單。

像是過去Gogolook是採用Google的公有雲服務,但後來選擇搬遷至AWS,因為當時資料存取層的設計做到獨立且抽象化,才讓搬遷過程變得更順利,「區隔軟體與資料間的相依性,企業的營運彈性就會更大。」

靠監控機制掌握系統健康

此外,企業對於自家系統也要建立監控機制,掌握基礎架構的健康指標,像是CPU、記憶體使用效率、效能表現、IOPS等數據,「如果軟體上雲端卻不知道它的運作狀況,這表示軟體非常脆弱。」葉秉哲表示,Log資訊是企業常忽略的另一個關鍵,在傳統軟體設計中,大多開發者都選擇將Log紀錄儲存在自己的設備上。他表示,如此設計也將導致軟體脆弱化,「一旦設備損壞,開發者也無從追溯故障的原因」,慎重處理Log資訊的儲存也是上雲端的重要功課,他建議,可以搭配Logstash、Fluentd、Flume等系統日誌收集工具,或是選用Datadog等解決方案。

解開軟體與底層基礎架構的耦合

上雲端前置作業的最後一步,就是要降低軟體與底層架構的耦合度。葉秉哲表示,如果兩者相依度過高,企業就很難導入新技術或將系統搬遷至雲端。而企業在導入自動化、統一管理系統組態的同時,也在盤點軟體與底層基礎架構的相依程度,「特別要解開儲存、網路元件與底層的耦合。」

在新型軟體開發的潮流中,許多開發者也會先設計API再進行實作,葉秉哲表示,現在軟體運作的平臺除了PC、Web,還要納入行動端,「API架構設計完後,後續的軟體開發才能分頭進行。」

他表示,良好的API規畫,就可以降低軟體與底層的耦合性,因此也減少上雲端的難度,例如想善用AWS的無伺服器服務Lambda,「應用程式有一個好的API架構是先決條件」,這樣公有雲服務只需要呼叫企業內部的API,就可以執行運算。

前置作業雖困難但仍然要做

在雲端時代,現在除了私有雲、混合雲,許多廠商也開始導入跨雲架構,同步使用不同的公有雲服務。而企業想要享受雲端的好處,也得要做好上雲的前置作業,葉秉哲表示,部署自動化大約1至2個月就能完成,而反脆弱化則需要更多時間,「雖是苦功但仍然得做,否則企業會失去軟體開發的競爭力。」


Advertisement

更多 iThome相關內容