InfluxDB: бекап и восстановления

 

Описание

Раcсмотрим пример резервного копирования и восстановления influxdb, версия 1.8.10. Примеры будем приводить в двух вариантах:

Первый: когда influxdb установлен на сервер;
Второй: когда influxdb запущен в docker;

Кстати influxdb позволяет делать резервные копии и восстановления с незначительной разницей в версиях, то есть, можно сделать копию с версии 1.7 а восстановить ее на 1.18.10

Сначала немного поговорим об вариантах резервного копирования в influxdb. В общем есть два варианта offline и online и все они являются полными резервными копиями.

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

onlineновый метод резервного копирования и восстановления, используется ключ -portable. Позволяет делать резервное копирование и восстановление как с InfluxDB Enterprise, так и InfluxDB OOS в портативном новом формате. То есть  можем сделать резервную копию в InfluxDB Enterprise а после восстановить ее на InfluxDB OSS. При єтом для восстановления не нужно останавливать демон influxdb как при offline.

InfluxData рекомендует использовать более новый инструмент для всех версий, то есть online копирование и восстановление.

Для того чтоб делать резервное копирование на удалённых хостах их нужно подготовить, как это сделать написано здесь.

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

Первый вариант: запущен на сервере

online – резервное копирование

Что ж, мы уже залили пример данных и создали базу с названием NOAA_water_database над которой сейчас и будем практиковаться.

Создаем резервную копию используя команду:

 influxd backup -portable -db <DB_NAME> <PATH_TO_BACKUP_FOLDER>

пример:

 [root@localhost:/] influxd backup -portable -db NOAA_water_database /tmp/backup
 2022/01/19 19:08:39 backing up metastore to /tmp/backup/meta.00
 2022/01/19 19:08:39 backing up db=NOAA_water_database
 2022/01/19 19:08:39 backing up db=NOAA_water_database rp=autogen shard=2 to /tmp/backup/NOAA_water_database.autogen.00002.00 since 0001-01- 01T00:00:00Z
 2022/01/19 19:08:39 backing up db=NOAA_water_database rp=autogen shard=3 to /tmp/backup/NOAA_water_database.autogen.00003.00 since 0001-01-01T00:00:00Z
 2022/01/19 19:08:39 backing up db=NOAA_water_database rp=autogen shard=4 to /tmp/backup/NOAA_water_database.autogen.00004.00 since 0001-01-01T00:00:00Z
 2022/01/19 19:08:39 backing up db=NOAA_water_database rp=autogen shard=5 to /tmp/backup/NOAA_water_database.autogen.00005.00 since 0001-01-01T00:00:00Z
 2022/01/19 19:08:39 backing up db=NOAA_water_database rp=autogen shard=6 to /tmp/backup/NOAA_water_database.autogen.00006.00 since 0001-01-01T00:00:00Z
 2022/01/19 19:08:39 backing up db=NOAA_water_database rp=autogen shard=7 to /tmp/backup/NOAA_water_database.autogen.00007.00 since 0001-01-01T00:00:00Z
 2022/01/19 19:08:39 backup complete:
 2022/01/19 19:08:39 /tmp/backup/20220119T190839Z.meta
 2022/01/19 19:08:39 /tmp/backup/20220119T190839Z.s2.tar.gz
 2022/01/19 19:08:39 /tmp/backup/20220119T190839Z.s3.tar.gz
 2022/01/19 19:08:39 /tmp/backup/20220119T190839Z.s4.tar.gz
 2022/01/19 19:08:39 /tmp/backup/20220119T190839Z.s5.tar.gz
 2022/01/19 19:08:39 /tmp/backup/20220119T190839Z.s6.tar.gz
 2022/01/19 19:08:39 /tmp/backup/20220119T190839Z.s7.tar.gz
 2022/01/19 19:08:39 /tmp/backup/20220119T190839Z.manifest

Хорошо, копию создали, ошибок не вылезло, переходим к восстановлению.

online – восстановление

