HDFS High Availability
HDFS High Availability (высокая доступность HDFS) — это архитектурное решение в распределённой файловой системе Hadoop (HDFS), обеспечивающее отказоустойчивость и непрерывность работы кластера за счёт устранения единой точки отказа (Single Point of Failure) в виде единственного NameNode. В классической реализации HDFS (до версии 2.0) NameNode являлся критическим компонентом: его выход из строя приводил к полной недоступности файловой системы до ручного восстановления администратором. HDFS High Availability (HA) позволяет автоматически или вручную переключать управление на резервный NameNode, минимизируя время простоя.
История и предпосылки появления
До внедрения механизмов HA в HDFS существовала только одноузловая архитектура, где NameNode хранил метаданные всей файловой системы (образ файловой системы — fsimage, и журнал операций — edits). При сбое NameNode кластер переходил в состояние «безопасного режима» (Safe Mode), и для восстановления требовалось:
- Перезапустить NameNode на том же узле или вручную поднять резервную копию из последнего сохранённого состояния.
- Восстановить журнал операций из вторичного NameNode (Secondary NameNode), который не был горячим резервом, а лишь периодически объединял fsimage и edits.
Этот процесс мог занимать от нескольких минут до часов, что было неприемлемо для критичных бизнес-приложений, работающих в реальном времени (например, для систем обработки потоковых данных или OLAP-запросов).
Начиная с Hadoop 2.0 (2012 год), в HDFS была введена поддержка High Availability. Первоначально HA реализовывалась с использованием общего хранилища (Shared Storage) — например, Network File System (NFS) или Quorum Journal Manager (QJM). Позднее, в Hadoop 3.x, появилась альтернативная реализация на основе Observer NameNode и механизма «Standby Reads».
Архитектура HDFS High Availability
Основные компоненты
Архитектура HA в HDFS базируется на следующих элементах:
- Active NameNode — основной узел, обрабатывающий все клиентские запросы (чтение, запись, управление метаданными). Он активно записывает изменения в журнал операций (edits log).
- Standby NameNode — резервный узел, который синхронизирует состояние с Active NameNode. Он не обслуживает клиентские запросы на запись, но может поддерживать кэш метаданных для чтения (в некоторых реализациях). При сбое Active NameNode Standby NameNode берёт на себя роль активного.
- Quorum Journal Manager (QJM) — кластер из нечётного числа (обычно 3 или 5) узлов-журналистов (JournalNodes), которые хранят журнал операций. Active NameNode записывает записи в QJM, а Standby NameNode непрерывно читает их, поддерживая метаданные в актуальном состоянии. QJM использует протокол Paxos для обеспечения согласованности.
- ZKFailoverController (ZKFC) — процесс, работающий на каждом узле NameNode. Он взаимодействует с ZooKeeper (система распределённой координации) для выбора активного NameNode и мониторинга его здоровья. ZKFC также управляет переключением (failover) при сбое.
Принцип работы
- Нормальный режим: Active NameNode обрабатывает запросы клиентов, записывает изменения в журнал операций в QJM. Standby NameNode читает этот журнал и применяет изменения к своей копии метаданных.
- Обнаружение сбоя: ZKFC на Active NameNode периодически отправляет «heartbeat» (сигнал жизнеспособности) в ZooKeeper. Если heartbeat пропадает (например, из-за сбоя узла или сетевой проблемы), ZooKeeper инициирует процедуру выбора нового активного узла.
- Переключение (failover): ZKFC на Standby NameNode получает уведомление от ZooKeeper, активирует свой NameNode (переводит его в состояние Active), и тот начинает принимать клиентские запросы. Процесс занимает от нескольких секунд до минуты.
- Восстановление после сбоя: После восстановления исходного Active NameNode он автоматически переводится в режим Standby и синхронизирует состояние с текущим Active.
Режимы работы и конфигурации
Автоматический и ручной failover
- Автоматический failover — реализуется с помощью ZooKeeper и ZKFC. При сбое Active NameNode переключение происходит без участия администратора. Требуется настройка кластера ZooKeeper (не менее 3 узлов).
- Ручной failover — администратор вручную запускает переключение (например, с помощью команды
hdfs haadmin -failover). Используется в сценариях, где автоматическое переключение нежелательно (например, при плановом обслуживании).
Shared Storage vs. QJM
- Shared Storage (NFS): устаревший метод, где Active и Standby NameNode используют общее сетевое хранилище для хранения журнала операций. Недостатки: зависимость от NFS-сервера (сам по себе единая точка отказа), проблемы с производительностью и согласованностью.
- Quorum Journal Manager (QJM): современный и рекомендуемый метод. Журнал операций распределён между несколькими JournalNodes, что обеспечивает отказоустойчивость и высокую производительность. QJM использует протокол кворума (не менее 2 из 3 узлов должны быть доступны для записи).
Особенности и ограничения
Преимущества
- Минимизация времени простоя: переключение занимает секунды, а не часы, как в классической архитектуре.
- Прозрачность для клиентов: после настройки клиентских библиотек (HDFS Client) переключение происходит автоматически — клиент перенаправляет запросы на новый Active NameNode.
- Поддержка «горячей» замены: Standby NameNode может использоваться для чтения данных (в Hadoop 3.x с Observer NameNode), что увеличивает пропускную способность кластера.
Недостатки и риски
- Сложность настройки: требуется развёртывание ZooKeeper и JournalNodes, а также тщательная настройка параметров таймаутов и сетевой конфигурации.
- Зависимость от ZooKeeper: сбой кластера ZooKeeper (например, потеря кворума) может привести к тому, что failover не сработает.
- Риск «split-brain» (разделение мозга): в редких случаях оба NameNode могут одновременно считать себя активными. Для предотвращения этого используются механизмы ограждения (fencing) — например, отключение дисков или сетевых интерфейсов старого Active NameNode.
- Производительность: запись в QJM (журнал операций) вносит небольшую задержку по сравнению с записью в локальный диск, что может быть критично для кластеров с очень высокой нагрузкой на метаданные.
Применение
HDFS High Availability широко используется в корпоративных развёртываниях Hadoop, где требуется непрерывная работа хранилища данных. Примеры:
- Хранилища данных (Data Lakes) — в компаниях, обрабатывающих большие объёмы данных (например, в финансовом секторе, телекоммуникациях, ритейле).
- Системы реального времени — для обработки потоковых данных (Apache Spark Streaming, Apache Flink), где простой кластера недопустим.
- Критичные ETL-процессы — в конвейерах данных, где сбой NameNode может остановить загрузку и трансформацию данных на часы.
Альтернативы и развитие
В Hadoop 3.x появилась концепция Observer NameNode, который может обслуживать запросы на чтение, разгружая Active NameNode. Это развитие HA, позволяющее масштабировать производительность чтения метаданных. Также существуют сторонние решения, такие как Apache Hadoop Federation (разделение метаданных между несколькими NameNode), но они решают другую задачу — масштабирование, а не отказоустойчивость.
В облачных средах (например, Amazon EMR, Azure HDInsight) HA часто реализуется на уровне управляемых сервисов, где провайдер автоматически обеспечивает отказоустойчивость NameNode без необходимости ручной настройки.
Источники
- Apache Hadoop Documentation — «HDFS High Availability» (https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html)
- White, T. (2015). Hadoop: The Definitive Guide (4th ed.). O'Reilly Media.
- Lam, C. (2010). Hadoop in Action. Manning Publications.
- Документация Apache ZooKeeper — «ZooKeeper Recipes and Solutions» (https://zookeeper.apache.org/doc/current/recipes.html)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →