Живой или мертвый, ты пойдешь со мной!

Робокоп

В предыдущем посте мы проговорили о том, как Ажур управляет серваками, что такое фабричный контроллер, и что такое фабрика. Так же мы зацепили немного тему о том как апдейтить код.

Сегодня же давайте поговорим, о железячной части Ажура.

Мы несколько раз говорили про виртуальные машины, и то что фабричный контроллер реплицирует себя на каждую машину. Все виртулки крутятся на 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.