Бурлаки деплоя. Или автоматизация проверок финтех-систем

Kate

Administrator
Команда форума
Что, если бизнес компании заключается в приеме и обработке платежей во множестве стран в режиме 365/24/7? В этом случае одной из ключевых целей ее сотрудников является доступность сервисов 99,999%. А к CI/CD в таких условиях предъявляются особые требования.

Заместитель директора департамента эксплуатации и разработки сервисных систем ECOMMPAY IT Федор Васильев на конференции HighLoad++ Весна 2021 рассказал об эволюции подходов его компании к деплою нового кода. А мы сделали на основе его доклада полезную статью, которую вы найдете под катом.

fe69a023ecca9f2f30000cd019ff6b07.png

Мы работаем с финансовыми транзакциями, и мы параноики, потому что любой даунтайм для нас — это прямые финансовые потери.

Сервисы у нас деплоятся последовательно, и это принципиальная позиция. Конечно, технически можно деплоить хоть все сразу. Но если деплой идет параллельно, энтропия, которая вносится в продакшен, очень большая. И потом очень сложно разобраться, что пошло не так. Тяжело смотреть логи, потому что их много. Кроме того, компоненты связаны друг с другом очень тесно и хитрым образом. Деплоить все сразу в финтехе, по нашему опыту, опасно.

Деплой каждого сервиса тщательно проверяется в режиме реального времени.

Раньше, до конца 2019 года, процесс выглядел так: куча людей (деплой-инженеры, системные администраторы, инженеры мониторинга) в течение многих часов напряженно деплоят и проверяют сервисы по заранее составленному расписанию. И как-то, под новогодний фриз, мы поняли, что надо что-то менять (деплой в тот день длился 12 часов!).

О том, что мы поменяли и как углубили автоматизацию я расскажу ниже.

Какой CI/CD нам нужен?​

Обычно всем нужен быстрый, надежный и дешевый CI/CD. Для нас, конечно, это тоже все актуально. Но гораздо важнее:

  • чтобы все работало (понятно — кому нужен деплой, который не работает);
  • не было финансовых потерь во время и после деплоя;
  • если потери все-таки есть, они должны быть минимальными и происходить в короткий промежуток времени.
Если вдруг что-то пойдет не так во время деплоя или после, нас ждут прямые финансовые потери: мы недосчитаемся денег и/или можем попасть на штрафные санкции. А этого очень не хочется. Нежелание попадать на деньги и определило эволюционный вектор наших деплоев.

Blue\Green Deployment​

Естественно, для нас это α, ω, θ, γ и т.д. — в общем, весь греческий алфавит. Blue\Green Deployment у нас используется практически на всех сервисах.

Кроме того, у нас используется и канареечный релиз, и обычно это происходит одновременно с Blue\Green.

Выглядит это так: трафик на офлайн-линию с новым кодом мы запускаем маленькими порциями — 2%, 5%, 20%, потом доходит до 100%. Это делается для того, чтобы финансовые потери, в случае чего, были меньше. Обычно мы начинаем с 2%, и, если что-то случится, потеряем только их.

Как проверять?​

Это индивидуальная история. Сервисы очень разные, и их много (от 20 до 100, смотря как считать).

Подробный письменный регламент проверки каждого сервиса при деплое должен быть обязательно. По этому регламенту опытный инженер отдела мониторинга проверяет сервис по пунктам. В качестве инструментов мониторинга и проверки мы используем Kibana, Grafana, Zabbix. Но есть вещи, которые нужно проверять руками: заходить в интерфейсы, учитывать функциональность. Помимо пунктов из регламента, разумеется, рассматриваются аномалии в графиках/мониторах/дашбордах.

В регламенте проверки сервиса всегда есть бизнес-проверки и бизнес-метрики. Бизнес-проверка — это проверка основного функционала (она осуществляется на каждом шаге деплоя). При малейших подозрениях на проблемы происходит максимально быстрый откат. В случае с blue/green — это секунды. Трафик скачком переводится обратно на стабильную линию.

Инструменты деплоя​

Что же у нас было в тот момент когда мы поняли, что необходима более глубокая автоматизация?

8dc536886e632fe420876d22fe41fae0.png

А были у нас три замечательных богатыря:

  • AWX (Ansible) -> 49 jobs templates;
  • Jenkins (Groovy) -> 41 jobs;
  • Fabric (Python) -> 5 scripts.
В центре — Jenkins, он же Илья Муромец — основа основ деплоя кода. Инфраструктурные вещи, например, переливания трафика, реализованы в AWX (Добрыня). А в некоторых компонентах есть и Fabric (Алеша Попович), выполняющий вспомогательные функции по развертыванию ENV для приложений.

Что еще автоматизировать?​

81b25bc2fe74b32cae440090851d8f64.png

Если посмотреть на картину внимательно, то на заднем фоне виден пароход. В век, когда уже есть паровая тяга, бурлаки тащат против течения корабль. Это не кажется вам странным? Илья Репин специально нарисовал пароход, чтобы подчеркнуть, что несмотря на наличие паровой тяги, бурлаки еще при деле.

