Перейти к основному содержанию
Перейти к основному содержанию

Резервное копирование и восстановление в ClickHouse

В этом разделе в общих чертах рассматриваются операции резервного копирования и восстановления в ClickHouse. Более подробное описание каждого метода резервного копирования см. на страницах соответствующих методов в боковой панели.

Введение

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

Во многих случаях такие ошибки затронут все реплики. В ClickHouse есть встроенные механизмы безопасности для предотвращения некоторых типов ошибок, например, по умолчанию вы не можете просто удалить таблицы с движком семейства MergeTree, содержащие более 50 Гб данных. Однако эти механизмы не охватывают все возможные случаи, и проблемы все равно могут возникать.

Чтобы эффективно снизить риск человеческих ошибок, следует заранее тщательно подготовить стратегию резервного копирования и восстановления данных.

У каждой компании свои доступные ресурсы и бизнес‑требования, поэтому не существует универсального решения для резервного копирования и восстановления ClickHouse, подходящего для любой ситуации. То, что работает для одного гигабайта данных, скорее всего, не будет работать для десятков петабайт данных. Существует множество возможных подходов со своими плюсами и минусами, которые представлены в этом разделе документации. Имеет смысл использовать несколько подходов, а не только один, чтобы компенсировать их различные недостатки.

Примечание

Имейте в виду, что если вы что‑то сохранили в резервной копии, но ни разу не пробовали это восстановить, велика вероятность, что восстановление не сработает должным образом, когда оно действительно понадобится (или как минимум займет больше времени, чем бизнес может себе позволить). Поэтому, какой бы подход к резервному копированию вы ни выбрали, обязательно автоматизируйте и процесс восстановления и регулярно отрабатывайте его на запасном кластере ClickHouse.

На следующих страницах описаны различные методы резервного копирования и восстановления, доступные в ClickHouse:

СтраницаОписание
Резервное копирование/восстановление с использованием локального диска или диска S3Описывает резервное копирование/восстановление на локальный диск или S3‑диск и с них
Резервное копирование/восстановление с использованием S3 endpointОписывает резервное копирование/восстановление на конечную точку S3 и с нее
Резервное копирование/восстановление с использованием AzureBlobStorageОписывает резервное копирование/восстановление в хранилище BLOB Azure и из него
Альтернативные методыОписывает альтернативные методы резервного копирования

Резервные копии могут:

Типы резервных копий

Резервные копии могут быть полными или инкрементальными. Полные резервные копии представляют собой полную копию данных, тогда как инкрементальные содержат только изменения по сравнению с последней полной резервной копией.

Полные резервные копии просты, независимы (от других резервных копий) и являются надежным методом восстановления. Однако их создание может занимать много времени и требовать значительного объема дискового пространства. Инкрементальные резервные копии, напротив, более эффективны как по времени, так и по занимаемому пространству, но для восстановления данных требуется наличие всех резервных копий.

В зависимости от ваших потребностей вы можете использовать:

  • Полные резервные копии для небольших баз данных или критически важных данных.
  • Инкрементальные резервные копии для крупных баз данных или когда резервное копирование нужно выполнять часто и экономично.
  • Оба варианта, например, еженедельные полные резервные копии и ежедневные инкрементальные.

Синхронные и асинхронные резервные копии

Команды BACKUP и RESTORE также могут выполняться с модификатором ASYNC. В этом случае команда резервного копирования завершается немедленно, а процесс создания резервной копии продолжается в фоновом режиме. Если команды не помечены ASYNC, процесс резервного копирования выполняется синхронно, и выполнение команды блокируется до завершения резервного копирования.

Параллельные и последовательные резервные копии

По умолчанию ClickHouse разрешает параллельное создание и восстановление резервных копий. Это означает, что вы можете инициировать несколько операций резервного копирования или восстановления одновременно. Однако существуют серверные настройки, позволяющие запретить такое поведение. Если установить эти настройки в значение false, в кластере одновременно может выполняться только одна операция резервного копирования или восстановления. Это помогает избежать конкуренции за ресурсы и потенциальных конфликтов между операциями.

