В процесі використання ClickHouse стало питання резервного копіювання та відновлення. Як то кажуть резервних копій багато не буває, тому крім aws volume snapshots потрібно налаштувати додатковий варіант. В ClickHouse для цього варіантів не багато, зручним вважаю використовувати чудовий інструмент як clickhouse-backup.
Підготовка
Для початку необхідно встановити його, подивитися останні версії можемо тут. Обираємо необхідний пакет або тип встановлення який зручніший для Вас. В моєму випадку буду встановлювати з rpm пакету на AMAZON Linux2. Завантажуємо на сервер ClickHouse використовуючи wget:
[root@clickhouse: ~]# wget https://github.com/AlexAkulov/clickhouse-backup/releases/download/v1.3.1/clickhouse-backup-1.3.1-1.x86_64.rpm
Далі потрібно налаштувати утиліту clickhouse-backup. Після встановлення створилась директорія /etc/clickhouse-backup/ в якій розташований приклад конфігураційного файлу config.yml.example, прочитаємо його використовуючи cat або самою утилітою яка роздрукує конфігурацію за замовчуванням:
[root@clickhouse: ~]# clickhouse-backup default-config general: remote_storage: none max_file_size: 1073741824 disable_progress_bar: true backups_to_keep_local: 0 backups_to_keep_remote: 0 log_level: info allow_empty_backups: false download_concurrency: 1 upload_concurrency: 1 restore_schema_on_cluster: "" upload_by_part: true download_by_part: true clickhouse: username: default password: "" host: localhost port: 9000 disk_mapping: {} skip_tables: - system.* - INFORMATION_SCHEMA.* - information_schema.* timeout: 5m freeze_by_part: false secure: false skip_verify: false sync_replicated_tables: false log_sql_queries: false config_dir: /etc/clickhouse-server/ restart_command: systemctl restart clickhouse-server ignore_not_exists_error_during_freeze: true debug: false s3: access_key: "" secret_key: "" bucket: "" endpoint: "" region: us-east-1 acl: private assume_role_arn: "" force_path_style: false path: "" disable_ssl: false compression_level: 1 compression_format: tar sse: "" disable_cert_verification: false storage_class: STANDARD concurrency: 1 part_size: 0 debug: false gcs: credentials_file: "" credentials_json: "" bucket: "" path: "" compression_level: 1 compression_format: tar debug: false endpoint: "" cos: url: "" timeout: 2m secret_id: "" secret_key: "" path: "" compression_format: tar compression_level: 1 debug: false api: listen: localhost:7171 enable_metrics: true enable_pprof: false username: "" password: "" secure: false certificate_file: "" private_key_file: "" create_integration_tables: false allow_parallel: false ftp: address: "" timeout: 2m username: "" password: "" tls: false path: "" compression_format: tar compression_level: 1 concurrency: 1 debug: false sftp: address: "" port: 22 username: "" password: "" key: "" path: "" compression_format: tar compression_level: 1 concurrency: 1 debug: false azblob: endpoint_suffix: core.windows.net account_name: "" account_key: "" sas: "" use_managed_identity: false container: "" path: "" compression_level: 1 compression_format: tar sse_key: "" buffer_size: 0 buffer_count: 3
Конфігураційний файл розділений на декілька блоків, в яких є короткий опис необхідних параметрів. Нас буде цікавити блок clickhouse, де потрібно додати логін і пароль користувача серверу clickhouse. Якщо розглянути детальніше, то маємо багато можливостей по віддаленому зберіганню резервних копій після їх створення і не тільки.
Нам необхідно або створити файл config.yml і заповнити його або скопіювати вже наявний config.yml.example в config.yml, обираємо другий варіант:
[root@clickhouse-1: /etc/clickhouse-backup]# cp config.example.yml config.yml
редагуємо файл config.yml, шукаємо блок clickhouse і додаємо ім’я користувача і пароль для підключення до clickhouse:
........ clickhouse: username: YOUR_CLICKHOUSE_USER password: "CLICKHOUSE_USER_PASS" host: localhost port: 9000 disk_mapping: {} skip_tables: - system.* - INFORMATION_SCHEMA.* - information_schema.* timeout: 5m freeze_by_part: false secure: false skip_verify: false sync_replicated_tables: false log_sql_queries: false config_dir: /etc/clickhouse-server/ restart_command: systemctl restart clickhouse-server ignore_not_exists_error_during_freeze: true debug: false .........
зберігаємо зміни, перевіряємо підключення утилітою clickhouse-backup до clickhouse:
[root@clickhouse: /etc/clickhouse-backup]# clickhouse-backup tables ********.****_events 643.97KiB default ********.****_****_events 0B default ********..****_****_enums. 0B default ********.**** 9.56MiB default ********.****_****_events 0B default ********.****_****_on_day 571.28KiB default ********.****_****_track 735.51KiB default ********.****_****_events 83.02KiB default ********.events 1.49MiB default
Перевірка підключення пройшла успішно, отримали список доступних таблиць. Переходимо до створення резервних копій).
Створення резервної копії
Будемо створювати локальні резервні копії, без переміщення до віддаленого сховища. Для створення повної копії баз використовуємо наступну команду:
[root@clickhouse: ~]# clickhouse-backup create 12-04-22-full-clickhouse-db 2022/04/11 13:49:05.447530 info done backup=11-04-22-full-db operation=create table=********.********_events 2022/04/11 13:49:05.452289 info done backup=11-04-22-full-db operation=create table=********.********_pipeline_events 2022/04/11 13:49:05.457037 info done backup=11-04-22-full-db operation=create table=********.******** 2022/04/11 13:49:05.477884 info done backup=11-04-22-full-db operation=create table=******** 2022/04/11 13:49:05.480613 info done backup=11-04-22-full-db operation=create table=********.**_********_events 2022/04/11 13:49:05.665248 info done backup=11-04-22-full-db operation=create table=********.tasks********_on_day 2022/04/11 13:49:05.869420 info done backup=11-04-22-full-db operation=create table=********.tasks******** 2022/04/11 13:49:05.878801 info done backup=11-04-22-full-db operation=create table=********.task********_events 2022/04/11 13:49:05.896916 info done backup=11-04-22-full-db operation=create table=********_events 2022/04/11 13:49:05.904683 info done backup=11-04-22-full-db duration=762ms operation=create
якщо необхідно утиліта дозволяє створити резервні копії окремих таблиць, як це зробити дивимося в help:
[root@clickhouse: ~]# clickhouse-backup create --help NAME: clickhouse-backup create - Create new backup USAGE: clickhouse-backup create [-t, --tables=<db>.<table>] [--partitions=<partition_names>] [-s, --schema] [--rbac] [--configs] <backup_name> ...
Утиліта дозволяє переглянути список створених копій:
[root@clickhouse: ~]# clickhouse-backup list 12-04-22-full-clickhouse-db 13.37MiB 12/04/2022 07:10:14 local
Взагалі рекомендую ознайомитись з доступними ключами та можливостями clickhouse-backup скориставшись ключем —help:
[root@clickhouse-1: ~]# clickhouse-backup --help ...... DESCRIPTION: Run as 'root' or 'clickhouse' user COMMANDS: tables Print list of tables create Create new backup create_remote Create and upload upload Upload backup to remote storage list Print list of backups download Download backup from remote storage restore Create schema and restore data from backup restore_remote Download and restore delete Delete specific backup default-config Print default config print-config Print current config clean Remove data in 'shadow' folder from all `path` folders available from `system.disks` server Run API server help, h Shows a list of commands or help for one command GLOBAL OPTIONS: --config FILE, -c FILE Config FILE name. (default: "/etc/clickhouse-backup/config.yml") [$CLICKHOUSE_BACKUP_CONFIG] --help, -h show help --version, -v print the version
За замовчуванням всі резервні копії створюються в директорії /var/lib/clickhouse/backup, переглянемо її місткість:
[root@clickhouse: /var/lib/clickhouse/backup/11-04-22-full-db]# ls -ll drwxr-x--- 4 995 clickhouse 4096 Apr 11 13:49 metadata -rw-r----- 1 995 clickhouse 1493 Apr 11 13:49 metadata.json drwxr-x--- 4 995 clickhouse 4096 Apr 11 13:49 shadow
де:
- metadata – в ньому знаходиться DDL SQL, який потрібний під час відновлення;
- shadow – данні баз даних, які отримали під час резервного копіювання;
Відновлення з резервної копії
Тепер видалимо базу day_track, щоб перевірити процес відновлення:
clickhouse :) show databases; SHOW DATABASES Query id: 200c8843-5822-4f04-a900-e141f30b5112 ┌─name───────────────┐ │ INFORMATION_SCHEMA │ │ anal***** │ │ default │ │ information_schema │ │ day │ │ ***_test. │ │ system │ │ ******** │ └────────────────────┘ 8 rows in set. Elapsed: 0.003 sec. clickhouse :) drop database day_track ; DROP DATABASE ***_track Query id: 5cc54913-0c3f-46c0-8672-95b634cdec0d Ok. 0 rows in set. Elapsed: 0.003 sec. clickhouse :) show databases; SHOW DATABASES Query id: 200c8843-5822-4f04-a900-e141f30b5112 ┌─name───────────────┐ │ INFORMATION_SCHEMA │ │ anal***** │ │ default │ │ information_schema │ │ ***_test. │ │ system │ │ ******** │ └────────────────────┘ 8 rows in set. Elapsed: 0.003 sec.
Для відновлення обираємо наш створений бекап 12-04-22-full-clickhouse-db і відновлюємо командою clickhouse-backup restore.
[root@clickhouse:]# clickhouse-backup restore 12-04-22-full-clickhouse-db 2022/04/12 07:34:31.262968 info done backup=12-04-22-full-clickhouse-db operation=restore table=*********.*****_events 2022/04/12 07:34:31.263025 info done backup=12-04-22-full-clickhouse-db operation=restore table=*********.*****_****_events 2022/04/12 07:34:31.263060 info done backup=12-04-22-full-clickhouse-db operation=restore table=*********.*****_events_enums 2022/04/12 07:34:31.271409 info done backup=12-04-22-full-clickhouse-db operation=restore table=********* 2022/04/12 07:34:31.271635 info done backup=12-04-22-full-clickhouse-db operation=restore table=*********.***_**_events 2022/04/12 07:34:31.966739 info done backup=12-04-22-full-clickhouse-db operation=restore table=*********.***** 2022/04/12 07:34:32.564075 info done backup=12-04-22-full-clickhouse-db operation=restore table=*********.***** 2022/04/12 07:34:32.568800 info done backup=12-04-22-full-clickhouse-db operation=restore table=*********.******_events 2022/04/12 07:34:32.606507 info done backup=12-04-22-full-clickhouse-db operation=restore table=*********_******.events 2022/04/12 07:34:32.606544 info done backup=12-04-22-full-clickhouse-db duration=1.502s operation=restore 2022/04/12 07:34:32.606559 info done backup=12-04-22-full-clickhouse-db operation=restore
підключаємось до clickhouse, перевіряємо список баз даних:
[root@clickhouse:]# clickhouse-client -u *** --password ***** ClickHouse client version 22.2.2.1. Connecting to localhost:9000 as user ****. Connected to ClickHouse server version 22.2.2 revision 54455. clickhouse:) SHOW DATABASES SHOW DATABASES Query id: ff5de867-938e-4b1b-82a7-92e118a25904 ┌─name───────────────┐ │ INFORMATION_SCHEMA │ │ anal***** │ │ default │ │ information_schema │ │ day. │ │ ****test │ │ system │ │ ******** │ └────────────────────┘ 8 rows in set. Elapsed: 0.002 sec.
як бачимо, видалена база повернулася в стрій.
Далі за бажання, можемо налаштувати cron на сервері clickhouse який буде запускати резервне копіювання або скористатися іншими утилітами для автоматизації даного процесу.
Корисні посилання
- https://github.com/AlexAkulov/clickhouse-backup
- https://habr.com/ru/post/569282/
- https://chowdera.com/2020/12/20201223211845195D.html
- https://dev.to/jv/backup-and-restore-with-clickhouse-backup-dn9