Живой или мертвый, ты пойдешь со мной!
Робокоп
В предыдущем посте мы проговорили о том, как Ажур управляет серваками, что такое фабричный контроллер, и что такое фабрика. Так же мы зацепили немного тему о том как апдейтить код.
Сегодня же давайте поговорим, о железячной части Ажура.
Мы несколько раз говорили про виртуальные машины, и то что фабричный контроллер реплицирует себя на каждую машину. Все виртулки крутятся на Windows Server 2008 Enterprise Edition x64. Всей виртуализацией занимается Hyper-V. Собственно он и занимается тем что постоянно подымает и опускает виртуалки.Так как использование электроенергии очень важный момент, гипервизор смотрит сколько ядер на физическом компьютере используется в данный момент, и пытается заставить определенное количество ядер на полную мощность, другие же в это время кладутся спать:) чтобы использовать как можно меньше электроенергии.
Как происходит подключение новой ноды?
Когда новый сервер добавлен в Ажур — это просто голый сервак, в котором нету НИ-ЧЕ-ГО, только хард. Когда нода добавленна, на него устанавливается Windows PE — это такой себе предустановочный Windows( Micorosft мечтал что эта версия ОС заменит легендарный DOS), единственная цель которой была подготовка компьютера к установки полной операционной системы.
После этого ОС коннектиться к фабричному контроллеру, и начинает установку образ Windows 2008 Core на сервер. После этого образ разварачивается, и у нас получается компьютер с установленным Windows 2008.После этого, фабричные контроллер перегружает виртуалку, и на ней размещаются необходимые виртуалки.
Процессы которые происходят внутри Ажура намного сложнее, и я ,честно признаться, не особо в них разбираюсь. Мне кажется что построение такой инфраструктуры — это шедевр админского искусства, и мне кажется необходим не один гениальный админ для того чтобы разобрать по полочкам из чего состоит Ажур:)
Так как любая виртуальная машина в Ажуре все же является модифицированной версией Windows Server 2008, мы можем собрать данные с информацией об ОС на которой крутится та или иная роль. Давайте напишем небольшуюю программку, которая выведет нам необходимую информацию!
Как уже прежде рассказывалось — создайте проект Azure с одной веб ролью ASP.NET. Откройте файл Default.aspx и в кодбихайнде впишите следующее:
/// <summary> /// /// </summary> public partial class _Default : System.Web.UI.Page { /// <summary> /// Handles the Load event of the Page control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> protected void Page_Load(object sender, EventArgs e) { var computer = new Microsoft.VisualBasic.Devices.Computer(); Response.Write(string.Format("Computer Name:{0}</br>",computer.Name)); Response.Write(string.Format("OS Name:{0}</br>", computer.Info.OSFullName)); Response.Write(string.Format("OS Version:{0}</br>", computer.Info.OSVersion)); Response.Write(string.Format("OS Platform:{0}</br>", computer.Info.OSPlatform)); Response.Write(string.Format("Processor Count:{0}</br>", System.Environment.ProcessorCount.ToString())); Response.Write(string.Format("CLR Version:{0}</br>", System.Environment.Version.ToString())); Response.Write(string.Format("Current Directory:{0}</br>", System.Environment.Version.ToString())); Response.Write(string.Format("Time since last restart:{0}</br>", GetTimeSinceLastRestart())); Response.Write(string.Format("Domain Name:{0}</br>", System.Environment.UserDomainName)); Response.Write(string.Format("User Name:{0}</br>", System.Environment.UserName)); Response.Write(string.Format("CPU Name:{0}</br>", GetCPUName())); Response.Write(string.Format("Architecture:{0}</br>", GetArchitecture())); } /// <summary> /// Gets the current directory. /// </summary> /// <returns></returns> private string GetCurrentDirectory() { try { return System.Environment.CurrentDirectory; } catch { return "unavailable"; } } /// <summary> /// Gets the time since last restart. /// </summary> /// <returns></returns> private string GetTimeSinceLastRestart() { try { TimeSpan time = new TimeSpan(0, 0, 0, 0, System.Environment.TickCount); return time.ToString(); } catch { return "unavailable"; } } /// <summary> /// Gets the name of the CPU. /// </summary> /// <returns></returns> private string GetCPUName() { try { using (ManagementObject Mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'")) { return (string)(Mo["Name"]); } } catch { return "unavailable"; } } /// <summary> /// Gets the architecture. /// </summary> /// <returns></returns> private string GetArchitecture() { try { using (ManagementObject Mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'")) { ushort result = (ushort)(Mo["Architecture"]); switch (result) { case 0: return "x86"; case 9: return "x64"; default: return "other"; } } } catch { return "unavailable"; } } }
В результате Вы должны видеть что-то вроде этого:
Computer Name: XXX
OS Name: XXX
OS Version:6.1.7600.0
OS Platform:Win32NT
Processor Count:4
CLR Version:4.0.30319.1
Current Directory:4.0.30319.1
Time since last restart:3.05:28:43.1420000
Domain Name:WORKGROUP
User Name:XXX
CPU Name:Intel(R) Core(TM) i5 CPU 661 @ 3.33GHz
Architecture:x64
Сосбтвенно, тот же подход можна использовать для того чтобы получить список всех процессов которые в данные момент крутяться на машине с Вашей веб ролью. Давайте изменим код нашей страницы:
public partial class _Default : System.Web.UI.Page { /// <summary> /// Handles the Load event of the Page control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> protected void Page_Load(object sender, EventArgs e) { var processes = Process.GetProcesses(); foreach (var process in processes) { Response.Write(string.Format("ID:{0}, Name:{1}</br>",process.Id, process.ProcessName)); } } }
В результате получим, нечто вроде:
ID:4332, Name:w3wp
ID:588, Name:services
ID:6108, Name:OSE
ID:376, Name:conhost
ID:388, Name:svchost
ID:3144, Name:svchost
ID:2280, Name:cvpnd
ID:5700, Name:conhost
ID:1956, Name:taskhost
ID:5904, Name:DiagnosticsAgent
ID:4316, Name:AdobeARM
ID:5520, Name:chrome
ID:768, Name:svchost
ID:1552, Name:explorer
ID:368, Name:smss
ID:2140, Name:AsSysCtrlService
ID:4304, Name:conhost
ID:1688, Name:svchost
ID:3512, Name:vmnetdhcp
ID:7648, Name:chrome
ID:4968, Name:conhost
…
Если вы запускаете аппликацию локально — Вы увидите метрики именно Вашего компьютера — но если Вы загрузите эту аппликацию на Ажур, увидите значения для машини на которой раскрутилась Ваша роль.
Вот где-то так вся эта радость и работает:)
Информация в основном взята с книги «Azure in Action.».
Полезные ссылки:
http://ru.wikipedia.org/wiki/Microsoft_Hyper-V — что такое Hyper-V и с чем его едят.
http://ru.wikipedia.org/wiki/Windows_Preinstallation_Environment — очень удивился когда узнал про существование данной ОС, потому советую почитать. Достаточно познавательно.
http://itknowledgeexchange.techtarget.com/cloud-computing/how-azure-actually-works-courtesy-of-mark-russinovich/ — как работает Windows Azure by Mark Russinovich.
http://ru.wikipedia.org/wiki/VHD_(%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82_%D1%84%D0%B0%D0%B9%D0%BB%D0%B0) — именно в этом формате лежат все виртуалки на Azure
http://msdn.microsoft.com/en-us/library/ee924680.aspx — описание всех релизов Azure OS. Будет интересным для прочтения разного рода системным администраторам, ибо также включает в себя описание заплаток которые предустановлены на систему.
http://msdn.microsoft.com/en-us/library/gg433107.aspx — достаточно интересная стать о фичи в CTP которой даже небыло:) Надеюсь что у меня дойдут руки и до нее, чтобы напсать че за зверь и с чем его едят. Пока данная фича находится в бете.
http://msdn.microsoft.com/en-us/library/gg433048.aspx — сбор диагностики в Windows Azure.
Уведомление: Некоторые интересные ссылки (Март) | Александр Богатырев: сфера
Уведомление: ??????????? ????????? ?? ????????? ? ???????? Microsoft ?? ??????? ????? – ?????? 2011 - MSDN Blogs
Уведомление: Технические материалы по продуктам и решениям Microsoft на русском языке – апрель 2011 | Alexander Knyazev: блог
Уведомление: Ежемесячный дайджест технических материалов. | Тверской MCP-Клуб