Использование снепшотов для резервного копирования и восстановления данных в HBase

Обзор

Снепшоты в HBase — это функциональность, позволяющая делать резервное копирование данных с минимально возможным влиянием на производительность HBase. При создании снепшота таблицы не выполняется копирование данных, а сама таблица остается доступной для операций с данными. Экспорт снепшота в другой кластер выполняется без участия серверов регионов и Master-сервера с помощью утилиты, основанной на distcp. При необходимости таблица может быть быстро восстановлена из снепшота.

Снепшот по сути представляет собой набор метаданных: схема таблицы и указатели на HFile, содержащие данные таблицы. HFile после создания не может быть изменен никаким образом, кроме удаления. HFile, содержащие данные таблицы, становятся связанными со снепшотом в момент его создания. Если HFile, связанный со снепшотом, подвергается сжатию, то вместо удаления он помещается в архив. HFile, связанные со снепшотом, существуют все время существования этого снепшота для возможности извлечения информации и восстановления соответствующей таблицы. Тот же принцип относится к клонам снепшотов, которые являются таблицами, восстановленными из снепшота, но независимыми от оригинальных таблиц: пока существует клон — связанные с его снепшотом HFile также существуют. Поэтому необходимо использование политики ротации для снепшотов и их клонов во избежание исчерпания пространства на дисках.

ПРИМЕЧАНИЕ
Более подробную информацию о командах HBase shell, используемых для операций со снепшотами, можно получить в разделе Команды HBase shell → Snapshots commands.

Использование

Для показанных ниже примеров будет использоваться небольшая тестовая таблица articles, процесс создания которой описан в статье Начало работы с HBase shell. Выполните Шаг 1 и Шаг 3 из неё, если вы хотите попробовать выполнить эти примеры самостоятельно.

Приведенные примеры соответствуют следующему жизненному циклу снепшота:

  1. Создание снепшота и проверка его существования.

  2. Восстановление таблицы из снепшота после внесения в неё изменений.

  3. Экспорт снепшота в другой кластер HBase и восстановление таблицы из него.

  4. Удаление снепшота.

Все команды выполняются в консоли HBase shell, если не указано иное.

Создание снепшота

Используйте команду snapshot, чтобы создать снепшот таблицы. Пример:

snapshot 'articles', 'articles_snp'

Используйте команду list_snapshots, если вы хотите просмотреть все снепшоты, или команду list_table_snapshots, если вы хотите просмотреть снепшоты заданной таблицы. Пример:

list_table_snapshots 'articles'

Вывод команды будет выглядеть следующим образом:

SNAPSHOT                                     TABLE + CREATION TIME
 articles_snp                                articles (2024-11-01 08:11:25 UTC)
1 row(s)
Took 0.0528 seconds
=> ["articles_snp"]

Восстановление данных из снепшота

После создания снепшота измените данные в таблице любым образом. Например, можно полностью удалить одну строку и добавить другую. Пример:

deleteall 'articles', 'article2'
put 'articles', 'article3', 'basic:author', 'King'
put 'articles', 'article3', 'basic:header', 'Test article3'
put 'articles', 'article3', 'tags:ref', true

Считайте данные из таблицы, чтобы убедиться, что данные изменились. Пример:

scan 'articles'

Вывод команды должен выглядеть следующим образом:

ROW                                          COLUMN+CELL
 article1                                    column=basic:author, timestamp=2024-11-01T08:03:55.730, value=Test author
 article1                                    column=basic:header, timestamp=2024-11-01T08:03:55.758, value=Test article
 article1                                    column=tags:arch, timestamp=2024-11-01T08:03:55.776, value=true
 article1                                    column=tags:concepts, timestamp=2024-11-01T08:03:55.794, value=true
 article1                                    column=tags:tutorials, timestamp=2024-11-01T08:03:58.771, value=true
 article3                                    column=basic:author, timestamp=2024-11-01T08:19:36.078, value=King
 article3                                    column=basic:header, timestamp=2024-11-01T08:19:36.093, value=Test article3
 article3                                    column=tags:ref, timestamp=2024-11-01T08:19:37.856, value=true
2 row(s)
Took 0.0638 seconds

Используйте команду restore_snapshot для восстановления таблицы, но сперва сделайте её недоступной для операций с данными. Пример:

disable 'articles'
restore_snapshot 'articles_snp'

Сделайте таблицу вновь доступной и считайте данные из неё, чтобы убедиться, что восстановление сработало. Пример:

enable 'articles'
scan 'articles'

Вывод команды должен выглядеть следующим образом:

ROW                                          COLUMN+CELL
 article1                                    column=basic:author, timestamp=2024-11-01T08:03:55.730, value=Test author
 article1                                    column=basic:header, timestamp=2024-11-01T08:03:55.758, value=Test article
 article1                                    column=tags:arch, timestamp=2024-11-01T08:03:55.776, value=true
 article1                                    column=tags:concepts, timestamp=2024-11-01T08:03:55.794, value=true
 article1                                    column=tags:tutorials, timestamp=2024-11-01T08:03:58.771, value=true
 article2                                    column=basic:author, timestamp=2024-11-01T08:04:19.531, value=Test author2
 article2                                    column=basic:header, timestamp=2024-11-01T08:04:19.554, value=Test article2
 article2                                    column=tags:ref, timestamp=2024-11-01T08:04:20.802, value=true
2 row(s)
Took 0.0387 seconds

Экспорт снепшота

Снепшот можно экспортировать в другой кластер и восстановить таблицу в нем. Для этого сначала подключитесь к узлу HBase исходного кластера через SSH и переключитесь на пользователя hbase, а затем выполните экспорт. Команда экспорта имеет следующий синтаксис:

$ hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot <snapshot_name> -copy-to hdfs://<namenode_active>:<port><hbase_dir> -mappers <map_number>

где:

  • <snapshot_name> — имя экспортируемого снепшота;

  • <namenode_active> — сетевой адрес активного сервера NameNode в кластере назначения (используйте команду hdfs haadmin -getAllServiceState, чтобы узнать, какой сервер является активным);

  • <port> — номер порта сервера NameNode (8020 по умолчанию);

  • <hbase_dir> — домашняя директория HBase: значение параметра zookeeper.znode.parent в конфигурационном файле hbase-site.xml кластера назначения (/hbase по умолчанию);

  • <map_number> — количество экземпляров метода map (мапперов) для выполнения задачи экспорта.

Пример:

$ sudo -u hbase bash
$ hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot articles_snp -copy-to hdfs://av-adh-backup-1.ru-central1.internal:8020/hbase -mappers 4

Перейдите в консоль HBase shell кластера назначения и восстановите таблицу из снепшота:

restore_snapshot 'articles_snp'
ПРИМЕЧАНИЕ
В этом случае восстановленная таблица уже доступна для операций с данными.

Ротация снепшотов

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

delete_snapshot 'articles_snp'

Также можно удалить все снепшоты заданной таблицы с помощью команды delete_table_snapshots или удалить все снепшоты, чьи имена соответствуют заданному регулярному выражению, с помощью команды delete_all_snapshot.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней