Резервное копирование и восстановление данных Redis в Ubuntu 14.04

Redis – это производительное хранилище типа «ключ-значение». Данные Redis по умолчанию сохраняются на диск в формате .rdb, что представляет собой снапшот набора данных Redis на заданный момент времени. Такие снапшоты делаются через определенные промежутки времени, и поэтому они идеально подходят для резервного копирования.

Данное руководство научит вас создавать резервные копии базы данных Redis на сервере Ubuntu 14.04.

Требования

  • Сервер Ubuntu 14.04.
  • Предустановленный сервер Redis (чтобы установить его, следуйте разделу по установке и настройке master-сервера этого руководства).
  • Также рекомендуется установить надёжный пароль для Redis (пароль находится в файле /etc/redis/redis.conf).

1: Каталог данных Redis

Redis хранит данные в каталоге на сервере. Найдите этот каталог.

В Ubuntu и других дистрибутивах Linux каталог данных Redis по умолчанию находится в /var/lib/redis. Возможно, вы изменили этот каталог. Чтобы найти каталог данных Redis, введите команду:

sudo locate *rdb

Также его можно найти с помощью строки redis-cli:

redis-cli

Если сервер Redis не запущен, команда вернёт:

Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected>

Запустите Redis и подключитесь снова:

sudo service redis-server start
redis-cli

Командная строка будет выглядеть так:

127.0.0.1:6379>

Чтобы пройти аутентификацию и узнать каталог данных, введите:

auth пароль-redis
config get dir

Последняя команда выведет на экран каталог данных.

1) "dir"
2) "/var/lib/redis"

Примечание: Если Redis использует другой каталог данных, не забудьте заменить “/var/lib/redis” путём к этому каталогу.

Закройте командную строку БД:

exit

Просмотрите каталог данных:

ls /var/lib/redis

В нём вы увидите файл dump.rdb, в котором хранятся данные Redis. Если на сервере включен appendonly, каталог может содержать также файл appendonly.aof или же другие файлы с расширением .aof, в которых хранятся логи всех операций записи, полученных сервером.

Примечание: Файл .rdb – это текущий снапшот, а файл .aof хранит историю Redis. Подробную информацию об этих файлах можно найти здесь.

Теперь нужно создать резервную копию файла .rdb и настроить его автоматическое копирование.

2: Добавление данных (опционально)

Создайте тестовые данные и добавьте их в БД. Если на сервере уже есть данные, пропустите этот раздел.

Откройте интерфейс командной строки:

redis-cli

Пройдите аутентификацию:

auth insert-redis-password-here

Добавьте тестовые данные; сервер должен ответить OK после каждой команды:

SET shapes:triangles "3 sides"
SET shapes:squares "4 sides"

Убедитесь, что данные были добавлены:

GET shapes:triangles
GET shapes:squares

Вывод команд будет выглядеть так:

"3 sides"
"4 sides"

Сохраните данные, чтобы они появились в /var/lib/redis/dump.rdb.

save

Закройте командную строку:

exit

Проверьте содержимое дамп-файла. В нём должны появиться новые данные в машиносчитываемом формате.

sudo cat /var/lib/redis/dump.rdb
REDIS0006?shapes:squares4 sidesshapes:triangles3 sides??o????C

3: Резервное копирование данных Redis

Резервное копирование данных в Redis выполняется очень просто: вы можете скопировать RDB-файл, не останавливая при этом базу данных. RDB обновляется не во время производства, а после создания нового снапшота.

Создайте копию БД (например, в домашнем каталоге пользователя).

sudo cp /var/lib/redis/dump.rdb /home/8host/redis-backup-001

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

Примечание: Если вы не рискуете потерять при резервном копировании больших объемов данных, просто скопируйте файл, не обновляя его.

Сохранение состояния БД

Чтобы получить наиболее свежую копию данных Redis, нужно открыть командную строку Redis и пройти аутентификацию, а затем выполнить команду:

save
OK
(1.08s)

После этого закройте БД. Теперь снова запустите команду cp. Так вы получите наиболее актуальную версию данных.

Команда cp выполняет резервное копирование единожды. Чтобы обеспечить своевременное резервное копирование, его можно автоматизировать с помощью команды cron. Также рекомендуется использовать инструмент, который может выполнять добавочные обновления и, при необходимости, восстанавливать данные.

4: Настройка автоматического копирования данных

Теперь можно настроить автоматическое резервное копирование каталога данных Redis.

Для этого существует несколько инструментов. В данном руководстве используется rdiff-backup – инструмент командной строки.

Чтобы установить rdiff-backup, введите:

sudo apt-get install -y rdiff-backup

Теперь попробуйте создать резервную копию каталога данных в домашнем каталоге.

Если целевого каталога не существует, сценарий создаст его.

Флаг –preserve-numerical-ids сохранит привилегии исходного и целевого каталога.

sudo rdiff-backup --preserve-numerical-ids /var/lib/redis /home/8host/redis

Эта команда создаст резервную копию единожды. Но, в отличие от cp, она скопирует весь каталог /var/lib/redis.

Теперь нужно настроить демон cron, чтобы сервер автоматически создавал резервные копии данных в одно и то же время. Откройте crontab:

sudo crontab -e

Примечание: Если ранее вы не пользовались crontab, программа предложит выбрать текстовый редактор.

Добавьте в конец файла:

0 0 * * * rdiff-backup --preserve-numerical-ids --no-file-statistics /var/lib/redis /home/8host/redis

Теперь cron будет копировать данные Redis в полночь каждый день. Флаг –no-file-statistics отключит запись в файл file_statistics в каталоге rdiff-backup-data, благодаря чему rdiff-backup будет работать быстрее и займёт меньше места.

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

@daily rdiff-backup --preserve-numerical-ids --no-file-statistics /var/lib/redis /home/8host/redis

Читайте такжеПланирование рутинных задач Linux при помощи Cron и Anacron

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

Файлы принадлежат пользователю redis. Убедитесь, что все файлы на месте, с помощью команды:

ls -l /home/8host/redis
total 20
-rw-rw---- 1 redis redis    70 Sep 14 13:13 dump.rdb
drwx------ 3 root  root  12288 Sep 14 13:49 rdiff-backup-data
-rw-r----- 1 redis redis   119 Sep 14 13:09 redis-staging-ao.aof

Теперь данные Redis ежедневно копируются и хранятся в домашнем каталоге.

5: Восстановление данных Redis

Теперь нужно научиться восстанавливать данные из файла dump.rdb.

Процедура восстановления резервной копии заменит текущую БД Redis восстановленными из дампа данными.

Примечание: Поскольку такая процедура может нанести вред серверу, её рекомендуется по возможности выполнить на свежем сервере Redis. В любом случае, вы можете не удалять, а переименовать файл с текущей БД, что мы и сделаем в этом руководстве.

Проверка резервной копии

Сначала нужно проверить файл dump.rdb и убедиться, что он содержит именно те данные, которые нужны в данный момент.

Для этого можно просто просмотреть файл дампа, хотя этот файл неудобен для чтения:

sudo cat /home/gilly/redis/dump.rdb

Вывод будет примерно таким:

REDIS0006?shapes:triangles3 sidesshapes:squares4 sides??!^?\?,?

Если последняя резервная копия пуста, не продолжайте восстановление.

Симуляция потери данных (опционально)

Теперь симулируйте потерю данных на машине, чтобы потом восстановить их из резервной копии.

Откройте командную строку Redis

redis-cli

Эта последовательность команд выполнит аутентификацию в Redis и удалит запись shapes:triangles.

auth insert-redis-password-here
DEL shapes:triangles

Убедитесь, что запись была удалена:

GET shapes:triangles

Команда должна вернуть:

(nil)

Чтобы сохранить результат и выйти, введите:

save
exit

Настройка нового сервера Redis (опционально)

Если вы собираетесь выполнить восстановление БД на новом сервере Redis, подготовьте такой сервер заранее.

Для этого достаточно выполнить первый раздел руководства по настройке кластера Redis.

Чтобы убедиться, что Redis запущен на новом сервере, введите:

redis-benchmark -q -n 1000 -c 10 -P 5

Остановка Redis

Прежде чем заменить дамп-файл Redis, нужно остановить текущий экземпляр Redis.

Примечание: При этом БД будет недоступна.

sudo service redis-server stop
Stopping redis-server: redis-server

Убедитесь в том, что сервер остановился:

sudo service redis-server status
redis-server is not running

После этого нужно переименовать текущую БД.

Переименование текущего файла dump.rdb

Redis читает свои данные из файла dump.rdb. Переименуйте текущий файл, чтобы восстановить скопированный ранее файл.

Отключение AOF (опционально)

