Всем привет! Это моя первая статья в пространстве хабра, и на написание данной статьи меня сподвигли недавние проблемы в гигантах it индустрии. Пересказывать произошедшее я не буду, но вот кое-какие выводы из это сделать можно.
Как показала практика от сбоев в IT системах никто не застрахован, даже у мамонтов индустрии. А убытки от простоев, после таких событий, достигают заоблачных цифр. К примеру, простои от последних событий для Facebook обошлись в миллиарды долларов.
Сбои неизбежны – это факт, но когда – это вопрос. Компаниям нужны решения здесь и сейчас, и эти решения предлагает молодое направление в IT – Chaos Enginering. Материала на данную тематику уже написано не мало, но очень мало в русскоязычных сообществах, их можно по пальцам перечитать. В рамках данной статьи я хочу поделиться своим опытом Chaos Enginering, так сказать простыми русскими словами.
Так случилось, что я попал в число первопроходцев по Chaos Enginering в России, и поверти на слово - «не так страшен черт, как его малюют», но всё же есть подводные камни.
Кому интересна история зарождения Chaos, на habr есть отличная статья-перевод, первая часть здесь. А я в свою очередь не буду ходить вокруг да около и начну прямо с примеров.
Основа направления Chaos Enginering - что-то специально сломать, имитируя события из реальной жизни, чтоб посмотреть, что произойдёт и как ваши системы с этим справятся.
Представите обычный интернет-магазин на микро-сервисах. Микро-сервис Б возвращает какое-либо свойство по товару. Микро-сервис А взаимодействует с микро-сервисом Б, и обрабатывает получаемые значения. Микро-сервисы находятся на разных серверах/облаках. Так вот сеть в этом всём организме является оптимальным звеном для наших экспериментов с хаосом.
Chaos Engineering делится на простые этапы:
Теперь давайте пройдемся по этим этапам на примере нашего магазина
1) Так как это магазин, то стабильная метрика кол-во продаж на единицу времени, вроде логично. Замеряем и получаем 10 продаж в минуту, это стабильное состоянии. (гипотетическая закадровая нагрузка где-то там присудствует)
2) Придумываем гипотезу. Наши микросерсвисы находятся в разных местах, и общаются через сеть, то логично отключить сеть между микросервисами или отключить один из микросервисов и посмотреть, что будет с нашим магазином. Я понимаю, что сейчас это звучит глупо, и если вы с этой идей пойдете к своим руководителям или клиентам, вас поднимут на смех, со словами, у нас есть реплики, балансеры и так далее. Но в этом и один из смыслов chaos engineering, проверить, так ли хороши системы HA на практике.
3) Так как мы не можем отключить сеть или как-то повлиять на неё (можем, но речь сейчас не об этом), мы просто запланировали отключение сервера/облака.
4) Замеряем кол-во продаж и что мы видим, а видим мы 0 (нуль). Магазин не работает.
5) Разбираемся почему это случилось и как исправить.
В ходе разбирательства оказалось, что java http клиент в миросервисе А не обрабатывал исключения таймаута и/или connection reset, обработка строилась только на http кодах 200-500. Исправили, починили, запустили сервисы и повторно провели эксперимент. Ура! Всё прошло удачно. Данный эксперимент можно поставить на поток в пострелизное время.
Да, пример весьма глупый, но он раскрывает суть Chaos Engineering. Любая и даже самая глупая гипотеза моделирования «реальных сбоев» должна быть поэкспериментировала в рамках вашей системы IT, особенно это касается сетей.
Теперь давайте подумаем, как вам строить системы хаоса в ваших компания, и что может пригодиться в этом не легком поприще.
Запомните одно из правил - Нельзя просто открыть поисковик, напечатать «хаос инженеринг, скачать без смс и регистрации» и запускать на ваших ресурсах всё что вы найдете. Оно так не работает и работает вообще не так.
В первую очередь, хаос должен быть целенаправленный и спланированный. Вы должны понимать, что вы собираетесь ломать, когда вы собираетесь ломать, как вы это будете ломать, и самое главное, как наблюдать, что происходит с вашей системой, когда вы её ломаете. Разрушения без замеров – не даст вам понимания, что произошло, соответственно вы не поймете как исправить.
В пространстве интернета, по поиску Chaos Enginering вы наверняка найдете ссылки содержащие слова: Chaos monkey, gremlin, chaos mesh, litmus, pumba, chaos toolkit и многие другие. Некоторые из них вы не сможете даже реализовать под свои нужны, но большую часть, я вам не советую даже запускать. В лучшем случае вы не получите результатов, в худшем вы обрушите ваши сервера, после чего разочаруетесь в данном направлении и прибегните к старому дедовскому НТ.
Chaos Enginering должен строится под конкретную компанию, под конкретное направление в компании или под отдельно взятый проект. Выстраивать его надо обдуманно, начиная с локальных разрушений.
Начните с самого простого. Допустим, используйте утилиту stress-ng. Нагрузите процессор на сервере приложений до 100% и проверяйте как это отобразится на работе основного приложения и какие тайминги будут доступны, время запросов и ответов
Пример команды для 4 ядер: stress-ng --cpu 4 -v --timeout 30s
Удачные эксперименты будут внушать доверие, и с подвигать вас на более сложные решения, в итоге проводя эксперименты в production среде, ведь конечная цель Chaos Enginering – это production системы.
Инструментов для хаоса много, некоторые из них я уже перечислил выше, но все они делятся на 4 основные группы сбоев приложения: вычислительные ресурсы, сеть, хранилище, инфраструктура.
Вернёмся к нашему интернет магазину, чтоб провести эксперимент по отключению сервера (группа сбоев инфраструктура), не обязательно скачивать что-то необычное, наверняка у вас есть ansible. С помощью не сложных усилий можно организовать отключение случайного сервера:
- name: "Вычисляем жертву"
host: localhost
tasks:
- set_fact:
random_server: "{{ server_list | random | json_query('name') }}"
- name: "Отключаем жертву :)"
host: {{ random_server }}
tasks:
- shell: poweroff
when: random_server is define
Собственно, правильно дописав этот playbook под ваши нужны, это уже будет второй эксперимент в вашей библиотеке хаоса, который вы можете использовать.
На текущий момент я разрабатываю свои архитектуры Chaos Enginering способные работать с платформами k8s, openshift, docker, и с классическими bare-metal. Добавлены возможности в автоматическом режиме собирать метрики с систем мониторинга (Zabbix, Prometheus), запускать и останавливать инструменты «разрушения», формировать отчеты проведённого эксперимента.
Если тематика интересна, то в следующих статьях я постараюсь подробно рассматриваться, тестировать и описывать различные инструменты хаоса, предоставленных на рынке.
Спасибо за внимание.
Комментарии (9)
AndreySinelnikov
16.10.2021 16:08+1Нельзя просто открыть поисковик, напечатать «хаус инженеринг, скачать без смс и регистрации» и запускать на ваших ресурсах всё что вы найдете. Оно так не работает и работает вообще не так.
Особенно с учётом того, что chaos записывается на русском как "хаос".
mskotyn
16.10.2021 21:35+2Уххх.
offtop
Chaos произносится скорее как кэйос, а не хаус.
Chaos monkey и т.п. инструменты это только вершина айсберга которую все видят. Под этой вершиной лежит толстый-толстый слой тестирования, в котором проверяется поведение при негативный событиях. Под тестированием - еще более толстый слой разработки, в котором и закладывается поведение. Еще ниже разработки - сбор требований, которые и определяют негативные события для которых должно быть определено поведение. События тоже не берутся от балды - есть такая штука как управление рисками. В рамках которого и производится оценка вероятности события и ущерб в результате наступления этого события. В результате весь этот банкет оплачивается из бюджета предотвращения финансовых потерь. Только когда все слои собираются вместе - появляется chaos engineering. И да, это все имеет смысл только для достаточно крупных компаний. Для мелкой компании многие риски просто слишком дорого предотвращать.
Так что chaos engineering начинается с управления рисками. Метрика берется не от балды, а от возможного ущерба. Гипотеза тоже не придумывается, а выбирается исходя из событий которые агрегируются метрикой и вероятности наступления события. Планируется не только как ломать, но и как регистрировать происходящее после поломки - какие скрипты и когда должны запуститься, кто, что и когда должен сделать по регламентам и инструкциям. Замерять нужно не саму метрику, а время восстановления после поломки. Мда. Единственное, к чему не могу придолбаться - это "Оценить результаты, сделать выводы".
Автору могу порекомендовать исследовать пучины Краваго Ынтерпрайза. Ну там где мелкие изменения в микроскопический проект вносят три дев-синьора с солидной зарплатой в течении месяца, а тестируют два месяца четыре кьюэй-синьора. Просто потому что каждый час простоя сервиса компания теряет $10+К и все эти синьоромесяцы стоят меньше полусуток оффлайна.
TidalPoo Автор
16.10.2021 23:29Вы совершенно правы, инструментарий это только вершина. Но именно оно, одно из самых больших заблуждений, с которыми сталкиваются начинающие. Они берут инструментарий, видят там "подготовленные" сценарии (для "чужих" систем) и запутавшись в организации процесса, отталкивают саму идею.
Но вот про управление рисками, тут я с вами к сожалению не соглашусь. CE в основном применим к распределенным системам, где последняя разрастается семимильными шагами, и оценивать риски, как и контролировать систему становится всё сложнее и сложнее.
В любом случае, на мой взгляд стоимость самого CE переоценена, она может стать на много дешевле, если изначально понять азы и подойти с нужного ракурса.mskotyn
17.10.2021 23:30Чтобы начинающие не хватались за инструменты - нужно разрабатывать методологию оценки готовности предприятия к внедрению СЕ, а не изобретать еще один универсальный инструмент для сферического предприятия в вакууме. Если поковыряться в вопросе - внезапно выходит, что СЕ строится не на пустом месте, а на вполне таки солидном фундаменте ITSM, ITIL и связанных стандартов. И при наличии фундамента стоимость внедрения СЕ действительно не так уж и велика. А когда фундамента нет - компания получит гораздо больший эффект если займется основами. Тогда и управление рисками будет формализованно и инструменты регистрации событий будут существовать и регламенты с инструкциями будут прописаны к началу внедрения СЕ.
amarao
17.10.2021 13:58+1"хаус" - это дом. Вы, наверное, хотели использовать слово "хаос" или если вы фанат англицизмов, то "кеёс". Если вы англичанину скажете "хаус инжиниирин", то он подумает, что вы civil engineer и планируете заниматься стройкой дома.
asukhov
Тяжело читать. Понял что нужно повертеть хаус.
А если серьёзно, то это обыкновенный OAT, плюс периодические "учения" на поверку DR/HA на уровне систем, сервисов, цод-ов. Вы здесь далеко не первопроходец.
TidalPoo Автор
Не совсем так. Традиционные тестирования закладываются с известными переменными, в то время как хаос призван выявлять непредвиденные ситуации.
Может не совсем удачный пример, но попробую привести пример с кнопкой. Для тестирование кнопки задают выходные значения - кнопка нажалась, кнопка не нажалась. Ок, кнопка нажимается. Деплоим в прод. В проде кнопка нажимается, и даже выдает нужный результат. Но разработчик разрабатывал кнопку с правилом, что сеть всегда 100% доступности с бесконечной скоростью. А что если вдруг результат от нажатия кнопки задерживается, запаздывает? Пользователь начинает паниковать, жмет кнопку ещё 100 000 раз, и вот у вас уже очередь копится запросов))) Дальше больше, и тут вы уже не уверены как будет вести себя ваша система. Это и пытается донести chaos engineering