Удалим h2o_temperature с базы:

 [root@localhost:/] influx
 Connected to http://localhost:8086 version 1.8.10
 InfluxDB shell version: 1.8.10 
 > SHOW measurements
 name: measurements
 name
 ----
 average_temperature
 h2o_feet
 h2o_pH
 h2o_quality
 h2o_temperature
 > drop measurement "h2o_temperature"
 > SHOW measurements
 name: measurements
 name
 ----
 average_temperature
 h2o_feet
 h2o_pH
 h2o_quality

теперь восстанавливаем используя следующий шаблон:

 influxd restore -portable <PATH_TO_BACKUP_FOLDER>

пример:

[root@localhost:/] influxd restore -portable /tmp/backup/
2022/01/19 19:22:36 error updating meta: DB metadata not changed. database may already exist
restore: DB metadata not changed. database may already exist

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

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

[root@localhost:/] influxd restore -portable -db NOAA_water_database -newdb NOAA_water_db /tmp/backup/
2022/01/19 19:27:14 Restoring shard 2 live from backup 20220119T190839Z.s2.tar.gz
2022/01/19 19:27:14 Restoring shard 3 live from backup 20220119T190839Z.s3.tar.gz
2022/01/19 19:27:14 Restoring shard 4 live from backup 20220119T190839Z.s4.tar.gz
2022/01/19 19:27:14 Restoring shard 5 live from backup 20220119T190839Z.s5.tar.gz
2022/01/19 19:27:14 Restoring shard 6 live from backup 20220119T190839Z.s6.tar.gz
2022/01/19 19:27:14 Restoring shard 7 live from backup 20220119T190839Z.s7.tar.gz

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

 [root@localhost:/] influx 
 Connected to http://localhost:8086 version 1.8.10 
 InfluxDB shell version: 1.8.10 
 > show databases
 name: databases
 name
 ----
 _internal
 NOAA_water_database 
 > drop database NOAA_water_database 
 > show databases 
 name: databases
 name
 ----
 _internal

теперь восстанавливаем:

 [root@localhost:/] influxd restore -portable -db NOAA_water_database /tmp/backup/
 2022/01/19 19:16:42 Restoring shard 2 live from backup 20220119T190839Z.s2.tar.gz
 2022/01/19 19:16:42 Restoring shard 3 live from backup 20220119T190839Z.s3.tar.gz
 2022/01/19 19:16:42 Restoring shard 4 live from backup 20220119T190839Z.s4.tar.gz
 2022/01/19 19:16:42 Restoring shard 5 live from backup 20220119T190839Z.s5.tar.gz
 2022/01/19 19:16:42 Restoring shard 6 live from backup 20220119T190839Z.s6.tar.gz
 2022/01/19 19:16:42 Restoring shard 7 live from backup 20220119T190839Z.s7.tar.gzб

отлично, все прошло без проблем, проверяем  данные:

 > show databases 
 name: databases
 name 
 ---- 
 _internal 
 NOAA_water_database 
 > use NOAA_water_database 
 Using database NOAA_water_database 
 > SHOW measurements 
 name: measurements 
 name 
 ---- 
 average_temperature 
 h2o_feet 
 h2o_pH 
 h2o_quality 
 h2o_temperature >

С новым вариантом разобрались, переходим к старому.

 

offline резервное копирование

Сначала нужно сделать резервную копию meta, используем следующую команду:

 influxd backup <PATH_TO_BACKUP_FOLDER>

пример:

 [root@localhost:/] influxd backup /tmp/offline_backup
 2022/01/19 19:39:38 backing up metastore to /tmp/offline_backup/meta.00
 2022/01/19 19:39:38 No database, retention policy or shard ID given. Full meta store backed up.
 2022/01/19 19:39:38 backup complete:
 2022/01/19 19:39:38 /tmp/offline_backup/tmp/offline_backup/meta.00influxdb backup /tmp/offline_backup

