Welcome to Azure. Дела железячные...
Живой или мертвый, ты пойдешь со мной!
Робокоп
В предыдущем посте мы проговорили о том, как Ажур управляет серваками, что такое фабричный контроллер, и что такое фабрика. Так же мы зацепили немного тему о том как апдейтить код.
Сегодня же давайте поговорим, о железячной части Ажура.
Мы несколько раз говорили про виртуальные машины, и то что фабричный контроллер реплицирует себя на каждую машину. Все виртулки крутятся на 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 и в кодбихайнде впишите следующее:
////// /// public partial class _Default : System.Web.UI.Page { ////// Handles the Load event of the Page control. /// /// The source of the event. /// The instance containing the event data. protected void Page_Load(object sender, EventArgs e) { var computer = new Microsoft.VisualBasic.Devices.Computer(); Response.Write(string.Format("Computer Name:{0}",computer.Name)); Response.Write(string.Format("OS Name:{0}", computer.Info.OSFullName)); Response.Write(string.Format("OS Version:{0}", computer.Info.OSVersion)); Response.Write(string.Format("OS Platform:{0}", computer.Info.OSPlatform)); Response.Write(string.Format("Processor Count:{0}", System.Environment.ProcessorCount.ToString())); Response.Write(string.Format("CLR Version:{0}", System.Environment.Version.ToString())); Response.Write(string.Format("Current Directory:{0}", System.Environment.Version.ToString())); Response.Write(string.Format("Time since last restart:{0}", GetTimeSinceLastRestart())); Response.Write(string.Format("Domain Name:{0}", System.Environment.UserDomainName)); Response.Write(string.Format("User Name:{0}", System.Environment.UserName)); Response.Write(string.Format("CPU Name:{0}", GetCPUName())); Response.Write(string.Format("Architecture:{0}", GetArchitecture())); } ////// Gets the current directory. /// ///private string GetCurrentDirectory() { try { return System.Environment.CurrentDirectory; } catch { return "unavailable"; } } /// /// Gets the time since last restart. /// ///private string GetTimeSinceLastRestart() { try { TimeSpan time = new TimeSpan(0, 0, 0, 0, System.Environment.TickCount); return time.ToString(); } catch { return "unavailable"; } } /// /// Gets the name of the CPU. /// ///private string GetCPUName() { try { using (ManagementObject Mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'")) { return (string)(Mo["Name"]); } } catch { return "unavailable"; } } /// /// Gets the architecture. /// ///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 { ////// Handles the Load event of the Page control. /// /// The source of the event. /// Theinstance containing the event data. 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}",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 Украина | Украинское подразделение компании Microsoft. |