Разработка архитектуры системы через сервисно-ресурсную модель

    Хочу предложить немного обсудить тему сервисно-ресурсной модели и спросить о необходимости разработки инструмента для использования сервисно-ресурсной модели в проектировании, разработке и дальнейшей эксплуатации систем.

    Исходная позиция: разрабатываю и эксплуатирую с коллегами онлайн-систему, которая обслуживает сотни клиентов. Наша система работает на нескольких серверах, использует несколько БД, использует очереди сообщений, внешние сервисы для отправки смс и почты. Типичная ситуация? Вполне.

    Что хочу получить?

    Хочу получить более прозрачную систему для охвата всей картины подшефного хозяйства, чтобы видеть узкие места, видеть зависимости одних частей системы от других, знать, что ssh на одном сервере крайне важен для «вон того маленького обработчика», который работает по ночам на другом сервере.

    Зачем? Иногда требуется охватить взглядом все свое подведомственное хозяйство для получения четкой картины, увидеть направления масштабирования и узкие места. В общем, подумать об архитектуре всей системы. Понимаешь, что одни сервисы (БД, очереди сообщений) используются другими (приложения), а эти сервисы в свою очередь используются третьими. Это удобно для архитектора-разработчика при разработке и развитии системы, это удобно для эксплуатанта при эксплуатации системы.

    Почему не ITSM/ITIL? Если глянуть в ITSM/ITIL, то можно там увидеть тему про сервисно-ресурсную модель. Вполне вероятно, что я не совсем компетентен рассуждать о сложностях ITSM/ITIL и внедрении оного в компаниях. Поэтому поправляйте меня, пожалуйста, если я где-то ошибаюсь, здесь и далее.

    ITSM/ITIL
    ITSM (IT Service Management) — подход к управлению и организации ИТ-услуг, направленный на удовлетворение потребностей бизнеса. Управление ИТ-услугами реализуется поставщиками ИТ-услуг путём использования оптимального сочетания людей, процессов и информационных технологий. (ITSM в Википедии)

    ITIL (IT Infrastructure Library) — библиотека, описывающая лучшие из применяемых на практике способов организации работы подразделений или компаний, занимающихся предоставлением услуг в области информационных технологий. (ITIL в Википедии)


    В ITSM/ITIL есть про сервисно-ресурсную модель. Но когда я начинаю читать всю эту кухню и думать о внедрении какого-либо «ентерпрайз» продукта, например: ИнфраМенеджер или ОмниТрекер, то «мой голова вай-вай». (Более того эти продукты целиком мне ни к чему, затраты на их покупку, внедрение и замену используемых в текущий момент будут ого-го, причем большая часть затрат будет не на ПО). Из всего ITSM мне надо немного — только схему зависимостей ресурсов, более того ITSM вроде как должен охватить всю организацию, я же хочу всего лишь использовать на маленьком выделенном участке в узкой области.

    Далее изложу очень упрощенную версию сервисно-ресурсной модели. Почему такое упрощение? Просто пока не испытываю потребности вводить больше сущностей для понимания работы всей своей системы.

    Основы и термины.

    Система — сочетание всего нашего ИТ-хозяйства, которое установлено на наших серверах.

    Сервис — любое приложение, будь-то веб-сервер или БД (далее приложение = сервис)

    Ресурс — предоставляемая возможность сервисом для его использования из-вне сервиса.

    Зависимость — связь сервиса с каким-либо ресурсом иного сервиса.

    Т.е. систему можно представить как совокупность сервисов, часть из которых предоставляет ресурсы, а другая их использует.

    Надо понимать, что зависимость от ресурса — это не равно потоку данных. Т.е. если наше приложение, например, зависит от сервера сообщений, то оно как принимает, так и отправляет сообщения через сервер сообщений.

    Нарисуем простую схему концепта.



    Например, у нас есть два хоста, на одном работает приложение node.js и сервер БД, на другом сервер PowerDNS и сервер БД. Наше приложение на node.js при создании новой учетной записи добавляет соответствующий домен 3-его уровня, занося записи в БД PowerDNS'а.

    Далее можно дополнять и увеличивать количество сервисов и их зависимостей. Принцип понятен.

    Инструменты

    Раньше я подобные схемы рисовал в Gliffy.com. Но сейчас все чаще сталкиваюсь с необходимостью поддерживать эту схему в актуальном состоянии. Но в gliffy связи на схеме — это всего лишь соединение линии и прямоугольника. Поэтому идет поиск инструмента для хранения структуры взаимосвязей и отображения этих связей на схеме.

    Вот пример моей схемы в Gliffy

    Извините, пожалуйста, за качество.

    Deedoo

    Пока идет поиск (а я надеюсь, что вы, уважаемые читатели, в комментариях подскажете мне какие-либо инструменты, возможно, что-то подобное уже было на Хабре, да я не нашел), как прототип мы с коллегой набросали небольшое приложение deedoo. В нем мы храним информацию о хостах, сервисах, их ресурсах и зависимостях, а также строим схему зависимостей. Схема строится с использованием библиотеки Joint.js.

    Проект на гитхабе: github.com/antirek/deedoo Инструкция по установке есть в репозитории. С помощью deedoo нарисована схема с PowerDNS выше.

    Вот, например, как выглядят зависимости node.js приложения в веб-интерфейсе deedoo


    Пока приложение Deedoo кроме рисования зависимостей больше ничего не умеет. Но еще есть идея использовать его как сервер настроек. Ведь если мы знаем, что наше произвольное приложение зависит от некоторых ресурсов, пусть оно их требует для своей работы.

    Написав, что-то вроде config = serverConf('http://config.server.ru').appID('super_key').get(); мы можем получить все необходимые настройки приложения при его запуске. При отсутствии в загруженном конфиге необходимых параметров мы просто не запускаем приложение. Например, при переносе БД на другой хост нам для получения настроек приложением достаточно только перезагрузить, не так ли?

    Что дальше?

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

    Итак, подошли к самому ключевому моменту данной заметки: что делать дальше? Варианты:

    а) таки сделать все серьезно — внедрять ITSM/ITIL, выбрав какой-либо готовый продукт? (возможно есть отличные free & open source решения? описания внедрений в интернете?)

    б) развивать свой велосипед? Т.е. использовать сервис, описывающий все зависимости. А новые разрабатываемые приложения используют загрузку настроек из этого сервиса. ( Мне, в целом, нравится идея любым получения настроек любым приложением с сервера настроек, добавить группы, типы — и вообще получится здравая система, имхо. Более того получение настроек свяжет эти декларированные зависимости в deedoo с реальными приложениями, которые работают на серверах. Но может это как-то стоит делать иначе? Может быть есть уже подобные системы? )

    в) иное?

    В общем, все получилось немного сумбурно и смешанно, т.к. здесь есть и про разработку онлайн-системы и ее же эксплуатацию. Плюс некоторый бардак в терминологии. Поделился своими мыслями и наработками, надеюсь на конструктивную обратную связь сообщества по вопросам заметки.

    Upd.

    Вопросы инфраструктуры волнуют не только меня. Из интересных проектов могу отметить terraform.io (в связке с consul.io) и weave.works.
    Share post

    Comments 19

      +1
      Но в gliffy связи на схеме — это всего лишь соединение линии и прямоугольника. Поэтому идет поиск инструмента для хранения структуры взаимосвязей и отображения этих связей на схеме.

      www.yworks.com/en/products/yfiles/yed
        0
        Написано, что можно импортировать данные из Excel со связями. Попробую, спасибо.
        +1
        Столкнулся с подобной проблемой, только я бы хотел увидеть инструмент, реализующий также некоторую логику. Например, хранить некий «вес» квадритика и в соответствии с определенными правилами вычислять этот «вес» для зависимых квадратиков. Так мы можем оценить критичность того или иного квадратика. Или, например, посчитать его стоимость
        Перепробовал множество инструментов и так ничего и не нашел тоже. Пробую использовать Flying Logic Pro, но оно умеет только красиво распологать квадратики — не более.
          0
          Алексей, ожидал вашего комментария: ) Серьезно, при поиске по Хабру по сервисно-ресурсной модели ваш комментарий один из первых.

          Flying Logic Pro поставлю посмотреть, там даже версия для linux есть — отлично (у большинства софта под тему ITSM только win версия).

          А зачем оценивать критичность и стоимость?

            +1
            Кейс А: Сломались одновременно серверы/системы/ресурсы 3 и 5. Какой из них в первую очередь чинить? Тот, который наиболее критичен.
            Так как все сервисы, предоставляемые конечным пользователям, так или иначе привязаны к ресурсам, то мы можем ввести некий параметр критичности этих сервисов (пусть выраженный в количестве пользователей), а потом эту критичность каким-то образом транслировать на ресурсы. Подцепили новое приложение к базе данных — у базы данных выросла критичность; у серверов, от которых зависит база данных выросла критичность; и тд. Чтобы не подходить к этой проблеме интуитивно, хотелось бы иметь некоторую визуализацию. Как вариант, энтерпрайзную систему мониторинга.

            Кейс Б: Во сколько нам обходится почта? Не дешевле ли перейти в gapps/office365?
            Тут тоже самое, только наоборот. У каждого ресурса есть либо собственная стоимость (админ, физ. сервер, абон. плата), либо унаследованная (вирт. сервер, некое приложение). Пусть же стоимость всех ресурсов по восходящей просуммируется и мы получим стоимость, собственно, сервиса.

            Сейчас я считаю всё вот так:
            image

            Распечатываю из flying logic, склеиваю, беру карандаш, калькулятор и поехали. Сами понимаете, таким способом расчитывать что-либо в реальном времени невозможно физически.
            До сих пор не понимаю, почему я не смог найти готового инструмента для своей задачи; неужели она такая нетипичная?
              0
              А вы смотрели в сторону графовых БД, типа neo4j? Мне думается, что у вас задача где-то вот рядом с этой темой.
              Вот здесь на видео vimeo.com/12014944 есть немного кухни. Можно у каждого узла назначать свойства. И, наверное, как-то алгоритмически обсчитывать эти самые свойства.

              Схемка ух!
                +1
                Спасибо за наводку. Посмотрю.
                (Схемка на фотографии старая, можно сказать демо. Сейчас она гораздо более ух)
                  0
                  А из какой системы вы получаете сырые данные для расчетов? Считаете недельную доступность?

                  Привожу сугубо для примера скриншоты из коммерческой BMC Atrium CMDB.

                  Здесь можно разглядеть настройку веса связи одного сервиса на другой (в примере банковские сервисы Дилинг и Факторинг) и методы влияния критичности событий на элементы модели — повышение (Warning-Critical), понижение, без влияния и т.д.):


                  На этом скриншоте видно, что можно настроить вычисление статуса элемента сервисно-ресурсной модели:

                  Далее модель передается в систему мониторинга, которая прицепляет события к этим объектам и в конце концов позволяет вычислить дневную, недельную и так далее доступность любого сервиса для понимания CIO, что админы систем не шланги какие-нибудь.

                  Если у коллег по цеху получится сделать такое решение на основе open-source решений то будет, конечно, круто. А если прикрутить к тому же Заббиксу, то круто вдвойне.
                  0
                  Долго крутил и мучил neo4j и подобные, но всё-таки реализовал на visio. Смотрите комментарий ниже
                  0
                  Признаюсь не очень понял, вам нужна визуализация и возможность печати или расчет критичности каждого элемента инфраструктуры?

                  Вообще, мы раньше такие вещи делали с помощью MS Visio. Он может отображать на экране набор элементов, связи между ними. К элементы могут быть разного типа, с разным набором аттрибутов, значения которых можно обновлять скриптами хоть в реальном режиме времени. Связи тоже могут быть разных типов и иметь свои аттрибуты, также обновляемые скриптами…
                  Там могут быть вычислимые аттрибуты, как в Excel'е формулы. И нет никаких проблем рассчитать критичность элемента на основе данных о критичности соседних элементов…
                    0
                    Нужна визуализация, нужны расчёты. Печатать не нужно — распечатка это сейчас просто инструмент расчёта.
                    С Visio пробовал, но как-то не осилил. Как там сделать, чтобы при добавлении «квадратика» и связывании его с другими квадратиками, автоматически пересчитывалась схема?
                    Нашел только «сводную схему», но там как-то немного не то
                      +2
                      При всём моём скептическом отношении к продуктам MS, там всё довольно логично сделано. Вам просто надо почитать какую-нибудь книжку по VB для Visio или Excel, чтобы понять принципы. Там есть свои события на которые можно вешать свои скрипты, которые будут пересчитывать всё как надо…
                      Разберётесь, дальше у вас всё на автопилоте пойдёт…
                        0
                        Спасибо, попробую! Вчера начал уже ковырять
                          +1
                          Как освоите, поделитесь с нами новым опытом. Очень интересно.
                            +1
                            Кое-что получилось, в общем. Создано несколько сущностей в visio и написан кривенький VBA-скрипт, который обсчитывает схему. Есть, конечно, некоторые проблемы, но в целом результат удовлетворительный: данные по стоимости ресурсов тянутся из excel, обсчитываются скриптом и выгружаются обратно в excel.
                            Вот так выглядел прототип

                            Вот так вот начало выглядеть после внесения большинства экземпляров и связей между ними

                            Как видите, у стрелочек есть вес, согласно которому считается стоимость «стрелочки». Далее стоимость стрелочек складывается в стоимость ресурсов. И так далее всплывает наверх до услуг. Визуализация не очень, но мне сейчас главное считать стоимость.
                            Расчёт «критичности» пока не реализовал, но он не составит труда.
                            Чем хорош visio — тем что его потенциально можно будет интегрировать с такими продуктами как SCOM

                            Не знаю, может быть статью отдельную написать стоит? Большое спасибо пользователю northbear за наводку!
                              +1
                              Явно стоит!
                                0
                                Пожалуй, займусь после того как доведу до ума. Правда, меня всё ещё преследует ощущение, что я изобретаю велосипед
              +2
              Хотел было написать, что вы изобретаете CMDB, а потом задумался, а подходит ли типовая CMDB как для регистрации, так и для удобного использования информации о зависимостях, интерфейсах и прочих связях между, например, разными приложениями. На практике вообще с нормальными CMDB не сталкивался.
                0
                А вы смотрели плагин для Заббикса, который умеет влияния строить? Может его можно как-то доработать до нужного вам уровня?

                Only users with full accounts can post comments. Log in, please.