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