Чтобы запретить параллельное резервное копирование/восстановление, вы можете использовать следующие настройки:

<clickhouse>
    <backups>
        <allow_concurrent_backups>false</allow_concurrent_backups>
        <allow_concurrent_restores>false</allow_concurrent_restores>
    </backups>
</clickhouse>

Значение по умолчанию для обоих параметров — true, поэтому по умолчанию параллельные операции резервного копирования и восстановления разрешены. Если эти настройки на кластере имеют значение false, одновременно в кластере может выполняться только одна операция резервного копирования или восстановления.

Сжатые и несжатые бэкапы

Бэкапы ClickHouse поддерживают сжатие, настраиваемое через параметры compression_method и compression_level.

При создании бэкапа вы можете указать:

BACKUP TABLE test.table
  TO Disk('backups', 'filename.zip')
  SETTINGS compression_method='lzma', compression_level=3

Использование именованных коллекций

Именованные коллекции позволяют хранить пары ключ-значение (например, учетные данные S3, endpoints и настройки), которые можно повторно использовать в операциях резервного копирования и восстановления. Они помогают:

  • Скрывать учетные данные от пользователей без административного доступа
  • Упрощать команды за счет централизованного хранения сложной конфигурации
  • Поддерживать согласованность во всех операциях
  • Избегать раскрытия учетных данных в журналах запросов

См. раздел "именованные коллекции" для получения дополнительной информации.

Резервное копирование системных таблиц, таблиц логов или таблиц управления доступом

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

Системные таблицы, которые хранят исторические данные, например, с суффиксом _log (такие как query_log, part_log), можно сохранять в резервную копию и восстанавливать как любые другие таблицы. Если ваш сценарий опирается на анализ исторических данных — например, использование query_log для отслеживания производительности запросов или отладки проблем — рекомендуется включать эти таблицы в стратегию резервного копирования. Однако, если исторические данные из этих таблиц не требуются, их можно исключить для экономии места, занимаемого резервными копиями.

Системные таблицы, связанные с управлением доступом, такие как users, roles, row_policies, settings_profiles и quotas, обрабатываются особым образом при операциях резервного копирования и восстановления. Когда эти таблицы включены в резервную копию, их содержимое экспортируется в специальный файл accessXX.txt, который содержит эквивалентные SQL-операторы для создания и настройки сущностей доступа. При восстановлении процесс восстановления интерпретирует эти файлы и повторно применяет SQL-команды для воссоздания пользователей, ролей и других конфигураций. Данная возможность обеспечивает резервное копирование и восстановление конфигурации управления доступом к кластеру ClickHouse как части общей конфигурации кластера.

Эта функциональность работает только для конфигураций, управляемых через SQL-команды (называемых "SQL-driven Access Control and Account Management"). Конфигурации доступа, определённые в конфигурационных файлах сервера ClickHouse (например, users.xml), не включаются в резервные копии и не могут быть восстановлены этим способом.

Общий синтаксис

-- основные команды
BACKUP | RESTORE [ASYNC]
--- что включить в резервную копию/восстановление (или исключить)
TABLE [db.]table_name           [AS [db.]table_name_in_backup] |
DICTIONARY [db.]dictionary_name [AS [db.]name_in_backup] |
DATABASE database_name          [AS database_name_in_backup] |
TEMPORARY TABLE table_name      [AS table_name_in_backup] |
VIEW view_name                  [AS view_name_in_backup] |
[EXCEPT TABLES ...] |
ALL [EXCEPT {TABLES|DATABASES}...] } [,...]
--- 
[ON CLUSTER 'cluster_name']
--- куда сохранять резервную копию или откуда выполнять восстановление
TO|FROM 
File('<path>/<filename>') | 
Disk('<disk_name>', '<path>/') | 
S3('<S3 endpoint>/<path>', '<Access key ID>', '<Secret access key>', '<extra_credentials>') |
AzureBlobStorage('<connection string>/<url>', '<container>', '<path>', '<account name>', '<account key>')
--- дополнительные настройки
[SETTINGS ...]

