Привет, Хабр! Я инженер компании «Миран», которая занимается выдачей в аренду различных серверов, размещением клиентского оборудования в своих дата-центрах и прочими подобными делами.



Меня продолжительное время уговаривали написать обзорную статью о нашей инженерной инфраструктуре и о том, как мы ее мониторим. Статья долго и упорно не хотела появляться на свет, но все же родилась. Поздравьте меня с почином!

Осторожно, много картинок!

1. Введение в ЦОДоведение
2. ТП, ВРУ, PDU
3. Окунись в прохладу ©
4. От клеммного зажима до ПЛК

Введение в ЦОДоведение


Что есть центр обработки данных? Говорим «ЦОД» — представляем себе бескрайние ангары, заполненные бесчисленными рядами стоек с мерно гудящими железками. Железки загадочно перемигиваются разноцветными огоньками из полумрака. С лицевой стороны их обдувает прохладным бризом от промышленных кондиционеров. В холодных зонах можно наотличненько просквозить себе шею и простудиться. Поэтому админы всегда носят свитера.

Нашей компанией построены два отдельно стоящих дата-центра, бесхитростно именуемые «Миран-1» и «Миран-2». Первый представляет собой вполне привычный тип, с одним большим машинным залом и несколькими поменьше этажом выше. Второй ЦОД представляет из себя ангар, в котором на данный момент установлены два мобильных малых ЦОДа, а также строится третий. Мобильные ЦОДы — двухэтажные конструкции-контейнеры, первый этаж которых есть серверный зал со стойками и кондиционерами, он еще именуется серверным блоком, на втором же смонтированы ВРУ, установлены ИБП и различные щиты управления.

Так исторически сложилось, что «Миран-1» не имел единого мониторинга инженерной инфраструктуры (посыпаем голову пеплом) и мы стремимся исправить этот недостаток. Посему речь большей частью пойдет о втором дата-центре.

Все картинки взяты из нашей системы мониторинга!
P.S.: фотографии щитов и их внутренностей тоже наши!

ТП, ВРУ, PDU


В «Миран-2» реализована система гарантированного электроснабжения (СГЭ). Как видно из схемы ниже, в обычных условиях дата-центр питается от двух независимых внешних вводов от ТП; в случае пропадания напряжения на внешних вводах (а такое у нас иногда случается) — питание идет от дизель-генераторной установки ДГУ2, фактически; под будущий задел предусмотрено место  для еще двух.


Общая мнемосхема ввода электропитания «Миран-2»

Идем дальше. ВРУ выполнено двухсекционным с секционным выключателем под управлением АВР1. Контроллер АВР замкнет секционник в случае пропадания напряжения на одном или обоих вводах, в последнем случаем через 15 секунд будет дан сигнал на запуск ДГУ. Все эти неприятности «Модуль-1 и «Модуль-2» переживают на своих внутренних ИБП.


Фото ВРУ «Миран-2». Кликабельно

Основное назначение секций и их автоматов, помимо питания различных вспомогательных щитов освещения, управления вентиляцией и прочего — исполнять роль вводов электропитания для «Модуль-1» и «Модуль-2» (QF1.1-.2 и QF2.1-.2 на схеме, соответственно). Каждый модульный ЦОД имеет внутри себя свое собственное ВРУ.


Мнемосхема главного распределительного щита «Модуль-2»


Фото главного распределительного щита «Модуль-2». Кликабельно


Мнемосхема энергоблока «Модуль-1»


Мнемосхема стоек «Модуль-1»

Большая часть стоек в «Модуль-1» и «Модуль-2» — производителей Rittal и RiT. Из PDU используем: в «Модуль-1» — сборную солянку из Eurolan, APC, DELTA. «Модуль-2» — целиком на PDU фирмы RiT.

Окунись в прохладу ©


Все клиентское железо, а также инженерная инфраструктура в процессе своей работы выделяют много тепла. Это тепло необходимо отводить, иначе железо быстро умрет. Отводом у нас занимаются шесть инверторных фреоновых кондиционеров фирмы Daikin. Вся их деятельность гордо называется «фреоновым режимом», который обеспечивает сухой тропический прохладный климат от +15 до +23 С° в холодном коридоре. Данная система охлаждения применяется и в «Модуле-1», и в «Модуле-2».

Также в «Модуле-1» существует еще один режим охлаждения, «режим фрикулинга». Его должны обеспечивать четыре приточных установки и дюжина вытяжек. В теории. К сожалению, на практике отвод тепла таким образом был не слишком эффективным, если внутри было задействовано чуть больше половины стоек. Поэтому данный режим для первого модульного ЦОДа так и не используется, оставаясь, по сути, резервным.


Мнемосхема серверного блока «Модуль-1»


Мнемосхема серверного блока «Модуль-2». Никаких приточек, только хардкор! фреон!

От клеммного зажима до ПЛК


Опросом и агрегацией информации от всей периферии дата-центра «Миран-2» занимаются три ПЛК: по одному на «Модуль» и один общий. Эти вундержелезки носят имя небезызвестной компании WAGO.

Рассмотрим структуру системы опроса на основе решения для «Модуль-2».


Схема шины ПЛК с модулями, скриншот из WAGO-IO-Check


Фото щита диспетчеризации «Модуль-2». Кликабельно

Как видно из схемы, на шине установлен сам ПЛК серии 750-881, четыре дискретных модуля 750-1405 на 16 каналов каждый и один аналоговый модуль 750-455 на четыре канала. Через дискретные модули ПЛК получает данные о состоянии автоматических выключателей питания («сухие» дополнительные контакты) в обеих секциях ГРЩ, о состоянии автоматов в собственном щите, а также о состоянии вентиляции энергоблока. Посредством аналогового модуля — получает данные от двух датчиков температуры и влажности (4-20 мА) здесь же, внутри энергоблока.

ПЛК также оснащен двумя Ethernet-портами и через них он общается по Modbus TCP/IP с еще несколькими железяками, как то:

  • два вводных автомата фирмы Schneider Electric, от них же получается информация о входных мощностях, напряжениях, токах и прочем;
  • две системы измерения токов фирмы АВВ в тандеме с двумя модулями ввода от фирмы ОВЕН — результатом их совместного труда есть вычисление по-стоечной мощности;
  • контроллеры CAREL и 6 их подопечных — кондиционеры Daikin;
  • и, наконец, младший братик — каплер 750-342 c семью дискретными модулями.  Их задача отслеживать состояние 48 выключателей + 12 резервных в серверном блоке на 24 стойки.


Фото ABB CMS-600 и трансформаторов тока. Кликабельно


Фото ОВЕН МЭ110-220.3М. Кликабельно


Фото ПЛК CAREL. Кликабельно


Фото щита слаботочных систем «Модуль-2». Кликабельно

Отдельно стоит упомянуть ИБП, они опрашиваются непосредственно SCADA, минуя ПЛК, по SNMP-протоколу.



Фото ИБП «Модуль-2». Кликабельно

Вся получаемая информация посредством программы формируется в собственный список Modbus-регистров, которая уже опрашивается SCADA.

Небольшой кусочек из основной программы
(* PLC_A2 *)
%QX256.0 := A2_1QF1;	//присваиваем каждому биту 256го слова
%QX256.1 := A2_1QF2;	//текущее состояние различных автоматов
%QX256.2 := A2_QS1;
%QX256.3 := A2_QS2;
%QX256.4 := A2_3QF1;
%QX256.5 := A2_3QF2;
%QX256.6 := A2_3QF3;
%QX256.7 := A2_3QF4;
%QX256.8 := A2_3QF5;
%QX256.9 := A2_3QF6;
%QX256.10 := A2_3QF7;
%QX256.11 := A2_3QF8;
%QX256.12 := A2_3QF9;
%QX256.13 := A2_3QF10;
%QX256.14 := A2_KM1;
%QX256.15 := A2_KM2;

(* QF1 *)   //вводной автоматический выключатель № 1
%QW332 := QF1_I_L1;    //токи по фазам
%QW333 := QF1_I_L2;
%QW334 := QF1_I_L3;
%QW335 := QF1_U_L12;   //линейные (межфазные) напряжения
%QW336 := QF1_U_L23;
%QW337 := QF1_U_L31;
%QW338 := QF1_U_L1;   //фазные (фаза-нуль) напряжения
%QW339 := QF1_U_L2;
%QW340 := QF1_U_L3;
%QW341 := QF1_P_L1;   //активная мощность по фазам
%QW342 := QF1_P_L2;
%QW343 := QF1_P_L3;
%QW344 := QF1_P_Sum;  //суммарная активная мощность (кВт)
%QW345 := QF1_Q_L1;   //реактивная мощность по фазам
%QW346 := QF1_Q_L2;
%QW347 := QF1_Q_L3;
%QW348 := QF1_Q_Sum;  //суммарная реактивная мощность (квар)
%QW349 := QF1_S_Sum;  //полная мощность (кВА)
%QW350 := QF1_CosF;   //коэффициент мощности


Еще один кусочек из другой подпрограммы

//Это работа кодогенератора CODESYS, в котором есть удобный настройщик связи
//с периферией по Modbus TCP/IP. Эта подпрограмма, в частности, отвечает 
//за получение от ОВЕН МЭ110-220.3М показаний 
//по трем напряжениям фаза-нейтраль

PROGRAM MBCFG_subCMS_1(* generated by config one prg for each slave *)

VAR_OUTPUT
U_L1  :  WORD; (**) 
U_L2  :  WORD; (**) 
U_L3  :  WORD; (**)

/*--- system variables (read only) ----------------------------------------*/
MBCFG_IpAddress    :   STRING(12) := 'XXX.XXX.XXX.XXX';//IP-адрес Slave-устройства
MBCFG_Port         :   UINT := 502;               //Порт, дефолтный
MBCFG_UnitID       :   BYTE := 2;                 //ID Slave-устройства
MBCFG_TimeOut      :   TIME := t#300ms;           //Таймаут на получение ответа
MBCFG_RequestDelay :   TIME := t#1000ms;          //Задержка до следующего опроса
MBCFG_Error        :   MBCFG_eERROR := MBCFG_START_UP;
MBCFG_LastJob      :   MBCFG_typCOM_JOB;
/*-------------------------------------------------------------------------*/
END_VAR

VAR CONSTANT
    zz_VARIABLECOUNT:   INT := 3; (* number of variables  *)
    zz_JOBCOUNT     :   INT := 1; (* number of jobs *)
END_VAR
VAR

/*=== VARIABLE LIST =============*/
zz_VariableList :   ARRAY[1..zz_VARIABLECOUNT] OF MBCFG_typVARIABLE :=
    ( DataType        := MBCFG_TYPE_WORD,  
      ByteOrder       := MBCFG_BYTE_ORDER_0,
      BitSize         := 16,
      ptVar           := 0,
      ReadJobIndex    := 1,
      ReadStartBitNo  := 0,
      WriteJobIndex   := 0,
      WriteStartBitNo := 0 ),
   (  DataType        := MBCFG_TYPE_WORD,
      ByteOrder       := MBCFG_BYTE_ORDER_0,
      BitSize         := 16,
      ptVar           := 0,
      ReadJobIndex    := 1,
      ReadStartBitNo  := 32,
      WriteJobIndex   := 0,
      WriteStartBitNo := 0 ),
   (  DataType        := MBCFG_TYPE_WORD,
      ByteOrder       := MBCFG_BYTE_ORDER_0,
      BitSize         := 16,
      ptVar           := 0,
      ReadJobIndex    := 1,
      ReadStartBitNo  := 64,
      WriteJobIndex   := 0,
      WriteStartBitNo := 0
   );

/*=== JOB LIST ==================*/
zz_JobList     :   ARRAY[1..zz_JOBCOUNT] OF MBCFG_typCOM_JOB :=
   (  Functioncode            := 3, //Номер функции, 0x03, Read Holding Registers
      ReadStartAddress        := 26,//Адрес первого регистра
      ReadQuantity            := 5, //Кол-во регистров, которые следует прочесть
      WriteStartAddress       := 0,
      WriteQuantity           := 0,
      ptReadData              := 0, 
      ptWriteData             := 0
   );

zz_DataField_1_Read       :       ARRAY[1..5] OF WORD;

/*=== MODBUS MASTER ==============*/
zz_MBCFG_MASTER_ETH :       MBCFG_MASTER_TCP;

END_VAR

/*--- for each variable -------------------------*/
   zz_VariableList[1].ptVar := ADR(U_L1);
   zz_VariableList[2].ptVar := ADR(U_L2);
   zz_VariableList[3].ptVar := ADR(U_L3);
/*-----------------------------------------------*/

/*--- for each job -----------------------------------*/
zz_JobList[1].ptReadData   := ADR(zz_DataField_1_Read);
/*----------------------------------------------------*/

/*#### START OF FIXED CODE #####################################*/
zz_MBCFG_MASTER_ETH(	strIpAddress    := MBCFG_IpAddress,
                        uiPort          := MBCFG_Port,
                        bUnitID         := MBCFG_UnitID,
                        tTimeOut        := MBCFG_TimeOut,
                        iVariableCount  := zz_VARIABLECOUNT,
                        ptVariableList  := ADR(zz_VariableList),
                        iJobCount       := zz_JOBCOUNT,
                        ptJobList       := ADR(zz_JobList),
                        tRequestDelay   := MBCFG_RequestDelay,
                        eError          => MBCFG_Error,
                        LastJob         => MBCFG_LastJob
                    );

%QW377 := U_L1;
%QW378 := U_L2;
%QW379 := U_L3;


Продолжение следует

Комментарии (18)


  1. Gatekeeper11
    11.09.2017 14:28

    Достаточно подробно все описали.
    О Чем будет 2-ая часть/статья?


    1. NobleD5 Автор
      11.09.2017 14:37
      +1

      Вторая часть будет о программной составляющей системы. Trace Mode, grafana.


      1. freemanon
        12.09.2017 10:10

        Тоже сделал пару цодов на TraceMode. Любопытно что вы хорошего об этой системе напишите). В вашем проекте SMS-оповещение об авариях есть?


        1. NobleD5 Автор
          12.09.2017 10:24

          О Trace Mode я старался нейтрально отзываться ). Надеюсь по содержимому второй части можно будет хорошенько подискутировать.
          Насчет SMS-оповещений в Trace Mode, делал в стороннем проекте, а вот в системах наших дата-центров — нет, отсутствует необходимая лицензия. Планирую реализовать рассылку SMS на уровне ПЛК, когда приедет недостающее железо.


  1. NAI
    11.09.2017 14:29
    +1

    >Фото щита диспетчеризации «Модуль-2».
    Маркировка кабелей и элементов отсутствует.
    Блоки питания установлены с нарушением инструкции — справа\слева должен быть зазор в 15 мм, сверху\снизу 70 мм. Т.е. нарушено охлаждение — срок службы изделия сокращается =) У моксы кстати тоже должен быть зазор.
    Со стопорам бардак — тут есть, там нет, тут рыбу заворачиваем.
    DIN-рейки на приколоченные к 19" — доставляют… зачем? Есть же нормальные адаптеры на ваших же фото.
    В общем яб заставил проектировщика(монтажника) переделывать.


    1. NobleD5 Автор
      11.09.2017 15:40
      +1

      Да, к сожалению, такие моменты есть.
      По факту, получали модуль от интегратора "как есть" и с точки зрения красоты внутренностей на тот момент не задумывались.
      Насчет охлаждения, три промышленных кондиционера достаточно для полноценного охлаждения такого небольшого пространства.
      По хорошему, конечно же, надо бы привести в порядок. Надеюсь после окончания стройки Модуля-3 этим заняться.


  1. Whiterusof
    11.09.2017 16:25

    А на чем организован АВР-1?


    1. NobleD5 Автор
      11.09.2017 16:30
      +1

      Модульный расширяемый PLC Twido от Schneider Electric. Точное название модели навскидку не вспомню, могу уточнить.


  1. Whiterusof
    11.09.2017 16:49

    Алгоритм предусматривает контроль положения секционного выключателя? В случае пропадания Ввода 1, будет команда на включение секционного QF4. А если он не включился, произойдет ли запитывание секции 2 от городского ввода, а секции 1 от ДГУ2, или Вы используете простой алгоритм?


    1. NobleD5 Автор
      11.09.2017 17:52
      +1

      Используется более простой алгоритм. Пропадание напряжения на любом из городских вводов — пропадание напряжения на вводе ГРЩ модуля и соответственно срабатывание секционника модуля. В обычном случае отработает секционник в главном ГРЩ и модули вернутся в предыдущее нормальное состояние. Если же секционник не отработает — модули так и останутся с одним вводом и замкнутыми секциями. Вводные автоматы модулей расчитаны на полную нагрузку с обоих секций.
      ДГУ же запустится при пропадании напряжения на обоих городских вводах.


  1. yarem
    12.09.2017 13:04

    На рисунке «Мнемосхема стоек «Модуль-1»» указан PUE=1.09 это чей PUE? дата центра или системы охлаждения?


    1. NobleD5 Автор
      12.09.2017 13:08

      Не совсем понял, что вы имеете в виду под PUE системы охлаждения. PUE «Модуль-1» — 1,09. PUE всего дата-центра «Миран-2» приблизительно 1,52.


      1. yarem
        12.09.2017 13:23

        Например у вас АйТи_Нагрузка=2000 кВт, а на охлаждение этих 2000 кВт вы тратите
        520 кВт. т.е получается PUE системы охлаждения= (2000+520)/2000=1,26
        А какие формулы для расчета PUE отдельного модуля вы используете?


        1. NobleD5 Автор
          12.09.2017 14:23

          Нет, мы отдельно не меряем потребление системы охлаждения. Наша формула проста: входная мощность / потребленная полезная мощность. К примеру, 100 кВА / 65 кВА = 1,54 PUE.


  1. Whiterusof
    15.09.2017 15:30

    А какие вводные автоматические выключатели Schneider Electric Вы используете? У них ModBus TCP/IP на борту или через какой-либо преобразователь?


    1. NobleD5 Автор
      15.09.2017 16:44

      Автоматы Compact NSX400F + размыкатели Micrologic 5.3E. Размыкатели подключены к Modbus-модулям TRV00210. В Модуль-2 они опрашиваются ПЛК по Ethernet через Modbus-шлюз. В Модуль-1 — подключены через последовательный модуль 750-652 на шине ПЛК.


      1. Whiterusof
        15.09.2017 16:48

        Спасибо за пояснение, а то я уж начал искать у Шнайдера автоматы с Ethernet`ом на борту )


        1. NobleD5 Автор
          15.09.2017 16:56

          Рад был помочь )