Описание
Ра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 контейнер останавливать не нужно.
Достаточно будет удаленно или в контейнере запустить команды резервного копирования и восстановления.
Ссылки по теме
- https://www.grzegorowski.com/how-to-backup-and-restore-influxdb-which-runs-inside-docker-container
- https://docs.influxdata.com/influxdb/v1.8/administration/backup_and_restore/
- https://stackoverflow.com/questions/54989489/influxdb-restore-db-metadata-not-changed-database-may-already-exist
- https://docs.influxdata.com/influxdb/v1.8/query_language/sample-data/