Поиск по сайту:

Как сделать резервную копию и восстановить данные Redis в Ubuntu 14.04


Введение

Redis — это кэш-память и хранилище (то есть база данных) в памяти, которые также можно сохранять (постоянно сохранять) на диск. В этой статье вы узнаете, как создать резервную копию базы данных Redis на сервере Ubuntu 14.04.

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

Предпосылки

Чтобы выполнить шаги, описанные в этом руководстве, вам потребуется:

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

Шаг 1 — Поиск каталога данных Redis

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

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

  1. sudo locate *rdb

Кроме того, вы также можете найти его в командной строке redis-cli. Для этого введите:

  1. redis-cli

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

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

В этом случае запустите Redis и повторно подключитесь с помощью следующих команд:

  1. sudo service redis-server start
  2. redis-cli

Приглашение оболочки теперь должно измениться на:

127.0.0.1:6379>

При подключении к Redis следующие две команды будут аутентифицироваться и получать каталог данных:

  1. auth insert-redis-password-here
  2. config get dir

Вывод последней команды должен быть вашим каталогом данных Redis:

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

Запишите свой каталог Redis. Если он отличается от показанного каталога, убедитесь, что вы используете этот каталог на протяжении всего руководства.

Теперь вы можете выйти из интерфейса командной строки базы данных:

  1. exit

Убедитесь, что это правильный каталог:

  1. ls /var/lib/redis

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

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

Мы начнем только с файла .rdb и закончим автоматическим резервным копированием обоих файлов.

(Необязательно) Шаг 2 — Добавление демонстрационных данных

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

Войдите в интерфейс командной строки базы данных:

  1. redis-cli

Аутентификация:

  1. auth insert-redis-password-here

Давайте добавим некоторые образцы данных. Вы должны получать ответ OK после каждого шага.

  1. SET shapes:triangles "3 sides"
  2. SET shapes:squares "4 sides"

Подтвердите, что данные были добавлены.

  1. GET shapes:triangles
  2. GET shapes:squares

Результат приведен ниже:

"3 sides"

"4 sides"

Чтобы зафиксировать эти изменения в файле /var/lib/redis/dump.rdb, сохраните их:

  1. save

Вы можете выйти:

  1. exit

Если хотите, вы можете проверить содержимое файла дампа прямо сейчас. В нем должны быть ваши данные, хотя и в удобной для машин форме:

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

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

Теперь, когда вы знаете, где находятся ваши данные Redis, пришло время сделать резервную копию. С официального сайта Redis приходит эта цитата:

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

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

  1. sudo cp /var/lib/redis/dump.rdb /home/sammy/redis-backup-001

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

Однако, если потенциально небольшой объем потери данных допустим, просто резервное копирование этого одного файла будет работать.

Сохранение состояния базы данных

Чтобы получить гораздо более свежую копию данных Redis, лучше всего получить доступ к redis-cli, командной строке Redis.

Выполните аутентификацию, как описано в шаге 1.

Затем введите команду save следующим образом:

  1. save

Вывод должен быть похож на этот:

OK
(1.08s)

Выйдите из базы данных.

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

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

Шаг 4 — Настройка автоматического обновления с помощью rdiff-backup и Cron

В этом разделе мы настроим автоматическое резервное копирование, которое создаст резервную копию всего вашего каталога данных Redis, включая оба файла данных.

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

rdiff-backup инструмент резервного копирования из командной строки. Скорее всего, rdiff-backup не установлен на вашем сервере, поэтому вам сначала нужно установить его:

  1. sudo apt-get install -y rdiff-backup

Теперь, когда он установлен, вы можете протестировать его, создав резервную копию данных Redis в папке в вашем домашнем каталоге. В этом примере мы предполагаем, что ваш домашний каталог — /home/sammy:

Обратите внимание, что целевой каталог будет создан сценарием, если он не существует. Другими словами, вам не нужно создавать его самостоятельно.

С параметром --preserve-numerical-id владельцы исходной и целевой папок будут одинаковыми.

  1. sudo rdiff-backup --preserve-numerical-ids /var/lib/redis /home/sammy/redis