Бурлаки деплоя для меня — это две категории людей. Первые — деплой-инженеры, которые переливают трафик, и нажимают кнопки в Jenkins/AWX, чтобы деплой начался. Вторые — инженеры мониторинга, которые по сигналу деплой-инженера проверяют такой-то сервис на новой линии в таком-то ДЦ.

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

Как автоматизировать?​

26f1b91b730c91d7f41e738b56364c27.png

Наверное, все знают эти инструменты. Как я уже упоминал, три из них у нас уже использовались. Мы решили, что хватит.

Принципиально у нас выходило следующее:

350ef8a67bfa6f44ea9254d6dd44311f.png

Но что же должно быть в центре? Что будет оркестровать?

До разработки новой системы в центре был человек. Я полагаю, если бы на моем месте был бы инженер, который по призванию админ, то оркестратором бы стал Jenkins. Но я-то программист, поэтому у меня получился велосипед :)

80c6401a359384f6bfd7be7e748bf03a.png

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

И мне пришел в голову образ Lurker-а:

cca5f2d7b2fad18f6c5ed8431ddfd849.png

Это Близзардовское творение — зерговский юнит из игры StarCraft, в переводе соглядатай, тайный наблюдатель. В игре он закапывается под землю и атакует оттуда своими страшными щупальцами.

Смысл будущей системы был именно в том, что она, с одной стороны, будет невидимой. А с другой сможет вовремя дергать своими щупальцами: Jenkins, AWX и Fabric. Поэтому образ Lurker-а мне показался удачным.

Что у нас получилось:​

  1. Отдельная система (оркестратор).
  2. PHP 7.4, MySQL 5.7, Bootstrap.
  3. Jenkins API — для деплоев (включает fabric).
  4. AWX API — для манипуляций с трафиком.
  5. Мониторит состояние сервисов по логам в ELK (Elasticsearch API).
  6. Grafana API (считывает триггеры).
  7. Zabbix API (считывает триггеры).
  8. Запускает бизнесовые проверки сервисов (кастомные, PHP).
  9. Запускает Lurker-Smoke-тесты (Codeception, Selenium WebDriver).
  10. Web-интерфейс, Telegram-bot.
Бизнесовых проверок сервисов много. Большинство из них кастомные, написаны на PHP в самом Lurker, как модули. Это server-to-server взаимодействия, которые необходимо проверить (дергаем «ручки» API сервисов).

Кроме того, если речь идет об интерфейсном проекте, у которого есть фронт, бот заходит, кликает по кнопкам по определенному алгоритму и проверяет, все ли там нормально: отображаются ли новые транзакции, обновляется ли таблица, можно ли выгрузить файл. Для этого у нас есть тесты на Codeception и Selenium WebDriver — это интерфейсные бизнес проверки.

Это та часть, которую пишут профессиональные QA-шники. Они занимаются автотестами, и для Lurker они пишут специальные тесты, которые мы называем Lurker-Smoke-тестами. Это не регресс и не обычный QA-шный Smoke на стейдже, а именно специально написанные тесты, проверяющие только самый критичный бизнес функционал. К ним предъявляются определенные требования, основное из которых — скорость исполнения.

Lurker выглядит так:

754111bb1ea71a1e4e6b98f15e8f6e6e.png

Это точка входа в расписание. Она общедоступна — любой работник компании может зайти и посмотреть актуальное расписание деплоев компонентов.

Очень важный момент: QA сами подают заявку на продовый деплой. У них есть специальные права для своих компонентов, и они лично указывают теги, артефакты, выбирают время из свободных слотов.

Расписание ведется прямо в Lurker. Деплои запускаются автоматически и последовательно.

Несколько примеров интерфейсов:

3d05e86185033beb629750940e3fd188.png

*Фотки со стейджа, но на проде то же самое.

Здесь ничего особенного: мониторинги, HeartBeat сервисов (трафик. ошибки).

Так выглядит лог джобы, когда она запускается:

9924ae011e89eb960fc9635cc8832a0d.png

Здесь подробно логируются проверки, этапы переливание трафика, и т.д.

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

65af5bcbcde411b7059241627a3f7092.png

Что еще важно? Или некоторые выводы​

58acdd3483ee8ded1a0025832a86f08a.png

  1. Пропагандируйте и поддерживайте «Zero Tolerance» к ошибкам уровней ERROR+ (перманентный процесс) — очень помогает мониторить деплои.
  2. Постоянно тестируйте совместимость разных версий сервисов друг с другом силами QA.
  3. Не используйте линии для DBMS. База для обеих линий компонента в blue/green должна быть единой, а 2-3 последних версии апликейшена должны уметь работать с новой структурой базы, так как она никогда не откатывается.
  4. Не бойтесь велосипедов. Иногда они неплохо работают :)
Ну и, конечно, не доверяйте программистам (я сам программист потому знаю, о чем говорю :)

Все надо тестировать силами QA!

Видео доклада можно посмотреть здесь.

 
Сверху