Резервное копирование и восстановление данных в HBase
Обзор
Функциональность резервного копирования в HBase была добавлена в ADH версии 4.1.0 (HBase версии 2.6).
Эта функциональность предназначена для создания "холодных" копий данных, что является важнейшим элементом стратегии обеспечения бесперебойной работы и восстановления после сбоев. В отличие от репликации, которая создает "горячие" копии, резервные копии хранятся во внешнем хранилище и требуют ручных процедур восстановления, что обеспечивает защиту от катастрофических сбоев.
Ключевые понятия
Функциональность резервного копирования в HBase использует следующие термины и понятия:
- 
Полная резервная копия — содержит полное состояние таблицы на момент создания. Служит основой для последующих инкрементальных резервных копий. 
- 
Инкрементальная резервная копия — содержит только изменения из WAL относительно последней полной или инкрементальной резервной копии. Эффективна с точки зрения объема и позволяет восстановить данные на определенный момент времени. 
- 
Набор резервных копий — именованная группа таблиц для упрощения управления операциями резервного копирования и восстановления. Рекомендуется сохранять резервные копии каждого набора по выделенному пути. 
- 
Идентификатор резервной копии — уникальный идентификатор (основанный на времени эпохи Unix), присваиваемый каждому сеансу резервного копирования. 
- 
Слияние инкрементов — возможность объединения нескольких успешных резервных копий в одну. 
Архитектурные стратегии развертывания
Для резервного копирования данных в HBase можно использовать следующие архитектурные стратегии развертывания:
- 
Внутри кластера — резервные копии хранятся в том же HDFS-кластере. Подходит только для тестирования и не обеспечивает отказоустойчивости. 
- 
Выделенный кластер — резервные копии создаются в отдельном HDFS-кластере, часто с более дешевой аппаратной конфигурацией. Рекомендуется для производственных сред, обеспечивает географическое разделение. 
- 
Облачное хранилище — резервные копии сохраняются в облаке (например, S3) или в HDFS-совместимой системе хранения (через S3A, WebHDFS). Наиболее отказоустойчивый вариант. 
Конфигурация
Чтобы настроить функцию резервного копирования в HBase, выполните следующее:
- 
Откройте веб-интерфейс ADCM и выберите ваш кластер ADH. 
- 
Перейдите в раздел Services → HBase → Primary configuration и активируйте переключатель Show advanced. 
- 
Откройте секцию настроек hbase-site.xml и установите значение trueдля параметра hbase.backup.enable.
- 
Проверьте следующие параметры и убедитесь, что они имеют соответствующие значения: - 
hbase.master.logcleaner.plugins — org.apache.hadoop.hbase.backup.master.BackupLogCleaner. Вы также можете добавить к этому параметру другие классы менеджера процедур резервного копирования, разделяя их запятыми. То же самое можно сделать для всех следующих параметров в этом списке.
- 
hbase.procedure.master.classes — org.apache.hadoop.hbase.backup.master.LogRollMasterProcedureManager.
- 
hbase.procedure.regionserver.classes — org.apache.hadoop.hbase.backup.regionserver.LogRollRegionServerProcedureManager.
- 
hbase.coprocessor.region.classes — org.apache.hadoop.hbase.backup.BackupObserver.
- 
hbase.coprocessor.master.classes — org.apache.hadoop.hbase.backup.BackupMasterObserver.
- 
hbase.master.hfilecleaner.plugins — org.apache.hadoop.hbase.backup.BackupHFileCleaner.
 