Дополнительные сведения о каждой команде см. в разделе "краткий обзор команд".

Краткое описание команд

Каждая из приведённых выше команд описана ниже подробнее:

КомандаОписание
BACKUPСоздаёт резервную копию указанных объектов
RESTOREВосстанавливает объекты из резервной копии
[ASYNC]Выполняет операцию асинхронно (немедленно возвращает идентификатор, по которому можно отслеживать выполнение)
TABLE [db.]table_name [AS [db.]table_name_in_backup]Создаёт/восстанавливает резервную копию конкретной таблицы (таблица может быть переименована)
[PARTITION[S] partition_expr [,...]]Создаёт/восстанавливает резервную копию только указанных партиций таблицы
DICTIONARY [db.]dictionary_name [AS [db.]name_in_backup]Создаёт/восстанавливает резервную копию объекта-словаря
DATABASE database_name [AS database_name_in_backup]Создаёт/восстанавливает резервную копию всей базы данных (база может быть переименована)
TEMPORARY TABLE table_name [AS table_name_in_backup]Создаёт/восстанавливает резервную копию временной таблицы (таблица может быть переименована)
VIEW view_name [AS view_name_in_backup]Создаёт/восстанавливает резервную копию представления (представление может быть переименовано)
[EXCEPT TABLES ...]Исключает определённые таблицы при создании резервной копии базы данных
ALLСоздаёт/восстанавливает резервные копии всего (всех баз данных, таблиц и т. д.). До версии 23.4 ClickHouse ALL применялось только к команде RESTORE.
[EXCEPT {TABLES|DATABASES}...]Исключает определённые таблицы или базы данных при использовании ALL
[ON CLUSTER 'cluster_name']Выполняет резервное копирование/восстановление на кластере ClickHouse
TO|FROMНаправление: TO — место назначения резервной копии, FROM — источник восстановления
File('<path>/<filename>')Сохраняет в локальную файловую систему / восстанавливает из неё
Disk('<disk_name>', '<path>/')Сохраняет на настроенный диск / восстанавливает с него
S3('<S3 endpoint>/<path>', '<Access key ID>', '<Secret access key>')Сохраняет в Amazon S3 или S3-совместимое хранилище / восстанавливает из него
[SETTINGS ...]Полный список настроек см. ниже

Настройки

Общие настройки резервного копирования/восстановления

НастройкаОписаниеЗначение по умолчанию
idИдентификатор операции резервного копирования или восстановления; если он не указан, генерируется случайный UUID. Если уже выполняется операция с тем же идентификатором, будет выброшено исключение.
compression_methodУказывает метод сжатия для резервной копии. См. раздел «Кодеки сжатия столбцов»
compression_levelЗадает уровень сжатия резервной копии
passwordПароль к файлу на диске.
base_backupМесто размещения базовой резервной копии, используемой для инкрементных резервных копий. Например: Disk('backups', '1.zip')
use_same_password_for_base_backupОпределяет, будет ли архив базовой резервной копии наследовать пароль, указанный в запросе.
structure_onlyЕсли включено, выполняет резервное копирование или восстановление только операторов CREATE без собственно данных таблиц.
storage_policyПолитика хранения данных для восстанавливаемых таблиц. См. раздел «Использование нескольких блочных устройств для хранения данных». Применимо только к команде RESTORE. Применяется только к таблицам с движком из семейства MergeTree.
allow_non_empty_tablesПозволяет оператору RESTORE TABLE вставлять данные в непустые таблицы. В результате существующие данные в таблице будут смешаны с данными, извлечёнными из резервной копии. Поэтому эта настройка может привести к дублированию данных в таблице, используйте её с осторожностью.0
backup_restore_keeper_max_retriesМаксимальное количество повторных попыток выполнения операций [Zoo]Keeper во время операции BACKUP или RESTORE. Должно быть достаточно большим, чтобы вся операция не завершилась неудачей из-за кратковременного сбоя [Zoo]Keeper.1000
backup_restore_keeper_retry_initial_backoff_msНачальный таймаут backoff для операций [Zoo]Keeper при выполнении резервного копирования или восстановления100
backup_restore_keeper_retry_max_backoff_msМаксимальный таймаут экспоненциальной задержки (backoff) для операций [Zoo]Keeper при резервном копировании или восстановлении5000
backup_restore_failure_after_host_disconnected_for_secondsЕсли во время операции BACKUP ON CLUSTER или RESTORE ON CLUSTER хост не воссоздаёт свой эфемерный узел alive в ZooKeeper в течение этого времени, то вся операция резервного копирования или восстановления считается завершившейся с ошибкой. Это значение должно быть больше любого разумного времени, необходимого хосту для повторного подключения к ZooKeeper после сбоя. Ноль означает отсутствие ограничения по времени.3600
backup_restore_keeper_max_retries_while_initializingМаксимальное число повторных попыток операций в [Zoo]Keeper во время инициализации операции BACKUP ON CLUSTER или RESTORE ON CLUSTER.20
backup_restore_keeper_max_retries_while_handling_errorМаксимальное число повторных попыток операций с [Zoo]Keeper при обработке ошибки операции BACKUP ON CLUSTER или RESTORE ON CLUSTER.20
backup_restore_finish_timeout_after_error_secВремя, в течение которого инициатор должен ждать, пока другой хост не обработает узел 'error' и не остановит выполнение текущей операции BACKUP ON CLUSTER или RESTORE ON CLUSTER.180
backup_restore_keeper_value_max_sizeМаксимальный размер данных узла [Zoo]Keeper при создании резервной копии1048576
backup_restore_batch_size_for_keeper_multiМаксимальный размер пакета для операции multi в [Zoo]Keeper при резервном копировании или восстановлении1000
backup_restore_batch_size_for_keeper_multireadМаксимальный размер пакета для запроса multiread к [Zoo]Keeper при создании или восстановлении резервной копии10000
backup_restore_keeper_fault_injection_probabilityПриблизительная вероятность отказа запроса к Keeper во время резервного копирования или восстановления. Допустимые значения находятся в диапазоне [0.0f, 1.0f]0
backup_restore_keeper_fault_injection_seed0 — для случайного значения seed, иначе — значение параметра0
backup_restore_s3_retry_attemptsНастройка для Aws::Client::RetryStrategy: повторные попытки выполняются самим Aws::Client, 0 означает отсутствие повторных попыток. Применяется только для резервного копирования и восстановления.1000
max_backup_bandwidthМаксимальная скорость чтения в байтах в секунду для данной резервной копии на сервере. Ноль означает отсутствие ограничений.0
max_backups_io_thread_pool_sizeClickHouse использует потоки из пула Backups IO Thread для выполнения операций ввода-вывода при резервном копировании в S3. max_backups_io_thread_pool_size ограничивает максимальное количество потоков в этом пуле.1000
max_backups_io_thread_pool_free_sizeЕсли количество простаивающих потоков в пуле Backups IO Thread pool превышает max_backup_io_thread_pool_free_size, ClickHouse освободит ресурсы, занятые этими потоками, и уменьшит размер пула. При необходимости потоки могут быть созданы снова.0
backups_io_thread_pool_queue_sizeМаксимальное количество задач, которые могут быть поставлены в очередь пула потоков Backups IO Thread. Рекомендуется оставлять эту очередь неограниченной из-за текущей логики резервного копирования в S3. Примечание: значение 0 (по умолчанию) означает неограниченную очередь.0
backup_threadsМаксимальное число потоков, используемых при выполнении запросов BACKUP.
max_backup_bandwidth_for_serverМаксимальная скорость чтения в байтах в секунду для всех резервных копий на сервере. Ноль — без ограничений.0
shutdown_wait_backups_and_restoresЕсли установлено значение true, ClickHouse будет ожидать завершения выполняющихся операций резервного копирования и восстановления перед завершением работы.1

Специальные настройки для S3

SettingDescriptionDefault value
use_same_s3_credentials_for_base_backupДолжен ли базовый резервный бэкап в S3 наследовать учётные данные доступа из запроса. Работает только с S3.
s3_storage_classКласс хранилища, используемый для резервного копирования в S3. Например: STANDARD

Специальные настройки для Azure

SettingDescriptionDefault value
azure_attempt_to_create_containerПри использовании Azure Blob Storage определяет, следует ли создавать указанный контейнер, если он не существует.true

Администрирование и устранение неполадок

Команда резервного копирования возвращает id и status, и этот id можно использовать, чтобы узнать статус резервной копии. Это очень полезно для отслеживания прогресса длительных асинхронных (ASYNC) резервных копий. В примере ниже показан сбой, который произошёл при попытке перезаписать существующий файл резервной копии:

BACKUP TABLE helloworld.my_first_table TO Disk('backups', '1.zip') ASYNC
┌─id───────────────────────────────────┬─status──────────┐
│ 7678b0b3-f519-4e6e-811f-5a0781a4eb52 │ CREATING_BACKUP │
└──────────────────────────────────────┴─────────────────┘

1 строка в наборе. Затрачено: 0.001 сек.
SELECT
*
FROM system.backups
WHERE id='7678b0b3-f519-4e6e-811f-5a0781a4eb52'
FORMAT Vertical
Row 1:
──────
id:                7678b0b3-f519-4e6e-811f-5a0781a4eb52
name:              Disk('backups', '1.zip')
#highlight-next-line
status:            BACKUP_FAILED
num_files:         0
uncompressed_size: 0
compressed_size:   0
#highlight-next-line
error:             Код: 598. DB::Exception: Резервная копия Disk('backups', '1.zip') уже существует. (BACKUP_ALREADY_EXISTS) (версия 22.8.2.11 (официальная сборка))
start_time:        2022-08-30 09:21:46
end_time:          2022-08-30 09:21:46

Получена 1 строка. Затрачено: 0.002 сек.

Помимо таблицы system.backups все операции резервного копирования и восстановления также протоколируются в системной таблице журнала system.backup_log:

SELECT *
FROM system.backup_log
WHERE id = '7678b0b3-f519-4e6e-811f-5a0781a4eb52'
ORDER BY event_time_microseconds ASC
FORMAT Vertical
Строка 1:
──────
event_date:              2023-08-18
event_time_microseconds: 2023-08-18 11:13:43.097414
id:                      7678b0b3-f519-4e6e-811f-5a0781a4eb52
name:                    Disk('backups', '1.zip')
status:                  CREATING_BACKUP
error:
start_time:              2023-08-18 11:13:43
end_time:                1970-01-01 03:00:00
num_files:               0
total_size:              0
num_entries:             0
uncompressed_size:       0
compressed_size:         0
files_read:              0
bytes_read:              0

Строка 2:
──────
event_date:              2023-08-18
event_time_microseconds: 2023-08-18 11:13:43.174782
id:                      7678b0b3-f519-4e6e-811f-5a0781a4eb52
name:                    Disk('backups', '1.zip')
status:                  BACKUP_FAILED
#highlight-next-line
error:                   Code: 598. DB::Exception: Backup Disk('backups', '1.zip') already exists. (BACKUP_ALREADY_EXISTS) (version 23.8.1.1)
start_time:              2023-08-18 11:13:43
end_time:                2023-08-18 11:13:43
num_files:               0
total_size:              0
num_entries:             0
uncompressed_size:       0
compressed_size:         0
files_read:              0
bytes_read:              0

Получено 2 строки. Затрачено: 0.075 сек.