Введение

Кластеры высокой доступности (также известные как кластеры HA, failover-кластеры) — это группы компьютеров, обеспечивающих поддержку серверных приложений, которые могут надежно использоваться с минимальным временем простоя. Они функционируют за счет использования программного обеспечения высокой доступности, которое объединяет избыточные компьютеры в группы или кластеры, обеспечивая непрерывность обслуживания при сбое компонентов системы. Без кластеризации, если сервер, на котором запущено определенное приложение, выходит из строя, приложение становится недоступным до устранения неисправности сервера. Кластеризация HA решает эту проблему, обнаруживая аппаратные или программные сбои и немедленно перезапуская приложение на другом узле без вмешательства администратора, процесс, известный как переключение при отказе (failover). В рамках этого процесса программное обеспечение кластеризации может настроить узел перед запуском на нем приложения. Например, может потребоваться импортировать и смонтировать соответствующие файловые системы, настроить сетевое оборудование, а также запустить некоторые вспомогательные приложения. Кластеры HA часто используются для критически важных баз данных, организации сетевого обмена файлами, бизнес-приложений и обслуживания клиентов, таких как веб-сайты электронной коммерции. При реализации кластеров HA стремятся обеспечить избыточность, устраняя единые точки отказа, включая несколько сетевых соединений и хранилище данных, избыточно подключенное через сети хранения данных (SAN). Кластеры HA обычно используют частную сеть связи (heartbeat) для мониторинга состояния и работоспособности каждого узла в кластере. Одной из тонких, но серьезных проблем, которую должно уметь обрабатывать любое кластерное программное обеспечение, является состояние «разделенного мозга» (split brain), которое возникает, когда все частные каналы связи одновременно выходят из строя, но узлы кластера продолжают работать. В этом случае каждый узел кластера может ошибочно решить, что все остальные узлы вышли из строя, и попытаться запустить службы, которые уже запущены на других узлах. Наличие дубликатов служб может привести к повреждению данных на общем хранилище. Чтобы избежать этого сценария, кластеры HA часто также используют хранилище свидетелей кворума (локальное или облачное). Свидетельское устройство не может быть совместно использовано двумя половинами разделенного кластера, поэтому, если все члены кластера не могут взаимодействовать друг с другом (например, из-за сбоя heartbeat), узел, не имеющий доступа к свидетелю, не сможет стать активным.

Требования к разработке приложения

Не каждое приложение может работать в среде кластера с высокой доступностью, и необходимые решения по проектированию должны быть приняты на раннем этапе разработки программного обеспечения. Чтобы приложение работало в среде кластера с высокой доступностью, оно должно соответствовать, как минимум, следующим техническим требованиям, два последних из которых критически важны для его надежной работы в кластере и наиболее сложны в полной реализации: должен быть относительно простой способ запуска, остановки, принудительной остановки и проверки статуса приложения. На практике это означает, что приложение должно иметь интерфейс командной строки или скрипты для управления приложением, включая поддержку нескольких экземпляров. Приложение должно уметь использовать общее хранилище (NAS/SAN). Самое важное – приложение должно хранить как можно больше своего состояния в энергонезависимом общем хранилище. Не менее важно, чтобы приложение могло перезапускаться на другом узле в последнем состоянии перед сбоем, используя сохраненное состояние из общего хранилища. Приложение не должно приводить к повреждению данных при сбое или перезапуске из сохраненного состояния. Ряд этих ограничений можно смягчить, используя среды виртуальных серверов, в которых сам гипервизор поддерживает кластеры и обеспечивает бесшовную миграцию виртуальных машин (включая состояние оперативной памяти) между физическими хостами – например, Failover Clusters в Microsoft Server 2012 и 2016. Ключевое отличие этого подхода от запуска приложений, поддерживающих кластеры, заключается в том, что последние способны обрабатывать сбои серверных приложений и поддерживать обновления программного обеспечения в режиме реального времени, обеспечивая при этом доступ клиентов к сервису (например, базе данных), за счет того, что один экземпляр предоставляет сервис, пока другой обновляется или восстанавливается. Это требует от экземпляров кластера обмена данными, очистки кэшей и координации доступа к файлам при передаче управления. Организация отказоустойчивого кластера включает в себя планирование, создание, настройку и устранение неполадок.

Надежность узлов

Кластеры высокой доступности обычно используют все доступные методы для обеспечения максимальной надежности отдельных систем и общей инфраструктуры. К ним относятся:
Зеркалирование дисков (или избыточные массивы независимых дисков — RAID), чтобы отказ внутренних дисков не приводил к сбоям системы. Распределенное реплицируемое блочное устройство — один из примеров. Избыточные сетевые соединения, чтобы отказ одного кабеля, коммутатора или сетевого интерфейса не приводил к сетевым сбоям. Избыточные подключения к сети хранения данных (SAN), чтобы отказ одного кабеля, коммутатора или интерфейса не приводил к потере связи с хранилищем (что нарушило бы архитектуру "ничего не разделяется"). Избыточные входы электропитания на разных цепях, как правило, обе или все защищены источниками бесперебойного питания (ИБП), а также избыточные блоки питания, чтобы отказ одного источника питания, кабеля, ИБП или блока питания не приводил к потере питания системы. Эти функции помогают минимизировать вероятность необходимости переключения между системами в кластере. В случае такого переключения предоставляемая услуга недоступна хотя бы некоторое время, поэтому предпочтительнее принимать меры для предотвращения переключения.

Стратегии перехода на более низкий уровень

Системы, обрабатывающие отказы в распределенных вычислениях, используют различные стратегии для восстановления после отказа. Например, API Apache Cassandra Hector определяет три способа настройки переключения при отказе:
"FAIL FAST" (Fail Fast, быстрый отказ) означает, что попытка устранить отказ будет прервана, если не удастся связаться с первым узлом. "ON FAIL TRY ONE NEXT AVAILABLE" (На неудачу, попробовать один следующий доступный) означает, что система попытается использовать один хост, наиболее доступный, прежде чем сдаться. "ON FAIL TRY ALL AVAILABLE" (На неудачу, попробовать все доступные) означает, что система попытается использовать все существующие доступные узлы, прежде чем сдаться.