使用Microsoft Azure 讓云遷移變得簡便的5種方法
原創開發者們接受Microsoft Windows Azure的速度異乎尋常的快。因為它是基于Windows 和 .NET的,所以它和開發者們現有的應用程序是高度兼容的,使用Microsoft Windows Azure作為云平臺的話,應用程序可以很輕松地遷移到云中。
通常,一個應用程序要遷移到云中,需要經過兩個關鍵性的階段。第一個階段是盡可能地少做改動,讓它可以“原封不動”地在Microsoft Azure中發揮作用,在這個階段,只改變那些不得不改變的地方就可以了。第二個階段是對這個應用程序的一些組件進行升級,讓你的應用程序可以利用上那些Microsoft Azure提供的獨一無二的能力。
在本文中,我們將會討論一些在完成第一個階段(只要可以在Microsoft Azure中正常工作就可以了)的過程中遇到的問題。大多數的遷移項目都是從“云適應性”分析開始的,這可以幫助你識別出要完成遷移,哪些部分需要做一些額外的工作。當你正在進行第一個階段的時候,搞清楚你的系統架構是至關重要的,同時,你要讓必須要做的代碼變更最小化。如果你使用一個完整的單元測試套件來構建你的系統,那么現在你可以開始歡呼雀躍了。
1,數據遷移
從應用程序的底層開始,我們就不得不面對我們應該把數據存儲到哪里,以及如何存儲的問題。最常見的ASP.NET應用程序使用SQL Server把數據存儲在關系數據模型中。無論你的代碼如何使用這些數據(Entity Framework, nHibernate, ADO.NET等),你都應該關注一下如何把SQL數據庫遷移到SQL Azure中。這樣做的話,可以讓你的應用程序處于“near data”的場景之中,在這種場景中,應用程序可以保持高度的響應性。
一個Microsoft Azure中的應用程序完全可以通過一個內置的SQL Server來連接和使用數據,但是這樣做的話,會創建一個“far data”的場景。在這種場景中,數據訪問的延遲會很大,而且性能也會有所降低。
SQL Azure和SQL Server是高度兼容的,所以遷移起來并不是很困難,對于那些小型數據庫來說,情況更是如此。你必須要留意一下你自己可以使用的SQL Azure數據庫的最大尺寸,目前,這個最大尺寸是50GB。如果你的數據庫比這個尺寸還要大,那么你必須對你的數據進行分割。
有一個叫作SQL Azure Migration Wizard的開源工具可以幫助你完成這個任務,你可以使用它來分析和遷移你的數據。它可以分析你當前的模式,指出和SQL Azure不兼容的地方,然后幫助你修改這些地方。再然后,它可以在后臺使用BCP,把你的數據遷移到云中。你可以在這個頁面中找到這個工具。
長期來看,你可以對你的數據進行分析,判斷出哪些數據從本質上來說是非關系型的,然后把它們遷移到Windows Azure Table storage中。
#p#
2,ASP.NET的Session狀態
許多ASP.NET的Web應用程序使用Session狀態來跟蹤一個用戶使用這個應用程序的行為。這可能是他們的配置信息,一個購物框,或者他們在一個業務流程中的具體位置。Session狀態是一個強大的工具(如果不過度使用的話),它可以讓無狀態的環境具有狀態。
由于許多Web程序都依賴Session狀態,所以它們的負載均衡器都是針對“粘性的session”來配置的。這意味著一旦用戶開始使用你的站點,那么他們總是要回到服務器集群中的同一個服務器中(至少在這個Session期間是這樣的)。這使得把狀態保存在那個特定的Web服務器的某個進程的內存中成為可能。我不是很喜歡這種方法,因為,隨著時間的推移,這種方法會導致負載出現不均衡,而且,當一個服務器出現問題的時候,這會導致可靠性方面的盲點。如果一個服務器掛掉了,那么用戶會和那個服務器一起掛掉。
因為Microsoft Azure中的負載均衡器是非粘性的,所以你可以找到一種方法,讓Session狀態對Azure環境中的每個服務器都可用。謝天謝地,ASP.NET中的Session狀態機制使用的是提供者模式。在這種模式中,你可以更換新的提供程序來改變Session狀態在Web服務器集群中的存儲方式和托管方式。你可以通過部署一個程序集,然后改變web.config中的某些設置的方式來改變你正在使用的提供程序。
ASP.NET帶有三個默認的提供程序。最常見的是進程內內存提供程序,它的行為如上所述。第二個提供程序是一個狀態服務器,這是一個專用的服務器,它可以把狀態保存在它自己的內存中。另外一個提供程序是SQL Server提供程序,它可以把Session狀態存儲到一個SQL Server數據庫中。對于用戶來說,由于每個Web服務器都可以從這個數據庫載入合適的Session,所以,現在用戶可以在整個集群中任意跳轉了。
雖然在Microsoft Azure中,你可以使用SQL Server提供程序,然后把它指向一個SQL Azure數據庫,但是使用基于Windows Azure Storage的提供程序會更好一些。使用這個提供程序,Session中的條目可以放在一個和每個用戶相對應的Azure Table中,或者應用程序中。由于狀態的確切尺寸和形態不可以提前預知,所以真正的狀態會被作為一個文件存儲在一個Azure Blob容器中。
你可以通過查找Windows Azure Platform Training kit來下載這個提供程序。在這個工具包中,有一個叫作AspProviders樣例項目。你可以直接把這個項目添加到你的解決方案中,也可以使用程序集引用的方式,把那個DLL添加到你的項目中。
如果你引用了這個程序集,那么你必須修改你的web.config文件。打開你的配置文件,然后找到<system.web>元素。刪除現有的<sessionState>配置,然后把下面的代碼粘貼上去。當你這么做的時候,記得把你真正的應用程序名寫上去。
<sessionState mode="Custom" customProvider="TableStorageSessionStateProvider">
<providers>
<clear/>
<add name="TableStorageSessionStateProvider"
type= "Microsoft.Samples.ServiceHosting.AspProviders.
TableStorageSessionStateProvider"
applicationName="yourWebAppName"/>
</providers>
</sessionState>
#p#
3,配置
許多Web應用程序都使用web.config來存儲運行時配置。這很方便,而且也很安全(盡管如此,你還是應該養成對敏感的信息進行加密的良好習慣)。我們這樣做的一個優勢是當應用程序正在運行的時候也可以修改配置(盡管這會導致重啟)。
當你把你的Web應用程序部署到Windows Azure中的時候,你的軟件包會作為一個只讀的軟件包部署到你的Web角色實例中。這意味著,你的項目中的所有文件在運行時都不可以被修改,包括web.config文件。這就意味著,如果你想修改web.config文件,你必須重新部署整個應用程序,這可不是一件輕松的事情。
解決這個問題的最好方法是去除這個限制,或者對你的配置進行重構,把它存儲在Microsoft Azure項目的ServiceConfiguration.cscfg文件中。在這個配置文件中的數據在運行時可以被編輯(這也會導致重啟)。
把你的配置遷移到cscfg文件中需要三個步驟。首先,你必須在ServiceDefinition.csdef文件中定義配置元素。如果我們正在遷移一個以“maximum money laundering limit”作為業務規則的配置元素,那么可以這樣來定義:
<CofigurationSettings>
<Setting name="DiagnosticsConnectionString" />
<Setting name="MaxMoneyLaunderingLimit"/>
</ConfigurationSettings>
完成這個任務以后,你可以把這個設置添加到你的ServiceConfiguration.cscfg文件中,如下所示。我們把我們當前的限制設置為100000美金。
<ConfigurationSettings>
<Setting name="DiagnosticsConnectionString" value="UseDevelopmentStorage=true" />
<Setting name="MaxMoneyLaunderingLimit" value="100000"/>
</ConfigurationSettings>
你必須要從頭到尾地查看你的代碼,然后修改你用來讀取配置的那些代碼。但愿你已經把你的應用程序讀取配置的代碼抽象成一個類了,這樣的話,所有讀取配置的代碼都在同一個地方,會更容易修改一些。在這種情況下,你可以這樣修改讀取配置的代碼:
string s = RoleEnvironment.GetConfigurationSettingValue("MaxMoneyLaunderingLimit");
你可以通過門戶站點,手工修改cscfg文件的內容,或者,你也可以使用Service Management API來上傳一個新的配置文件。當你這么做的時候,為了應用新的配置,你的應用程序會被重啟,然后RoleEnvironmentChanging事件會被觸發,提醒你你的配置已經被改變了。
#p#
4,文件系統的使用
許多Web應用程序都會對文件系統進行讀取和寫入。它們對文件系統的使用通常都很簡單,也很直接。這可能是最麻煩的修改了,因為你必須要對代碼進行修改。
為什么在云中這是一個問題?因為運行你的代碼的那個Web服務器是無狀態的,在任何時候,它都可以被銷毀和重新創建。因為是無狀態的,所以在正常情況下,你是無法使用本地磁盤的。
如果你只把文件系統當成一個臨時的存儲空間來使用,例如存儲一個上傳文件,然后讀取它,把它載入到數據庫中,那么使用“本地存儲器”會更合適一些。“本地存儲器”是Microsoft Azure的一個功能,它可以在服務器上給你分配一塊本地磁盤,讓你隨意地使用。你必須在csdef文件中對“本地存儲器”進行配置,然后通過RoleEnvironment對象載入路徑。“本地存儲器”是不穩定的,這意味著無法保證這個存儲器在指定的時間段里一直是可用的。
要配置你需要的本地存儲空間,可以把下面這段代碼添加到你的csdef文件的角色配置中,然后給你請求的空間提供一個名字。你可以請求多個本地存儲器。如果在你的代碼中,你通常要使用好幾個文件夾,那么這會十分方便的。
<LocalResources>
<LocalStorage name="TempUploads" sizeInMB="100" cleanOnRoleRecycle="true"/>
</LocalResources>
在你使用這塊磁盤空間以前,你必須首先讀入分配給你的文件夾的物理路徑。如果你使用這兩行代碼獲取到了這個路徑,那么你用于處理常規文件的代碼就可以正常發揮作用了。
LocalResource localCache = RoleEnvironment.GetLocalResource("TempUploads");
string localCacheRootDirectory = localCache.RootPath;
在遷移直接對文件系統進行讀取和寫入的代碼的過程中,你的第二個選擇是把你的代碼轉換為使用Azure Blob存儲器的代碼。雖然這需要對代碼進行一些修改,但是這種遷移方式可以讓你使用上更加快速的云。
如果在遷移過程中,你可以把代碼修改到這種程度,那么你可以考慮第三個選擇了,那就是使用Microsoft Azure Drive。這是一個被格式化為NTFS驅動器的blob(可以把它看成一個虛擬PC的VHD文件)。這個文件被格式化為一個驅動器,在你的角色實例上,它可以作為一個本地驅動器被載入。一個Azure驅動器可以被掛載到多個服務器實例中,只要它是只讀的就可以了。如果你想對這個驅動器進行寫入操作,那么你只能把它掛載到一個實例中。
這個模型和本地存儲模型十分類似。你可以對掛載的驅動器進行配置,也可以使用一些代碼在運行時判斷物理驅動器名和被掛載的驅動器的路徑。一旦你得到了這個路徑,你的代碼就可以像平常那樣發揮作用了。
對于Windows Azure Drive來說,一個重要的性能提升是確保你可以把一些本地存儲器配置成這個驅動器的緩存。這是通過內置的驅動器API來實現的,在性能上有很大的提升。
#p#
5,在云中的身份標識
許多Web應用程序都通過集成的身份驗證來給內部用戶提供無縫的身份驗證體驗的。當用戶瀏覽你的站點的時候,他們已經登錄到他們的桌面了,他們的Windows身份標識會被傳輸到Web應用程序中。他們是在毫不知情的情況下登錄的。
當服務器不在用戶的域中,也不在同一個網絡中的時候,這個流程就無法發揮作用了。當你把一個應用程序遷移到云中的時候,用戶必須要登錄到這個應用程序才可以使用這個應用程序,這樣的話,他們會十分困惑的。
要把你的內部用戶標識和云聯系起來,最簡單的方法就是使用一種叫作“聯合身份標識”的概念。“聯合身份標識”(Federated Identity)是基于開放標準的,既支持OAuth又支持SAML。使用這些協議你可以把你的應用程序配置成信任來自于你的域中的用戶的身份標識。
要做到這一點,你必須要使用Windows Azure AppFabric ACS服務才可以,這是一個在云中的身份驗證服務。在你的公司中,你還必須要有一個安全標記服務器。大多數公司使用Windows Server Active Directory Federation Services v2。如果配置好了這個服務,那么,當用戶訪問你的站點的時候,他們的身份標識就會通過ACS,從ADFSv2服務器傳輸到你的應用程序中。這可以給用戶提供無縫的登錄體驗,而且,對你的代碼的修改也最少。
如果你已經開始使用ACS和“聯合身份標識”了,那么你可以和一些商業合作伙伴,提供商,以及客戶結成同盟。這可以讓他們更容易地登錄到你的系統中。值得注意的是,只有你希望共享的身份標識才應該被共享(他們是誰,他們屬于哪些組)。真正的憑證不應該被共享(例如密碼或智能卡)。
#p#
總結
Microsoft Azure是基于Windows Server的,SQL Azure是基于SQL Server。這讓Microsoft Azure平臺成為了一個高度兼容的環境。這可以讓應用程序從內部環境遷移到云中的過程變得更加容易。
注意,我說的是更加容易,而不是容易。遷移你的應用程序所花費的時間長短是由架構和你的應用程序的代碼來決定的。在幾個星期中,我已經幫助許多客戶把他們重要的Web應用程序遷移到云中了。當然,遷移結束以后,應該在這個全新的,基于云的系統上進行大量的測試,來確保這個系統可以正常工作。
原文名:5 Ways to Use Microsoft Azure to Ease Cloud Migration 作者:Brian Prince
【本文乃51CTO精選譯文,轉載請標明出處!】
【編輯推薦】
- 微軟公布云計算平臺Azure收費模式細節
- 云計算意在長遠,微軟云計算服務Windows Azure已經啟用
- 技術透析:Windows Azure Platform框架與組成
- 微軟Windows Azure Platform技術解析
- 走近微軟云:SQL Server到Azure數據同步
- 當微軟Azure遭遇亞馬遜EC2:五大關鍵區別
- Windows Azure云計算平臺新增五大功能
- 云計算前途光明 Azure用戶數突破31000