Как и команда cp ранее, это одноразовая резервная копия. Что изменилось, так это то, что теперь мы делаем резервную копию всего каталога /var/lib/redis и используем rdiff-backup.

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

  1. sudo crontab -e

(Если вы раньше не использовали crontab на этом сервере, выберите ваш любимый текстовый редактор в ответ на приглашение.)

Внизу файлаk добавьте запись, показанную ниже.

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

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

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

  1. @daily rdiff-backup --preserve-numerical-ids --no-file-statistics /var/lib/redis /home/sammy/redis

Чтобы узнать больше о Cron в целом, прочитайте эту статью о Cron.

В настоящее время резервное копирование будет производиться один раз в день, так что вы можете вернуться завтра для финального теста. Или вы можете временно увеличить частоту резервного копирования, чтобы убедиться, что оно работает.

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

  1. ls -l /home/sammy/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 из резервной копии

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

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

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

Проверка содержимого файла восстановления

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

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

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

Это для небольшой базы данных; ваш вывод должен выглядеть примерно так:

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

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

Необязательно: имитация потери данных

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

Войдите в Redis:

  1. redis-cli

В этой последовательности команд мы авторизуемся в Redis и удалим запись shapes:triangles:

  1. auth insert-redis-password-here
  2. DEL shapes:triangles

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

  1. GET shapes:triangles

Вывод должен быть:

(nil)

Сохранить и выйти:

  1. save
  2. exit

Необязательно: настройка нового сервера Redis

Теперь, если вы планируете выполнить восстановление на новый сервер Redis, убедитесь, что новый сервер Redis запущен и работает.

Для целей этого руководства мы будем следовать только шагу 1 этого руководства по Redis Cluster, хотя вы можете следовать всей статье, если хотите более сложную настройку.

Если вы следуете шагу 2, где вы добавляете пароль и включаете AOF, убедитесь, что вы учитываете это в процессе восстановления.

Убедившись, что Redis работает на новом сервере, запустив redis-benchmark -q -n 1000 -c 10 -P 5, вы можете продолжить.

Остановка Redis

Прежде чем мы сможем заменить файл дампа 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. Давайте переименуем текущий, чтобы освободить место для нашего файла восстановления.

sudo mv /var/lib/redis/dump.rdb /var/lib/redis/dump.rdb.old

Обратите внимание, что вы можете восстановить dump.rdb.old, если решите, что текущая версия лучше, чем ваш файл резервной копии.

Если AOF включен, выключите его

AOF отслеживает каждую операцию записи в базу данных Redis. Однако, поскольку мы пытаемся восстановить данные из резервной копии на определенный момент времени, мы не хотим, чтобы Redis воссоздавал операции, хранящиеся в его файле AOF.

Если вы настроили свой сервер Redis в соответствии с инструкциями в руководстве Redis Cluster, AOF будет включен.

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

Давайте переименуем файл .aof, чтобы временно убрать его с дороги. Это переименовывает каждый файл, который заканчивается на .aof, поэтому, если у вас есть более одного файла AOF, вы должны переименовывать файлы по отдельности и НЕ запускать эту команду:

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

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

  1. sudo nano /etc/redis/redis.conf

В разделе AOF найдите директиву appendonly и измените ее с yes на нет. Это отключает его:

appendonly no

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

Теперь мы будем использовать наш файл восстановления, который должен быть сохранен в /home/sammy/redis/dump.rdb, если вы выполнили предыдущие шаги в этом руководстве.

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

  1. scp /home/sammy/redis/dump.rdb sammy@your_new_redis_server_ip:/home/sammy/dump.rdb

Теперь на сервере восстановления, которым может быть исходный сервер Redis или новый, вы можете использовать cp, чтобы скопировать файл в папку /var/lib/redis. :

  1. sudo cp -p /home/sammy/redis/dump.rdb /var/lib/redis

(Если вы загрузили файл в /home/sammy/dump.rdb, используйте команду sudo cp -p /home/sammy/dump.rdb /var/lib/redis, чтобы скопировать файл.)

