2 березня 2011 р.

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.

Немає коментарів:

Дописати коментар