Всем привет!

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

Также я постараюсь подробно отразить свою субъективную оценку по каждому из перечисленных мероприятий, на предмет сложности реализации и эффективности.

Аварийный план восстановления работы сервиса

Логически рассуждая, если вам понадобился такого рода план, то явно надежность вашего сервиса хотя бы раз дала серьезный сбой. По сути, аварийный план — это схема процесса, по которому должна действовать организация в случае критического сбоя или катастрофы, приведших к длительной (более 4 часов) недоступности сервисов или систем. Навскидку могу привести такие примеры подобного рода катастроф:

Сгорел дата-центр:

Поставщика необходимой смежной услуги лишили лицензии:

Для чего это надо?

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

Эффективность: 3/10

Сложность реализации: 2/10

Георезервирование критичных сервисов и систем

Эта мера как раз и должна помочь справиться с катастрофой. Суть её (как понятно из названия) состоит в организации второго/третьего ЦОД, в котором дублировались бы все критичные системы и сервисы. Решение безумно дорогое и технологически сложное (поскольку возникают вопросы с параллельной выкаткой релизов в несколько production-окружений, вопросы синхронизации баз данных и т.д.).

Для чего это надо?

Если знать, как это блюдо готовить, и научиться быстро переключать трафик с одного ЦОД на другой (в случае горячего резерва) или распределять трафик между ЦОД, автоматически балансируя его в зависимости от доступности сервисов, то эта мера защищает от большинства проблем и катастроф. По сути, многие внутренние проблемы сервисов не коснутся клиентов, и это замечательно!

Эффективность: 8/10

Сложность реализации: 10/10

Аварийные учения

Это эмуляция возникновения проблемы (точки отказа оборудования или приложения). Такое мероприятие правильно проводить в production-среде. Для минимизации негативного эффекта для пользователей обычно мы проводим учения ночью, а также во время новогодних и майских праздников.

Что именно проверяем:

  • Отказ элементов сетевой инфраструктуры (коммутаторов, каналов связи и т.д.) для проверки переключения на дублирующие системы.

  • Выход из строя отдельных физических серверов БД для проверки переключения приложений с master-баз данных на реплики.

  • Выход из строя серверов кластера Kubernetes для проверки балансировки трафика и перезапуска подов приложений на других серверах кластера.

  • Отказ отдельных микросервисов для проверки отсутствия негативного эффекта на смежные сервисы (если сломался один конкретный микросервис, то остальные должны уметь с этим работать). 

  • Эмулируем DDoS-атаки на публичные веб-ресурсы для проверки механизмов защиты от DDoS и проверки логики работы WAF.

  • Эмулируем повышенную легитимную нагрузку для проверки готовности сервисов к пикам клиентского трафика.

  • Эмулируем отказ брокеров сообщений (RabbitMQ и Kafka) для проверки работоспособности автоматической балансировки сообщений и отсутствия потерь отдельных сообщений.

  • Эмулируем отказ отдельных потребителей для проверки работы микросервисов в таких ситуациях.

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

Для чего это надо?

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

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

Эффективность: 7/10

Сложность реализации: 6/10

Дежурная смена разработчиков

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

Поэтому для каждого крупного продукта мы ввели функциональность «Дежурного разработчика». По сути, это человек, который занимается разработкой группы сервисов крупного продукта. «Дежурный разработчик» обязан:

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

  • Постоянно иметь доступ к средствам разработки и диагностики (носить с собой ноутбук).

  • В случае возникновения проблемы в течение 10 минут приступить к её разбору (даже если проблема случилась ночью).

  • Не отключать каналы мониторинга (не отключать звук оповещений в соответствующих каналах в мессенджерах) и реагировать на возникновение проблем высокой важности.

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

Для чего это надо? 

Помимо сугубо утилитарного эффекта (разработчик гораздо быстрее разберется в проблеме своего сервиса, чем кто бы то ни было), есть и психологический: если сервис будет написан качественно, то дежурного разработчика никто дергать не будет. Легкие деньги ;)

Эффективность: 7/10

Сложность реализации: 5/10

Управление инцидентами

В рамках статьи я буду считать инцидентом сбой в работе сервиса. Даже если эта проблема не повлияла на конечных пользователей, всё равно это инцидент.

Суть процедуры управления инцидентами состоит в том, чтобы периодически (у нас это происходит один раз в неделю) публичный разбирать сбои и разрабатывать меры по их недопущению в будущем. А также отслеживать реализацию таких мер, злостно карая за рецидивы. 

При этом необходимо придерживаться здравого смысла: некоторые инциденты не удается разобрать до конца (они не повторяются и корневая причина их возникновения может остаться неизвестной). В таком случае после мониторинга их можно просто закрыть. Важен сам факт периодического публичного разбора.

Для чего это надо

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

Эффективность: 5/10

Сложность реализации: 4/10

Координатор рисков

Хорошо иметь отлаженные механизмы и процедуры по работе с инцидентами. Но еще лучше — даже не допускать возникновения такого рода проблем. Поэтому в качестве одной из мер по повышению надежности работы сервисов может быть найм специального человека, который изучал бы текущие схемы работы инфраструктуры и приложений и заранее формулировал «риски» — проблемы в работе сервисов и систем, которые, ВОЗМОЖНО, могут произойти. Этот же человек может ставить задачи командам разработки в качестве тех. долга и контролировать их выполнение.

