2014-03-07 123 views
8

爲了降低成本,我一直在使用Autoscale在2到1個雲服務實例之間切換。除了時常(不知道模式似乎在這裏),大多數情況下工作起來,放大(1-> 2)的行爲導致實例回收,導致用戶產生服務中斷。Azure Autoscale重新啓動運行實例

假設RoleEntry中沒有什麼特別的事情可以響應拓撲變化,爲什麼要從1-> 2進行縮放會重新啓動已經運行的實例?

其他注意事項:

  • 很顯然,這兩種情況都通過管理門戶看實例 標籤回收。停電也可以通過點擊 公共站點來確認。
  • 它不會一直髮生,但我不知道該模式是什麼。這感覺就像一個實例配置已經運行多天,試圖擴大回收。但是,如果1實例配置只運行了幾個小時,則可以在不中斷的情況下進行擴展和縮減。
  • 第一個實例總是比第二個實例快得多。
+0

你是如何確定兩個實例都回收的? – kwill

+0

@kwill報告管理門戶中的實例選項卡...我可以通過點擊該網站進行確認,發現該網站沒有響應。 – Nariman

回答

1

這一直就是這樣。當您有1個服務器運行並且您轉到2+時,將重新啓動初始服務器。爲了獲得完整的SLA,您需要始終擁有2+服務器。

+0

是的,這應該是答案。微軟甚至警告說,在發佈你的服務之前,在許多虛擬機上沒有1個角色。實際上,您可以設置一個屬性來防止僅部署到一個實例。 –

+0

這個官方文檔的任何鏈接?我認爲有超過1個實例的建議始終是由於確保您有不同的故障域中的實例,以便MS重新啓動Windows更新實例或執行維護時?他們在哪裏說從1個實例擴展到2個實例導致停機? – OffHeGoes

0

您應該能夠控制此行爲。在roleEntrypoint中,您可以捕獲一個事件RoleEnvironmentChanging

的一些代碼,把你的解決方案會看起來像一個貝殼......

RoleEnvironment.Changing += RoleEnvironmentChanging; 

private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e) 
{ 
} 

RoleEnvironment.Changed += RoleEnvironmentChanged; 

private void RoleEnvironmentChanged(object sender, RoleEnvironmentChangedEventArgs e) 
{ 
} 

然後,RoleEnvironmentChanged方法裏面,我們可以檢測到的變化是什麼,告訴Azure的,如果我們要重新啓動或不。

if ((e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange))) 
{ 
    e.Cancel = true; // don't recycle the role 
} 
+0

我相信,如果您有1臺服務器,無論處理Changed事件,它仍然會重新啓動並從LB中抽出。這是基於來自AzureWatch客戶的衆多評論 – Igorek

+0

謝謝伊戈爾,我會盡力在本週末花些時間來驗證。 :) – BrentDaCodeMonkey

+0

我會嘗試把一些細節放在一起,當我有機會,但基本上伊戈爾是正確的。會發生什麼情況是,當第二個實例達到就緒狀態時,第一個實例將從LB旋轉中移出以處理拓撲更改。在這段時間內,如果實例2的w3wp預熱時間很長,則客戶端將超時或有很長時間的運行請求。 – kwill

0

Nariman,請參閱我對布倫特職位的評論,瞭解有關發生的事情的一些信息。你應該可以用下面的代碼解決這個問題:

public class WebRole : RoleEntryPoint 
{ 
    public override bool OnStart() 
    { 
     // For information on handling configuration changes 
     // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357. 
     IPHostEntry ipEntry = Dns.GetHostEntry(Dns.GetHostName()); 
     string ip = null; 
     foreach (IPAddress ipaddress in ipEntry.AddressList) 
     { 
      if (ipaddress.AddressFamily.ToString() == "InterNetwork") 
      { 
       ip = ipaddress.ToString(); 
      } 
     } 

     string urlToPing = "http://" + ip; 
     HttpWebRequest req = HttpWebRequest.Create(urlToPing) as HttpWebRequest; 
     WebResponse resp = req.GetResponse(); 
     return base.OnStart(); 
    } 
} 
+0

這會向自己發出請求以啓動w3wp,因此不需要最終用戶請求?我更希望OnStart不會在這個已經運行的實例上被調用。 – Nariman

+0

此代碼僅在實例2上運行 - 實例1已在運行且不會回收。此代碼在實例2上運行時,將延遲實例2達到就緒狀態,直到w3wp準備就緒。這意味着當實例1暫時從負載平衡器旋轉中移除時,實例2已準備好接收流量。 – kwill

+0

在實例2啓動並處於就緒狀態之前,我看到實例1從LB中移除(拓撲更改事件觸發)。我認爲即使在創建第二臺虛擬機之前,拓撲更改事件也會發生 – Nariman

相關問題