теперь делаем копию базы дюнных, используем команду:

 influxd backup -database <DB_TO_RESTORE> <PATH_TO_BACKUP_FOLDER>

пример:

 [root@localhost:/] influxd backup -database NOAA_water_database /tmp/offline_backup
 2022/01/19 19:41:31 backing up metastore to /tmp/offline_backup/meta.01
 2022/01/19 19:41:31 backing up db=NOAA_water_database 
 022/01/19 19:41:31 backing up db=NOAA_water_database rp=autogen shard=20 to /tmp/offline_backup/NOAA_water_database.autogen.00020.00 since 0001-01-01T00:00:00Z
 2022/01/19 19:41:31 backing up db=NOAA_water_database rp=autogen shard=21 to /tmp/offline_backup/NOAA_water_database.autogen.00021.00 since 0001-01-01T00:00:00Z
 2022/01/19 19:41:31 backing up db=NOAA_water_database rp=autogen shard=22 to /tmp/offline_backup/NOAA_water_database.autogen.00022.00 since 0001-01-01T00:00:00Z
 2022/01/19 19:41:31 backing up db=NOAA_water_database rp=autogen shard=23 to /tmp/offline_backup/NOAA_water_database.autogen.00023.00 since 0001-01-01T00:00:00Z
 2022/01/19 19:41:31 backing up db=NOAA_water_database rp=autogen shard=24 to /tmp/offline_backup/NOAA_water_database.autogen.00024.00 since 0001-01-01T00:00:00Z
 2022/01/19 19:41:31 backing up db=NOAA_water_database rp=autogen shard=25 to /tmp/offline_backup/NOAA_water_database.autogen.00025.00 since 0001-01-01T00:00:00Z
 2022/01/19 19:41:31 backup complete:
 2022/01/19 19:41:31 /tmp/offline_backup/tmp/offline_backup/meta.01
 2022/01/19 19:41:31 /tmp/offline_backup/tmp/offline_backup/NOAA_water_database.autogen.00020.00
 2022/01/19 19:41:31 /tmp/offline_backup/tmp/offline_backup/NOAA_water_database.autogen.00021.00 
 2022/01/19 19:41:31 /tmp/offline_backup/tmp/offline_backup/NOAA_water_database.autogen.00022.00 
 2022/01/19 19:41:31 /tmp/offline_backup/tmp/offline_backup/NOAA_water_database.autogen.00023.00 
 2022/01/19 19:41:31 /tmp/offline_backup/tmp/offline_backup/NOAA_water_database.autogen.00024.00
 2022/01/19 19:41:31 /tmp/offline_backup/tmp/offline_backup/NOAA_water_database.autogen.00025.00

offline восстановление

Как и говорил выше, influxd restore будет работать только тогда когда influxd daemon будет остановлен, остановим его:

 [root@localhost:/] service influxdb stop
 Redirecting to /bin/systemctl stop influxdb.service

Вместим в одну команду восстановления meta и базы, получилось вот так:

 influxd restore -metadir /var/lib/influxdb/meta -datadir /var/lib/influxdb/data -database <DB_TO_RESTORE> <PATH_TO_BACKUP_FOLDER>

пример:

[root@localhost:/] influxd restore -metadir /var/lib/influxdb/meta -datadir /var/lib/influxdb/data -database NOAA_water_database /tmp/offline_backup/ 
Using metastore snapshot: /tmp/offline_backup/meta.01
2022/01/19 20:04:16 Restoring offline from backup /tmp/offline_backup/NOAA_water_database.*

запускаем influxd daemon:

 [root@localhost:/] service influxdb start
 Redirecting to /bin/systemctl start influxdb.serviceservice influxdb start

проверяем: 

 > show databases
 name: databases 
 name 
 ----
 _internal
 NOAA_water_database
 > use NOAA_water_database
 Using database NOAA_water_database
 > SHOW measurements
 name: measurements 
 name 
 ---- 
 average_temperature
 h2o_feet
 h2o_pH
 h2o_quality
 h2o_temperature
 >