Для чего это надо?

Человек, не загруженный рутиной и постоянной работой, может действительно накопать «пробелы» в исторически сложившейся модели работы компании. Может даже не технического плана. Проблема в том, что иногда для оправдания своего существования такие люди могут высасывать «риски» из пальца. Нужен строгий контроль задач координатором рисков. 

Эффективность: 1/10

Сложность реализации: 4/10

Контроль bus-фактора

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

В ДомКлик мы отслеживаем такие ситуации (используем для этого Skilltracker) и в рамках работы над техническим долгом организуем обмен знаний между разработчиками.

Для чего это надо?

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

Эффективность: 4/10

Сложность реализации: 4/10

Тест на проникновение

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

Иногда API разрабатываются не совсем удачно. Сама структура передаваемых данных или URLа может быть плохой, либо возможен перебор идентификаторов — за всеми такими ситуациями разработчик не уследит, и их могут просмотреть на code review.

Периодически все сервисы неплохо тестировать на «взломоустойчивость». Лучше всего (если позволяют производственные мощности) — перед релизом. У нас есть особый отдел департамента кибербезопасности, который занимается проверкой всех API на «защищенность». 

Для чего это надо

Человек, профессионально занимающийся взломом сайтов, достаточно легко и быстро находит все дыры и несостыковки (даже напрямую не влияющие на безопасность) в разработанных API. Всегда полезно иметь посторонний взгляд дружественного хакера. Проблема возникает, когда нужно «срочно-пресрочно» выкатить фичу, а пентестер нашел в API этой фичи уязвимость, да такую, которую не исправить за час.

Эффективность: 6/10

Сложность реализации: 7/10

Защита от DDoS/WAF

Если пользователи работают с вашим сервисом через публичный интернет и ваш ресурс достаточно популярен, то рано или поздно вы столкнётесь с проблемой DDoS-атак. Обычно это коварные китайские боты, которые, словно свора гончих, накинутся на ваш сайт и попытаются достучаться до всех уголков неавторизованной зоны. Для борьбы с этим явлением повсеместно используют различные продукты и сервисы защиты от DDoS-атак.

Для чего это надо

Отсекать китайских ботов и недружелюбных хакеров. Причем зачастую атаки не совсем «тупые» и выполняются с распределенных IP-адресов. Поэтому простой защиты от DDoS иногда недостаточно и применяют Web Application Firewall. На базе продуктов этого типа можно настраивать более тонкую логику отсечения трафика. Только главное не переусердствовать и не порезать легитимных пользователей.

Эффективность: 6/10

Сложность реализации: 4/10

Контроль трафика между сервисами

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

Для чего это надо

Чтобы исключить такой легитимный DDoS, который может повлиять на доступность смежных сервисов, нужно контролировать межсервисный трафик и не допускать его драматического увеличения, растягивая по времени. Сделать это можно разными механизмами (например, на основе Service Discovery).

Эффективность: 4/10

Сложность реализации: 5/10

Мониторинг ресурсов

Компании и сервисы растут из года в год и начинают потреблять всё больше и больше ресурсов. Это происходит постепенно, изо дня в день. Рано или поздно наступает момент, когда срабатывают мониторинги и вы понимаете, что места на сервере БД осталось на пару дней. Необходимо заранее и периодически проверять и прогнозировать достаточность ресурсов инфраструктуры.

Для чего это надо

Добавить объем жесткого диска может оказаться не так просто. Например, потребуется остановка сервера, либо вообще закупка более мощной инфраструктуры. Такое за пару дней не сделать. Если же спрогнозировать необходимость усиления ресурсов за полгода, то можно заранее закупить и установить необходимое оборудование.

Эффективность: 3/10

Сложность реализации: 2/10

Мониторинг сертификатов

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

Для чего это надо

Окончание срока действия сертификата может в мгновение ока сделать портал недоступным для пользователей. Иногда бывает сложно быстро выпустить новый сертификат, и период недоступности может составить несколько часов. Лучше не допускать такого и настроить мониторинг срока действия всех сертификатов, чтобы иметь в запасе несколько недель до момента его истечения.

Эффективность: 3/10

Сложность реализации: 1/10

В заключение

Надеюсь, хотя бы часть из перечисленных мер может оказаться полезными для вас и ваших сервисов. Хочу поблагодарить Александра Молчанова за помощь в подготовке статьи. Для удобства я свел все предлагаемые меры в единую таблицу:

Мероприятие

Эффективность

Сложность реализации

1

Дежурная смена разработчиков

7

5

2

Защита от DDoS/WAF

6

4

3

Мониторинг сертификатов

3

1

4

Аварийные учения

7

6

5

Управление инцидентами

5

4

6

Мониторинг ресурсов

3

2

7

Аварийный план восстановления работы сервиса

3

2

8

Контроль bus-актора

4

4

9

Penetration test

6

7

10

Контроль трафика между сервисами

4

5

11

Георезервирование критичный сервисов и систем

8

10

12

Координатор рисков

1

4