Что такое тестирование отказоустойчивости (Failover Testing)?

Ответ

Тестирование отказоустойчивости (Failover Testing) — это тип нефункционального тестирования, который проверяет способность распределенной системы автоматически переключать нагрузку с отказавшего основного компонента (сервер, база данных, сетевое соединение) на резервный с минимальным временем простоя и без потери данных.

Основные цели:

  1. Верификация автоматического восстановления. Система должна обнаружить сбой и выполнить переключение без ручного вмешательства.
  2. Измерение ключевых метрик:
    • RTO (Recovery Time Objective): Максимально допустимое время восстановления работы после сбоя.
    • RPO (Recovery Point Objective): Максимальный объем данных (по времени), допустимый к потере (например, транзакции за последние 5 секунд).
  3. Проверка целостности данных и сессий после переключения.

Типичный сценарий для веб-приложения с балансировщиком нагрузки:

# 1. Система в нормальном состоянии: трафик идет на Primary Server.
# 2. Имитация сбоя:
sudo systemctl stop nginx  # Остановка веб-сервера на основном узле
# или
sudo iptables -A INPUT -p tcp --dport 80 -j DROP # Блокировка порта

# 3. Ожидаемое поведение системы:
#    - Мониторинг (например, Health Check от Load Balancer) обнаруживает недоступность Primary.
#    - Load Balancer исключает узел из пула и перенаправляет трафик на Standby Server.
#    - Пользователи могут испытывать короткую задержку, но не теряют активные сессии.
#    - Критичные транзакции не теряются (журналируются или реплицируются).

Что тестируется:

  • Отказ сервера приложения или базы данных.
  • Обрыв сетевого соединения или сбой DNS.
  • Отказ диска или аппаратного компонента.
  • Перегрузка одного из узлов кластера.

Инструменты: Для автоматизации таких тестов используются Chaos Engineering инструменты (Chaos Monkey, Gremlin), средства оркестрации (Kubernetes, который может перезапускать поды) и скрипты для имитации сбоев.

Ответ 18+ 🔞

А, слушай, вот эта вся хуйня про отказоустойчивость! Это ж надо же, какие умные слова придумали: «фейловер тестинг». А по-нашему, по-простому — «а что будет, если вот эту хреновину посреди работы вырубить?».

Суть-то, блядь, проще пареной репы. Есть у тебя система, на ней народ работает, деньги считает, котиков лайкает. И тут — хрясь! — основной сервак накрылся медным тазом. И что? Все в пизду, сессия потерялась, корзина с заказом испарилась, а пользователь сидит и думает: «Ну и нахуй я сюда заходил?». Так вот, чтобы этого не было, умные дядьки и придумали эту самую «отказоустойчивость». То есть система должна быть хитрожопой: почуяв, что один узел загнулся, она должна, не спрашивая ни у кого разрешения, перекинуть всю движуху на запасной. Автоматом, блядь! Чтобы юзер даже не успел матюгнуться.

И главное, что нам надо проверить, ёпта:

  1. Самостоятельность системы. Чтобы она сама, как взрослая, поняла, что её кусок сдох, и переключилась. Без наших криков «ой, бля, ребята, врубайте резерв!».
  2. Циферки, блядь! Надо засечь, сколько времени она тупит, пока переключается. Это и есть RTO — время, за которое всё должно ожить. И сколько данных нахуячится — RPO. Допустим, если сбой случился, можно потерять транзакции за последние пару секунд, но не за последний час, иначе это пиздец, а не система.
  3. Чтобы ничего не потерялось. Зашел ты в личный кабинет, положил в корзину слона, а после переключения корзина пуста, а вместо слона — ошибка 500. Вот это — полный ахтунг и доверия ебать ноль.

Вот, смотри, как это примерно выглядит на практике, представь веб-приложение:

# 1. Всё спокойно, трафик пыхтит на основном серваке.
# 2. А мы, злые гении, ему впендюрим сбой:
sudo systemctl stop nginx  # Ёбнем веб-сервер на главной тачке
# Или, для верности, можно сеть ему порвать:
# sudo iptables -A INPUT -p tcp --dport 80 -j DROP

# 3. И наблюдаем, что будет. В идеале:
#    - Балансировщик, который постоянно стучится к серваку (Health Check), понимает: «Э, сука, тут труп».
#    - Он молча, по-английски, вычёркивает этот сервер из списка и начинает гнать трафик на запасной.
#    - Пользователь может моргнуть разок от удивления, но его сессия жива, корзина на месте.

А что вообще ломать будем? Да всё, что плохо лежит!

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

Чем это всё автоматизировать? Да есть же целая куча инструментов для бардака! Chaos Monkey, например, который специально в продакшене хуйню вытворяет, чтобы проверить, не развалится ли всё. Или всякие оркестраторы вроде Kubernetes — они сами умеют поды перезапускать, если те загнулись. Короче, создают управляемый пиздец, чтобы в будущем не получить пиздец неуправляемый.

Вот и вся наука. Сделать так, чтобы система была не как однорукий очкарик, а как гидру: отрубишь одну голову — вырастет другая, и всё продолжает работать. А то без этого — чих-пых тебя в сраку, и бизнес накрылся.