1. 程式人生 > >如何將一個應用改造為Azure雲服務

如何將一個應用改造為Azure雲服務

雲服務是Azure上最重要的PaaS服務之一。相比於使用IaaS虛擬機器,使用雲服務會帶來如下好處:

  • 單點發布應用
  • 與開發工具無縫整合,一鍵釋出應用
  • 應用自動部署
  • 分鐘級實現系統規模擴容、收縮
  • 按照策略進行彈性伸縮(自2013年6月29日起
  • 靈活切換生產、過渡環境
  • 自動收集效能資料和診斷資訊
  • 無需對OS及補丁進行管理

將一個普通Web應用釋出為雲服務也相當的簡單。Azure為.NET/PHP/Java/Node.js/Python這些語言提供了開發環境整合,或者是釋出工具。如果應用是採用這些語言開發的,而且可以執行在Windows Server上,那麼基本上就可以以雲服務的形式釋出。為了讓應用更好的執行,在應用釋出之前,需要經過一些改造,這種改造的程度,取決於應用的架構和部署方式。

改造工作的目的,是讓雲服務符合網際網路應用開發的最佳實踐,即:無狀態、多例項併發、自動化管理:

  • 無狀態的含義,是計算節點的無狀態。狀態資訊(包括業務資料)全部儲存在獨立的儲存服務上:SQL資料庫、Blob、Table等。這樣的好處,是計算和儲存分離,可以獨立擴充套件,同時也解決了資料分散在不同節點上這一弊端。計算節點無狀態後,Azure可以快速增加或減少計算節點數量而不會影響應用執行,而單一計算節點的故障也不會影響系統執行。這種無狀態設計可以同時提高系統可用性和可擴充套件性
  • 多例項併發的含義,是任意一個元件都可以線性水平擴充套件,系統的處理能力不會受到單一一個元件處理能力的限制。那個元件處理能力不夠了,增加其虛擬機器例項數量即可。同時多例項執行可以天然消除單點故障,提供系統可用性
  • 部署過叢集的人都會明白管理一堆機器是多麼麻煩。多例項解決了系統擴充套件性的問題,但帶來了管理的難題。對於大規模分散式系統來講,理想的管理方式是自動化管理。

如果我們把Azure看成一個雲OS,那麼每個處理請求的虛擬機器就是一個“CPU”,Azure各種儲存服務就是“硬碟”,連線各種節點的網路就是“匯流排”,雲服務的部署過程就是這個雲OS載入應用的過程。使用者不需要關注應用是如何載入到每個“CPU”上的,只需要按照Azure的格式準備釋出包,剩下的釋出過程都是自動完成的。在雲OS下,“CPU”數量(虛擬機器例項數)是動態可調的,“CPU”可以動態更換,一個應用可以在多個“CPU”上併發執行

下圖是一個Azure雲服務的典型部署架構。圖中的Web節點和Worker節點數可以靈活調整,而所有狀態資訊和資料都在計算節點之外。Web和Worker節點之間的通訊,也是通過儲存(比如Queue)來中轉。


對於一個應用來說,跟狀態和多例項相關的功能主要包括檔案、快取、session等。下面這張表,描述了不同情況下應用需要進行的改造:

場景
改造方式

說明

工作量
1.應用會向Windows檔案系統讀取、寫入檔案
1.1. 讀取、寫入配置檔案 改造配置讀寫模組,將配置資訊放在雲服務的cscfg檔案中,或是資料庫中,或是Blob儲存的檔案上 這樣的做的好處是,可以在執行時從單點修改配置,而且配置可以實時生效。否則,配置檔案只能通過重新發布應用生效
1.3. 讀取、寫入資料檔案 改造檔案讀寫模組,將資料檔案儲存在Blob儲存上 如果不改造,會造成寫入的檔案丟失
1.4. 寫入日誌 .NET可使用System.Diagnostics.Trace進行日誌收集 這樣可以藉助Azure的診斷模組自動將日誌收集到一個Table儲存裡
2.應用的某一元件只允許一個例項 利用Queue-Worker模式,將該元件改造為多例項併發執行。每個Role至少可執行2個例項 不改造的話會影響應用可用性,並且限制應用的可擴充套件性
3. Azure部署包準備 配置csdef,定義Web/Worker Role
配置cscfg,填入配置資訊
最終應用的所有功能都將歸入兩類例項:Web Role和Worker Role。前者用來執行即時請求,後者處理非即時請求
3.1 應用提供Web、REST等即時服務,執行在IIS上 增加一個或多個Web Role。每個Role提供一種服務
3.2.應用的某些功能不是由Web驅動,而是定期執行或者非同步執行,如批處理、Windows服務 增加一個或多個Worker Role,並定義其Run和OnStart方法。每個Role的多個例項可以均勻的獲得任務,任務執行失敗可以被其他例項繼續執行。對於長時間執行的任務,最好支援斷點恢復 Worker Role也要做成無狀態的,即任務輸入和輸出都儘量不儲存在計算節點上。建議的方式是:控制指令通過Queue儲存,資料通過資料庫或Blob儲存
4.應用部署依賴
4.1 需要預先安裝某些軟體 在csdef中定義啟動指令碼,進行軟體的自動下載和靜默安裝
4.2 需要修改登錄檔、註冊COM元件 在csdef中定義啟動指令碼,進行系統配置的更改
5. 應用使用了session,session在伺服器端實現,並需要負載均衡支援session affinity 配置session的持久化,使用資料庫、Table或Caching儲存session數
6. 應用使用了Cache 如使用memcache,則將其替換為Azure Caching
如自行管理cache,建議替換為Azure Caching
Azure Caching是類似於memcache的分散式快取
7.應用部署包大小超過10M 將靜態檔案剝離,減小發布包大小。這些靜態檔案包括:圖片、視訊、庫Dll等。剝離的檔案可以打包放在Blob儲存上,然後在雲服務的csdef啟動指令碼中自動下載 減小部署包的好處是加快釋出過程,避免在網路傳輸上的延遲
8.應用使用了記憶體鎖進行執行緒/程序同步 採用分散式鎖,比如Zookeeper/Redis鎖;或者用輪詢的方式去檢測一個單一資源,如某個資料庫欄位、儲存物件或者Cache資料 鎖的應用一般是為了協調多個程序/執行緒的執行。在分散式環境下,這種協調也需要在所有結點間完成

以上這張表,並不是每個應用都會涉及。大部分應用只需要進行Web Role和Worker Role的定義即可


在改造完成後,即可按照不同的語言進行應用的釋出:

  • .NET: https://github.com/WindowsAzure-TrainingKit/HOL-DeployingCloudServices-VS2012/blob/master/HOL.md
  • PHP:http://blog.csdn.net/shaunfang/article/details/8558219
  • Java: http://blog.csdn.net/shaunfang/article/details/8585708
  • Node.js: http://www.windowsazure.com/en-us/develop/nodejs/tutorials/getting-started/
  • Python: http://www.windowsazure.com/en-us/develop/python/tutorials/django-with-visual-studio/