AOF отслеживает операции записи в БД Redis. Однако в данном случае нужно восстановить только дамп, восстанавливать все операции записи из файла AOF не нужно.

Примечание: Если вы настраивали сервер Redis согласно этому руководству, то поддержка AOF включена.

Вы можете запросить содержимое каталога /var/lib/redis/. Если в нем есть файл .aof, поддержка AOF включена.

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

sudo mv /var/lib/redis/*.aof /var/lib/redis/appendonly.aof.old

Отредактируйте конфигурации Redis, чтобы временно отключить AOF.

sudo nano /etc/redis/redis.conf

В разделе AOF найдите директиву appendonly и измените её значение на no:

appendonly no

Восстановление файла dump.rdb

Теперь можно восстановить дамп, который хранится в /home/8host/redis/dump.rdb.

Если вы восстанавливаете данные на новом сервере, подгрузите на него дамп-файл:

scp /home/8host/redis/dump.rdb 8host@your_new_redis_server_ip:/home/8host/dump.rdb

Независимо от того, на каком сервере вы восстанавливаете данные, запустите команду cp, чтобы скопировать файл в /var/lib/redis.

sudo cp -p /home/8host/redis/dump.rdb /var/lib/redis

Примечание: Если вы подгрузили файл в /home/8host/dump.rdb, используйте команду:

sudo cp -p /home/8host/dump.rdb /var/lib/redis

Если вы хотите использовать rdiff-backup, запустите следующую команду:

sudo rdiff-backup -r now /home/8host/redis/dump.rdb /var/lib/redis/dump.rdb

Примечание: Команда сработает только в том случае, если восстанавливаемый каталог был скопирован с помощью rdiff-backup.

Подробную информацию об опции -r можно получить в официальной документации (см. конец руководства).

Права на dump.rdb

Если вы восстанавливали резервную копию на старом сервере, вероятно, привилегии уже установлены верно.

Если вы скопировали дамп на новый сервер, привилегии нужно обновить.

Чтобы просмотреть права на dump.rdb, введите:

ls -la /var/lib/redis/
-rw-r-----  1 8host 8host   70 Feb 25 15:38 dump.rdb
-rw-rw----  1 redis redis 4137 Feb 25 15:36 dump.rdb.old

Передайте файл пользователю и группе redis.

sudo chown redis:redis /var/lib/redis/dump.rdb

Дайте группе права на запись в файле:

sudo chmod 660 /var/lib/redis/dump.rdb

Снова запросите права на файл:

ls -la /var/lib/redis/
-rw-rw----  1 redis redis   70 Feb 25 15:38 dump.rdb
-rw-rw----  1 redis redis 4137 Feb 25 15:36 dump.rdb.old

Примечание: Если до восстановления файла сервер Redis работал, а теперь не запускается и возвращает ошибку:

Could not connect to Redis at 127.0.0.1:6379: Connection refused

проверьте логи Redis.

Если же он выдаёт ошибку:

Fatal error loading the DB: Permission denied. Exiting.

проверьте права на файл dump.rdb.

Запуск Redis

Чтобы запустить Redis, введите:

sudo service redis-server start

Проверка содержимого БД

Откройте командную строку Redis:

redis-cli

Запросите shapes:triangles:

GET shapes:triangles
"3 sides"

Если команда вернула такой ответ, значит, данные успешно восстановлены.

Включение AOF (опционально)

Если вы хотите включить поддержку AOF, вернитесь в командную строку Redis:

redis-cli

Введите:

BGREWRITEAOF
Background append only file rewriting started

После этого запустите команду info:

info

Найдите в выводе раздел Persistence и убедитесь, что записи aof соответствуют приведённой информации. Если aof_rewrite_in_progress равно нулю, то поддержка AOF успешно восстановлена.

# Persistence
. . .
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:0
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok

После этого можно закрыть командную строку Redis:

exit

Проверьте файлы в /var/lib/redis.

ls /var/lib/redis

Теперь в каталоге появится файл с расширением .aof (например, appendonly.aof или redis-staging-ao.aof).

Остановите сервер Redis:

sudo service redis-server stop

Включите поддержку AOF в конфигурационном файле redis.conf:

sudo nano /etc/redis/redis.conf
appendonly yes

Снова запустите Redis:

sudo service redis-server start

Заключение

Своевременное резервное копирование Redis предотвратит потерю данных. Конечно, безопаснее копировать данные на удалённую машину.

Читайте также:

Tags: , ,

Добавить комментарий