- 
- 
Сохраните конфигурацию, нажав Save → Create, и перезапустите сервис, нажав Actions → Reconfig and graceful restart. 
Ограничения
Функциональность резервного копирования в HBase имеет следующие ограничения:
- 
Последовательное выполнение. Невозможно запустить несколько операций резервного копирования или восстановления одновременно. 
- 
Невозможность отмены. Запущенные операции резервного копирования или восстановления нельзя отменить. 
- 
Права суперпользователя. Все операции выполняются от имени суперпользователя HBase. 
- 
Восстановление только в онлайн-кластер. Целевой кластер для восстановления должен работать и быть доступен. 
- 
Единое место назначения. Резервная копия может быть сохранена только в одном месте. Дублирование резервной копии требует ручных действий. 
- 
Увеличение WAL. Инкрементальные резервные копии предотвращают удаление файлов WAL перед следующим резервным копированием, что может привести к увеличению объема данных в HDFS. Необходимо внимательно следить за расписанием и хранилищем. 
- 
Прозрачное шифрование данных (Transparent Data Encryption, TDE). Функциональность не тестировалась в кластерах с включенным шифрованием данных. 
- 
Восстановление в другом кластере. При копировании резервной копии на другой кластер восстановление будет возможным, но после этого вам понадобится полная резервная копия для создания истории. 
Основные команды
Функциональность резервного копирования HBase использует следующие основные команды:
- 
Создание набора таблиц для гранулярной конфигурации резервного копирования: $ hbase backup set add <set_name1> <table1>,<table2> $ hbase backup set add <set_name2> <table3>
- 
Создание полной и инкрементальной резервной копии для разных наборов: $ hbase backup create full hdfs://<nn>:8020/tmp/backups-path1/ -w 3 -s <set_name1> -d $ hbase backup create full hdfs://<nn>:8020/tmp/backups-path2/ -w 3 -s <set_name2> -d $ hbase backup create incremental hdfs://<nn>:8020/tmp/backups-path1/ -w 3 -s <set_name1> -d $ hbase backup create incremental hdfs://<nn>:8020/tmp/backups-path2/ -w 3 -s <set_name2> -d
- 
Просмотр истории резервного копирования: $ hbase backup history
- 
Слияние резервных копий: $ hbase backup merge <backup_increment_id1>,<backup_increment_id2>,<backup_increment_id3>Идентификаторы можно найти в истории или в корневой директории резервных копий в файловой системе. 
- 
Восстановление: $ hbase restore hdfs://<nn>:8020/tmp/backups-path2/ <backup_id> -o -s <set_name2> -d
Примеры
HBase
Этот пример показывает функциональность резервного копирования в HBase без Phoenix.
- 
Создайте исходную таблицу: $ hbase shellcreate 'user_activity', 'cf1', 'cf2' put 'user_activity', 'user1', 'cf1:name', 'Alice' put 'user_activity', 'user1', 'cf1:email', 'alice@email.com' put 'user_activity', 'user1', 'cf2:last_login', '2024-01-15' put 'user_activity', 'user1', 'cf2:login_count', '5' put 'user_activity', 'user2', 'cf1:name', 'Bob' put 'user_activity', 'user2', 'cf1:email', 'bob@email.com' put 'user_activity', 'user2', 'cf2:last_login', '2024-01-14' put 'user_activity', 'user2', 'cf2:login_count', '3' put 'user_activity', 'user3', 'cf1:name', 'Charlie' put 'user_activity', 'user3', 'cf1:email', 'charlie@email.com' put 'user_activity', 'user3', 'cf2:last_login', '2024-01-13' put 'user_activity', 'user3', 'cf2:login_count', '7'
- 
Выйдите из командной оболочки hbaseи создайте набор резервных копий:exit$ hbase backup set add user_backup_set user_activity
- 
Создайте полную резервную копию: $ hbase backup create full hdfs://tmp/hbase-backup -s user_backup_set -w 3
- 
Добавьте новые данные: $ hbase shellput 'user_activity', 'user4', 'cf1:name', 'Diana' put 'user_activity', 'user4', 'cf1:email', 'diana@email.com' put 'user_activity', 'user4', 'cf2:last_login', '2024-01-16' put 'user_activity', 'user4', 'login_count', '2' put 'user_activity', 'user1', 'cf2:login_count', '6' put 'user_activity', 'user2', 'cf2:last_login', '2024-01-16'
- 
Выйдите из командной оболочки hbaseи создайте инкрементальную резервную копию:exit$ hbase backup create incremental hdfs://tmp/hbase-backup -s user_backup_set -w 3
- 
Добавьте еще новых данных и создайте вторую инкрементальную резервную копию: $ hbase shellput 'user_activity', 'user5', 'cf1:name', 'Eve' put 'user_activity', 'user5', 'cf1:email', 'eve@email.com' deleteall 'user_activity', 'user3' put 'user_activity', 'user1', 'cf2:login_count', '7' exit$ hbase backup create incremental hdfs://tmp/hbase-backup -s user_backup_set -w 3
- 
Проверьте историю и описание: $ hbase backup history -s user_backup_set $ hbase backup describe <backup_id>
- 
Имитируйте потерю данных: $ hbase shelldisable 'user_activity' drop 'user_activity'
- 
Выйдите из командной оболочки hbaseи восстановите данные:exit$ hbase restore hdfs://tmp/hbase-backup <backup_id> -s user_backup_setДанные можно восстановить на момент любой точки во времени, в которой была создана одна из предыдущих резервных копий. 
Phoenix
Этот пример показывает функциональность резервного копирования в Phoenix.
- 
Запустите скрипт /usr/lib/phoenix/bin/sqlline.py и создайте исходную таблицу: CREATE TABLE USER_ACTIVITY ( USER_ID VARCHAR PRIMARY KEY, NAME VARCHAR, EMAIL VARCHAR, LAST_LOGIN DATE, LOGIN_COUNT INTEGER ) COMPRESSION='SNAPPY', SALT_BUCKETS=4;
- 
Загрузите данные в таблицу: UPSERT INTO USER_ACTIVITY VALUES ('user1', 'Alice', 'alice@email.com', TO_DATE('2024-01-15'), 5); UPSERT INTO USER_ACTIVITY VALUES ('user2', 'Bob', 'bob@email.com', TO_DATE('2024-01-14'), 3); UPSERT INTO USER_ACTIVITY VALUES ('user3', 'Charlie', 'charlie@email.com', TO_DATE('2024-01-13'), 7);
- 
Нажмите Ctrl+Dи создайте набор резервных копий. Для таблиц Phoenix требуются дополнительные системные таблицы. Вам может понадобиться большее их количество, например, если используются индексы. Поэтому резервные копии таблиц Phoenix лучше хранить в одном наборе:$ hbase backup set add phoenix_backup_set USER_ACTIVITY,SYSTEM.CATALOG,SYSTEM.SEQUENCE,SYSTEM.STATS
- 
Создайте полную резервную копию: $ hbase backup create full hdfs://tmp/hbase-backup -s phoenix_backup_set -w 3
- 
Снова запустите скрипт /usr/lib/phoenix/bin/sqlline.py и добавьте новые данные: UPSERT INTO USER_ACTIVITY VALUES ('user4', 'Alice', 'alice@email.com', TO_DATE('2024-01-15'), 5); UPSERT INTO USER_ACTIVITY VALUES ('user5', 'Bob', 'bob@email.com', TO_DATE('2024-01-14'), 3); UPSERT INTO USER_ACTIVITY VALUES ('user6', 'Charlie', 'charlie@email.com', TO_DATE('2024-01-13'), 7);
- 
Нажмите Ctrl+Dи создайте инкрементальную копию:$ hbase backup create incremental hdfs://tmp/hbase-backup -s phoenix_backup_set -w 3
- 
Снова запустите скрипт /usr/lib/phoenix/bin/sqlline.py и добавьте еще новых данных: UPSERT INTO USER_ACTIVITY VALUES ('user7', 'Alice', 'alice@email.com', TO_DATE('2024-01-15'), 5); UPSERT INTO USER_ACTIVITY VALUES ('user8', 'Bob', 'bob@email.com', TO_DATE('2024-01-14'), 3); UPSERT INTO USER_ACTIVITY VALUES ('user9', 'Charlie', 'charlie@email.com', TO_DATE('2024-01-13'), 7);
- 
Нажмите Ctrl+Dи создайте вторую инкрементальную копию:$ hbase backup create incremental hdfs://tmp/hbase-backup -s phoenix_backup_set -w 3
- 
Проверьте историю: $ hbase backup history -s user_backup_set $ hbase backup describe <backup_id>
- 
Снова запустите скрипт /usr/lib/phoenix/bin/sqlline.py и имитируйте потерю данных: DROP TABLE USER_ACTIVITY;
- 
Нажмите Ctrl+Dи восстановите данные:$ hbase restore hdfs://tmp/hbase-backup <backup_id> -s phoenix_backup_setДанные можно восстановить на момент любой точки во времени, в которой была создана одна из предыдущих резервных копий.