Microsoft Azure 的正體中文官方消息,以及在台灣的案例研究。
原文發表於 Azure HDInsight previewing HBase clusters as a NoSQL database on Azure Blobs
2014 年 6 月 3 日,Azure HDInsight 公開了一項更新消息,Azure HDInsight 將支援 Hadoop 2.4,並提升查詢資料的效能 100 倍。而今天,我們宣佈在 HDInsight 產品中,開始預覽 Apache HBase 叢集(cluster)。
HBase 是一個低延遲的 NoSQL 資料庫,適合用來做大數據的線上交易處理(OLTP, online transactional processing)。我們在 Azure 中提供 HBase 叢集,而叢集的資料直接儲存於 Azure Blob 之中,如此一來便能在成本及效能的考量上,取得最大的存取效能以及擴充彈性。這個產品讓我們的客戶能擁有一個大型資料庫來建立高互動性的網站、或是儲存從百萬個感測器回傳的遙測資料等等,並且能在 Hadoop 中分析這些資料。
由於目前 Azure HDInsight 上的 HBase 還在預覽階段,所以操作上需要利用 PowerShell。
PS C:\> $creds = Get-Credential
PS C:\> New-AzureHDInsightCluster -Name yourclustername -ClusterType HBase -Version 3.0 -Location "West US" -DefaultStorageAccountName yourstorageaccount.blob.core.windows.net -DefaultStorageAccountKey "yourstorageaccountkey" -DefaultStorageContainerName hbasecontainername -Credential $creds -ClusterSizeInNodes 4
應用程式開發人員可以透過 REST APIs 、HBase shell 或是不同的 map/reduce 工具如 Hive 及 Pig 來存取 HBase 的資料,HBase shell 提供了一個互動式的主控台(console)讓您可以管理 HBase 叢集、建立或刪除資料表(table)、以及操作資料。
cd %HBASE_HOME%\bin hbase shell
create ‘sampletable’, ‘cf1′put ‘sampletable’, ‘row1′, ‘cf1:col1′, ‘value1′scan ‘sampletable’
如果您想瞭解更多關於 Azure HDInsight 上的 HBase,下面是一些參考資料:
原始文章發佈於 MVC movie app with Azure Redis Cache in 15 minutes。
最近公開預覽的 Azure Redis Cache 很容易就能整合進您的 Azure 網站應用程式中,這裡我將 MVC Movie 範例程式整合 Azure Redis Cache 然後部署到 Azure 網站服務(Websites)上,大約只花了 15 分鐘左右。
在導入快取(cache)之後,程式的速度比起純用資料庫來說快了將近 100 倍,因為經常被存取的資料就可以直接從快取中取得,而不必再到資料庫中撈資料,如此一來你也可以降低資料庫的存取次數,讓資料查詢的動作變得更迅速。
整合完畢的範例程式碼可以在這裡下載。
接下來我會說明我是如何把 Azure Redis Cache 整合進我的 ASP.NET MVC Movie 範例之中。
<yourName>.redis.cache.windows.net
public class MoviesController : Controller { private MovieDBContext db = newMovieDBContext(); private static ConnectionMultiplexer connection; private static ConnectionMultiplexer Connection { get { if (connection == null || !connection.IsConnected) { connection = ConnectionMultiplexer.Connect( ".redis.cache.windows.net,ssl=true," + "password="); } return connection; } }
注意:一般來說都不建議你把帳號密碼的資料直接寫在程式碼中,這裡只是為了方便瞭解程式碼才這麼做。請參考 Windows Azure Web Sites: How Application Strings and Connection Strings Work 這篇文章介紹的方法來處理帳號密碼這些敏感資料。
在上述的程式碼中,我已經將連結快取服務的部份用靜態成員的方式儲存,所以你不必在每一次 request 都重新建立一個快取服務的連結,你只需要在使用時檢查連結是否還在,若已經失去連結再重新建立連結就好。
新增一個類別,並包含這個 SampleStackExchangeRedisExtension 類別:
public static class SampleStackExchangeRedisExtensions { public static T Get<T>(this IDatabase cache, string key) { return Deserialize<T>(cache.StringGet(key)); } public static object Get(this IDatabase cache, string key) { return Deserialize<object>(cache.StringGet(key)); } public static void Set(this IDatabase cache, string key, object value) { cache.StringSet(key, Serialize(value)); } static byte[] Serialize(object o) { if (o == null) { return null; } BinaryFormatter binaryFormatter = new BinaryFormatter(); using (MemoryStream memoryStream = new MemoryStream()) { binaryFormatter.Serialize(memoryStream, o); byte[] objectDataAsStream = memoryStream.ToArray(); return objectDataAsStream; } } static T Deserialize<T>(byte[] stream) { BinaryFormatter binaryFormatter = new BinaryFormatter(); if (stream == null) return default(T); using (MemoryStream memoryStream = new MemoryStream(stream)) { T result = (T)binaryFormatter.Deserialize(memoryStream); return result; } } }
SampleStackExchangeRedisExtensions 類別可以讓你很輕易就將任何可序列化(serializable)的類別做快取。你可以在你的模型(model)上加上 [Serializable] 屬性。
[Serializable] public class Movie
然後將所有 Movie movie = db.Movies.Find(id); 的部份都修改成:
Movie movie = db.Movies.Find(id);
//Movie movie = db.Movies.Find(id); Movie movie = getMovie((int)id);
在 POST 呼叫的 Edit 及 Delete 方法中,記得要清除快取。
Edit
Delete
ClearMovieCache(movie.ID);
在 controller 中加入下面這段程式碼,其中 getMovie 是一個很標準的快取操作:
getMovie
Movie getMovie(int id) { Stopwatch sw = Stopwatch.StartNew(); IDatabase cache = Connection.GetDatabase(); Movie m = (Movie)cache.Get(id.ToString()); if (m == null) { Movie movie = db.Movies.Find(id); cache.Set(id.ToString(), movie); StopWatchMiss(sw); return movie; } StopWatchHit(sw); return m; } private void ClearMovieCache(int p) { IDatabase cache = connection.GetDatabase(); if (cache.KeyExists(p.ToString())) cache.KeyDelete(p.ToString()); } void StopWatchEnd(Stopwatch sw, string msg) { sw.Stop(); double ms = sw.ElapsedTicks / (Stopwatch.Frequency / (1000.0)); ViewBag.cacheMsg = msg + ms.ToString() + ” PID: ” + Process.GetCurrentProcess().Id.ToString(); } void StopWatchMiss(Stopwatch sw) { StopWatchEnd(sw, “Miss – MS:”); } void StopWatchHit(Stopwatch sw) { StopWatchEnd(sw, “Hit – MS:”); }
另外,在 Views\Shared\_Layout.cshtml 檔案中加入 ViewBag.cacheMsg 的程式碼,這是為了在頁面上顯示快取的資訊。
Views\Shared\_Layout.cshtml
<div class="container body-content"> @RenderBody() <hr /> <footer> <h2>@ViewBag.cacheMsg</h2> </footer> </div> @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/bootstrap") @RenderSection("scripts", required: false) </body> </html>
現在你可以在開發環境中測試快取的效果了,不過如果你的資料庫很小,而快取服務又是在雲端,效果可能不會太明顯,部署到 Azure 上應該就可以感受到明顯的差異。
在管理介面中,你可以看到快取服務的 hit/miss 的統計資料:
你可以加上其它的相關資訊來監控,像是自訂時間範圍、被清除的鍵值、過期的鍵值、使用的 CPU 或記憶體等。
當然,你也可以加入警告通知(Add Alert)來幫助你監控快取服務的使用狀況,像是下圖我就加入了一個警告通知,在 15 分鐘內,清除的鍵值過多時,可能要使用更大的快取。
從 Visual Studio 將網站部署到 Azure 是十分容易的,只要在 Web 專案上按右鍵,選擇發行就可以了,再次提醒,網站服務跟快取服務一定要在同一個資料中心,否則網路傳輸的延遲會拖垮快取的效能。而在發行時別忘了勾選 Execute Code First Migrations。
部署完成後,你就可以試試看有沒有快取的效能是不是有明顯的差異。
預設的快取操作時間是 1000ms (1秒),你可以試著用下面這段程式碼,將 time out (強制清除快取)改成更長或更短的時間,測試你的快取服務是否正常。當 #define NotTestingTimeOut 這段程式碼被註解掉時,timeout 便會被設定為 150ms,讓快取在很短的時間被清掉。
#else #region StressTest private static ConnectionMultiplexer Connection { get { if (connection != null && connection.IsConnected) { return connection; } var config = new ConfigurationOptions(); config.EndPoints.Add(Keys.URL); config.Password = Keys.passwd; config.Ssl = true; config.SyncTimeout = 150; connection = ConnectionMultiplexer.Connect(config); return connection; } } #endregion #endif
在壓力測試時,最好將 session 快取關閉,簡單的作法是到 web.config 檔案中把整個應用程式的 session 快取關閉。
<sessionState mode="Off" />
或是在你的 controller 中使用 [SessionState(SessionStateBehavior.Disabled)] 來做。以下這個更新後的 getMovie 方法可以運作得更穩定,因為當 time out 例外發生時會重試 3 次。
Movie getMovie(int id, int retryAttempts = 0) { IDatabase cache = Connection.GetDatabase(); if (retryAttempts > 3) { string error = "getMovie timeout with " + retryAttempts.ToString() + " retry attempts. Movie ID = " + id.ToString(); Logger(error); ViewBag.cacheMsg = error + " Fetch from DB"; // Cache unavailable, get data from DB return db.Movies.Find(id); } Stopwatch sw = Stopwatch.StartNew(); Movie m; try { m = (Movie)cache.Get(id.ToString()); } catch (TimeoutException tx) { Logger("getMovie fail, ID = " + id.ToString(), tx); return getMovie(id, ++retryAttempts); } if (m == null) { Movie movie = db.Movies.Find(id); cache.Set(id.ToString(), movie); StopWatchMiss(sw); return movie; } StopWatchHit(sw); return m; }
這個範例程式中還有很多方法可以測試快取服務。
像 WriteCache 或 ReadCache 方法會預設寫入或讀取 1,000 筆資料,你可以在 URL 後加上 "/n" 讓它們變成讀寫 n * 1000 筆的資料,像上圖的例子 http://<your site>.azurewebsites.net/Movies/ReadCache/3 就會讀取 3,000 筆快取的資料。
在這個 150ms timeout 的環境下,我的程式就會很容易碰到 timeout 的狀況而去存取資料庫,這是因為我的程式有正確處理這個 timeout 的例外才能順利去讀取資料庫。所以建議您上線的應用程式也要能處理好這個例外,因為根據雲端平台的服務水準,如果您選擇的是基本方案,那一個月中可能會有幾分鐘無法存取(比如正在更新 VM),除非選擇了標準方案,並且建立好 master-slave 的架構備援,不過還是建議您在程式碼中預先處理這個可能發生的例外狀況。
ASP.NET 預設的 In-memory Session State Provider 無法同時被多個網站實體使用,而 SQL Server session state 雖然可以同時讓不同的網站使用相同的 session state,但這會受限於資料庫查詢的延遲時間,進而影響效能。而 Redis session state cache provider 則是另一個選擇,如果你的網站只會用到不是很大的 session state,則可以利用 Redis Cache 來快取這些 session state data。
您可以參考這篇文章,在你的網站應用程式中加入 RedisSessionStateProvider,然後修改 Web.config 檔案來設定 Redis Cache 服務:
<system.web> <customErrors mode="Off" /> <!--<sessionState mode="Off" />--> <authentication mode="None" /> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> <sessionState mode="Custom" customProvider="RedisSessionProvider"> <add name="RedisSessionProvider" type="Microsoft.Web.Redis.RedisSessionStateProvider" port="6380" host="movie2.redis.cache.windows.net" accessKey="m7PNV60CrvKpLqMUxosC3dSe6kx9nQ6jP5del8TmADk=" ssl="true" /> <!--<add name="MySessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider" host="127.0.0.1" accessKey="" ssl="false" />--> </providers> </sessionState> </system.web> <system.webServer>
如此一來你就可以在你的網站應用程式中使用 Redis Cache 來處理 session state。在範例程式中也提供了測試的方法,你可以透過 http://<your site>.azurewebsites.net/SessionTest/WriteSession/Hello_joe 來存取,如此便會將 "Hello_joe" 寫入 session state,你可以試著增加網站服務實體,看看這個 session state 是否會在多個實體間共用。
如果你對於 Redis Cache 有任何問題,可以在 twitter 上跟隨 @RickAndMSFT 並且向他發問。
原文發表於 Microsoft Continues Global Expansion of Cloud Services
在今年稍早的 //BUILD/ 2014 以及北美 TechEd 2014 大會上,我們宣佈了今年會持續拓展我們的雲端服務,帶領我們的客戶前往「雲端優先」的世界,所以我們提供了一些 Microsoft Azure 的更新、線上服務,以及增加資料中心,我們期望能夠幫助我們的客戶,不論是建立新的應用程式,還是基於現有機房架構的投資,都能利用這個世界級雲端平台的威力。而我們最近的更新有下面幾點:
在前些日子,我們已經在 Microsoft Azure 上公開預覽了巴西南部的資料中心,而現在,巴西南部的資料中心已經正式營運,這使得 Microsoft Azure 的用戶可以運用這個資料中心,提供給南美洲用戶有更快的網路傳輸效能,當然,巴西南部的這座資料中心與微軟在全球其它地方的資料中心有一樣的服務品質。
總計今年到目前為止,Microsoft Azure 陸續正式營運了在日本、中國到巴西的資料中心,顯示了 Microsoft Azure 全球佈局的承諾,持續為全球的用戶提供世界級、符合企業標準的雲端平台服務。關於巴西資料中心的正式營運公告,可以參考微軟官方部落格的這篇文章。
除了新的資料中心正式營運之外,我們最近也在 Microsoft Azure 的 IaaS 及 PaaS 上有一些更新:
上週 Gartner 出了一份針對雲端平台業者做的 Magic Quadrant 報告,這份報告將 Microsoft Azure 定位在 Cloud IaaS 中的 Leader Quadrant (領導者象限),Gartner 將 cloud compute IaaS 定義為提供虛擬資料中心、儲存體、以及網路資源服務,所以這項肯定也一併地肯定了我們所提供的應用程式平台即服務 (aPaaS) 是一個領導者服務。Microsoft Azure 是唯一一家雲端平台業者,同時在 IaaS 及 PaaS 服務上得到 Gartner 的領導者肯定,這也鞭策我們要持續加強雲端平台服務,讓我們的客戶能更容易地在 Azure 上建立系統或平台服務。
最後,我們建議您可以參考世界上其它的企業是如何成功地運用 Microsoft Azure 來建立他們的服務。來自澳洲的 Kordia 目前正在 Azure 上使用他們用 SAP 建立的核心業務;而韓國的 SK Telecom 也正在運用 Azure 建立新的商業機會。
如果您已經在使用 Azure 的服務,我們感謝您的支持,並希望您能持續提供給我們寶貴的建議;若您還沒開始使用 Azure,我們建議您可以立即開始瞭解 Azure 如何幫助您及您的事業迅速地走入雲端世界。
原文發佈於 Understanding Azure Limits and Increases。
最近 Azure 團隊發佈了一篇新文章「Azure Subscription and Service Limits, Quotas, and Constraints」。如果您目前有使用 Azure,或許你已經遇到一些預設的限制。例如,每個訂閱預設最多僅能使用 20 個核心。在 Azure 管理界面中,查詢核心的使用量,可能會如下圖所示:
但是,這是能夠透過客戶支援服務來增加最多能使用的核心數(在下一段,您可以看到我們如何從管理界面中發出需求的實際操作)。如果您在設計一個需要 75 個核心的應用程式,您可能會好奇 Azure 是否支援。但您可以在限制額度這一頁中有提到 Azure 最大可以支援到10,000 個核心!
核心的限制額度只是 Azure 眾多運算資源的一個例子而已,不同的應用程式在 Azure 上需要的儲存空間和服務吞吐量也會有所不同。或者,大規模的 IaaS 解決方案,可能需要限制可以在單一虛擬網路的虛擬機器的數量。在 Azure Subscription and Service Limits, Quotas, and Constraints 這篇文章中,有詳細說明各種限制的預設值與最大值。您應該要參照這些限制來規劃程式,尤其是大規模的應用程式。
在 Azure 支援常見問題集頁面有線上以及電話的聯絡方式。這篇文章中,您可以看到直接從 Azure 管理界面來提高限額也是很容易的!下面的截圖是由 George Moore, Principal Group Program Manager 所整理出來的步驟。
請密切注意訂閱限額的公告,我們不會同時發布所有 Azure 服務的限制。在不久的將來,我們將增加對其它服務和連接到其它服務的特定資源來做限制。
我們希望聽到您的意見!
如果有其他您想要瞭解的限制、配額,或是 Azure 服務,請在 limits article 底下回應。
我們希望這個參考頁是一個寶貴的資源,我們將努力擴充它,並保持它的準確性。
Microsoft Azure 虛擬機器服務開始營運以來,不少客戶表示希望能在 Microsoft Azure 上使用 Windows 用戶端(如:Windows 7、Windows 8.1 等)的虛擬機器,這樣便能在雲端上建立開發測試的環境,而不必在維護這些測試環境。而 Microsoft Azure 也決定,提供給從 MSDN 訂閱啟用 Azure 的訂閱用戶可以建立 Windows 7 或 Windows 8.1 企業版虛擬機器的選擇,而這個決定也讓用戶在建立虛擬機器時多了:
這些虛擬機器可供選擇,如果您需要這些虛擬機器環境,而且又擁有 MSDN 訂閱,可以從這裡來啟用您的 MSDN 訂閱 Azure 優惠。
現在你可以透過 Azure 的管理後台、Visual Studio + Azure SDK 、Azure 跨平台命令列工具或是 PowerShell 等方法來建立這些新提供的虛擬機器服務:
從 Azure 管理後台建立以 Windows 7 或 Windows 8.1 企業版為基礎的虛擬機器
從 Visual Studio 中新增虛擬機器
在 Azure 上可以建立 Windows Client 的虛擬機器後,各位開發人員或 IT 專家一定會有很多問題,這裡列出幾個常見的問題:
Q: 我可以做 Windows 市集應用程式的開發嗎?
A: 可以,這部份沒有問題的,你可以在建立好的 Windows 8.1 企業版的虛擬機器中安裝開發工具,然後開發 Windows 市集應用程式。
Q: 我可以做 Windows Phone 應用程式的開發嗎?
A: 不,目前還不支援 Windows Phone 應用程式的開發。
Q: 我要怎麼用 Microsoft 帳號遠端桌面連線進虛擬機器呢?
A: 你必須做兩件事:
Q: 什麼樣的 MSDN 訂閱等級能夠使用 Windows Client 的虛擬機器呢?
A: 所有購買 MSDN 開發和測試隨用隨付 訂閱的用戶,以及下列等級的 MSDN 訂閱啟用 Azure 優惠的用戶,都可以使用。
Q: 這些 Windows Client 虛擬機器能上線提供服務嗎?
A: 不行,這些虛擬機器僅授權供開發及測試使用,並不能用來提供服務。
Q: 不是透過 MSDN 訂閱所啟用的 Azure 訂閱帳戶能使用這些虛擬機器嗎?
A: 不能。