Второй вариант: когда запущен в docker

В данном варианте все то же самое, как и в первом, только все команды нужно запускать в контейнере или используя команду docker exec -it <CONTAINER_ID> <INFLUXDB_COMMAND>. Что ж, приступим к практике.

online резервное копирование

Подготовил команды, которыми будем делать резервное копирование:

docker exec -it <CONTAINER_ID> influxd backup <PATH_TO_BACKUP_FOLDER>  # backup meta

docker exec -it <CONTAINER_ID> influxd backup -database <DB_NAME> <PATH_TO_BACKUP_FOLDER> # backup db

пример, сначала сделаем копию meta:

[root@localhost:/] docker exec -it 353dc7b435f2 influxd backup /tmp/backup_offline
2022/01/20 07:49:10 backing up metastore to /tmp/backup_offline/meta.03
2022/01/20 07:49:10 No database, retention policy or shard ID given. Full meta store backed up.
2022/01/20 07:49:10 backup complete: 2022/01/20 07:49:10 /tmp/backup_offline/tmp/backup_offline/meta.03

а далее копию самой  базы:

[root@localhost:/] docker exec -it 353dc7b435f2 influxd backup -database NOAA_water_database /tmp/backup_offline
2022/01/20 07:50:20 backing up metastore to /tmp/backup_offline/meta.04
2022/01/20 07:50:20 backing up db=NOAA_water_database
2022/01/20 07:50:20 backing up db=NOAA_water_database ***
********

Отлично, с этим справились, теперь нужно как то восстановить.

online восстановление

Если бекап делался внешний или с другого сервера, нужно залить в общую папку которую mount к контейнеру. Для этого можно воспользоваться командой docker cp или просто скопировать данные в директорию на хосте. Если нужно, можно провалится в контейнер и проверить на месте ли резервная копия которую мы скопировали. 

В нашем случае бекап уже сделан, находится в директории контейнера /tmp/backup_offline, на хосте его можно посмотреть по пути /data/influxdb/backup.

Теперь переходим к самому интересному, нужно остановить контейнер:

 [root@localhost:/] docker stop <CONTAINET_ID>

далее воспользоваться следующей командой и запустить процесс восстановления:

 docker run --rm --entrypoint /bin/bash \
 -v <DATA_PATH>:/var/lib/influxdb \
 -v <BACKUP_PATH>:/tmp/offline_backup \
 influxdb:1.8.10 \
 -c "influxd restore /var/lib/influxdb/meta -datadir /var/lib/influxdb/data -database <DB_NAME> <PATH_TO_BACKUP_FOLDER>"

ми запускаем контейнер с оболочкой /bin/bash, после стартует команда influxdb restore, проверяем:

 [root@localhost:/] docker run --rm --entrypoint /bin/bash \
 -v /data/influxdb/data:/var/lib/influxdb \
 -v /data/influxdb/backup/19.01.22:/tmp/influxdb-backup \
 influxdb:1.8.10 \
 -c "influxd restore -metadir /var/lib/influxdb/meta -datadir /var/lib/influxdb/data -database NOAA_water_database /tmp/backup_offline"
 Using metastore snapshot: /tmp/backup_offline 2022/01/19 13:05:45
 Restoring offline from backup/tmp/backup_offlineNOAA_water_database.*

Отлично, далее нужно запустить контейнер и проверить данныe:

 > show databases 
 name: databases
 name
 ----
 _internal
 NOAA_water_database 
 > use NOAA_water_database 
 Using database NOAA_water_database 
 > SHOW measurements
 name: measurements
 name
 ----
 average_temperature
 h2o_feet
 h2o_pH
 h2o_quality
 h2o_temperature
 >

Если нужно воспользоваться вариантом online контейнер останавливать не нужно.
Достаточно будет удаленно или в контейнере запустить команды резервного копирования и восстановления.

Ссылки по теме

 

Click to rate this post!
[Total: 0 Average: 0]