В качестве альтернативы, если вы хотите использовать rdiff-backup, выполните команду, показанную ниже. Обратите внимание, что это будет работать только в том случае, если вы восстанавливаете из папки, которую изначально установили с помощью rdiff-backup. С помощью rdiff-backup вы должны указать имя файла в папке назначения:

  1. sudo rdiff-backup -r now /home/sammy/redis/dump.rdb /var/lib/redis/dump.rdb

Подробная информация об опции -r доступна на веб-сайте проекта, указанном в конце этой статьи.

Установка разрешений для файла dump.rdb

Вероятно, у вас уже есть правильные разрешения, если вы восстанавливаете данные на тот же сервер, на котором сделали резервную копию.

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

Давайте посмотрим на права доступа к файлу dump.rdb в каталоге /var/lib/redis/.

  1. ls -la /var/lib/redis/

Если вы видите что-то вроде этого:

-rw-r-----  1 sammy sammy   70 Feb 25 15:38 dump.rdb
-rw-rw----  1 redis redis 4137 Feb 25 15:36 dump.rdb.old

Вы захотите обновить разрешения, чтобы файл принадлежал пользователю и группе Redis:

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

Обновите файл, чтобы он также был доступен для записи группой:

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

Теперь снова перечислите содержимое каталога /var/lib/redis/:

  1. ls -la /var/lib/redis/

Теперь ваш восстановленный файл dump.rdb имеет правильные разрешения:

-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 работал до того, как вы восстановили файл, и теперь не запускается — он покажет сообщение типа Не удалось подключиться к Redis по адресу 127.0.0.1:6379: Отказано в соединении — проверьте Redis журналы.

  • Как найти журналы Redis в Ubuntu

Если вы видите в логах строку типа Неустранимая ошибка при загрузке БД: Отказано в доступе. Exiting., вам необходимо проверить права доступа к файлу dump.rdb, как описано в этом шаге.

Запуск Redis

Теперь нам нужно снова запустить сервер Redis.

sudo service redis-server start

Проверка содержимого базы данных

Посмотрим, получилось ли восстановление.

Войдите в Redis:

  1. redis-cli

Проверьте запись shapes:triangles:

  1. GET shapes:triangles

Вывод должен быть:

"3 sides"

Большой! Наша реставрация сработала.

Выход:

  1. exit

Если вы не используете AOF, все готово! Ваш восстановленный экземпляр Redis должен вернуться в нормальное состояние.

(Необязательно) Включение AOF

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

Войдите в Redis:

  1. redis-cli

Включите АОФ:

  1. BGREWRITEAOF

Вы должны получить результат:

Background append only file rewriting started

Запустите команду info. Это создаст довольно много вывода:

  1. info

Прокрутите до раздела «Постоянство» и убедитесь, что записи aof соответствуют тому, что показано здесь. Если aof_rewrite_in_progress равен 0, то восстановление файла 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

Если подтверждено, что воссоздание файла AOF завершено, теперь вы можете выйти из командной строки Redis:

  1. exit

Вы можете снова перечислить файлы в /var/lib/redis:

  1. ls /var/lib/redis

Вы должны снова увидеть активный файл .aof, например appendonly.aof или redis-staging-ao.aof, вместе с dump.rdb и другие файлы резервных копий.

Как только это будет подтверждено, остановите сервер Redis:

  1. sudo service redis-server stop

Теперь снова включите AOF в файле redis.conf:

  1. sudo nano /etc/redis/redis.conf

Затем снова включите AOF, изменив значение appendonly на yes:

appendonly yes

Запустите Редис:

  1. sudo service redis-server start

Если вы хотите еще раз проверить содержимое базы данных, просто еще раз просмотрите раздел «Проверка содержимого базы данных».

Вот и все! Ваш восстановленный экземпляр Redis должен вернуться в нормальное состояние.

Заключение

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

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

  • Как выбрать эффективную стратегию резервного копирования для вашего VPS

Вы можете использовать многие из этих методов резервного копирования с одними и теми же файлами в каталоге /var/lib/redis.

Следите за нашей будущей статьей о миграции и восстановлении Redis. Вы также можете обратиться к примерам документации rdiff-backup, чтобы узнать, как эффективно использовать rdiff-backup:

  • Примеры rdiff-backup