Делаем бекап проекта простым путём

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

black and white plastic containers
Photo by Markus Winkler on Unsplash

Сегодня 07.07.2022. Два дня назад я очень глупо и почти случайно потерял всё, что было на этом сервере. Бэкапы были только от мая — это лучше, чем ничего, однако регулярного резервирования не было. Тут либо жизнь меня ничему не учит, либо уже научила и я стал достаточно аккуратен, чтобы не ронять проды как слон в посудной лавке, позволив себе облениться ¯\_(ツ)_/¯

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

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

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

Поскольку проекты развёрнуты по-старинке, на сервере нет докеров или чего-то сложного, значит и решение элементарно: bash + mysqldump + gzip + rsync + crontab + запасной сервер.

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

Дано

  • проект на srvprod.org
    • файлы проекта
    • БД проекта (MariaDB/MySQL)
  • подгоревшее кресло
  • запасной сервер srvbak.com
    • с кучей свободного места
    • с доступом по ssh

Решение

Для начала надо настроить связь между серверами, точнее, с прода на резервный. Это делается за две минуты. Буквально. То есть, нет, я не засекал, но тут всё очевидно.

На проде srvprod.org:

$ ssh-keygen
<enter><enter><enter><enter><enter><enter>...
$ cat ~/.ssh/id_rsa.pub

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

На резервном srvbak.com:

$ echo "<ключ>" >> ~/.ssh/authorized_keys

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

$ ssh nagibator666@srvbak.com

Подключился — молодец, треть дела сделано.

Теперь надо слить БД и упаковать файлы проекта. Для первого используется mysqldump пайпом в gzip. Для второго — любимый tar -zcf.

$ mysqldump -q <параметры> <имябд> | gzip > <путь/к/файлу>sql.gz
$ tar -zcf <имяфайла>.tar.gz <путь/к/проекту>

Два полученных файла отправляем rsync-ом (или scp) на дальний сервер. Но сначала надо проверить — восстановимы ли вообще эти бекапы. Для БД это делается через:

$ zcat <путь/до/бекапа>.sql.gz | mysql -pu <юзербд> <имябд>

Для архива проекта:

$ tar -xzf <путь/до/бекапа>.tar.gz

Просматриваем, как угодно проверяем. Нормально — шлём. Это достаточно сделать однажды при настройке резервирования. Можно по желанию, время от времени, лишним не будет.

Файлы будем сохранять как локально на проде (для простоты), так и на дальнем сервере (для надёжности). Файловая структура будет строиться на основе даты и времени:

/backup/2022.02.03/12.34-sql.gz
маска:     |  |  |  |  |
          %Y.%m.%d %H.%M

На резервном сервере надо будет создавать директорию отдельной командой, сразу после аналогичной локальной:

$ mkdir -p /backup/$(date +%Y.%m.%d)
$ ssh nagibator666@srvbak.com "mkdir -p /backup/$(date +%Y.%m.%d)/"

Таким образом мы сможем сортировать список файлов и директорий по именам туда-сюда без мешанины и чётко будем знать когда и во сколько снят снимок.

Вроде всё основное сделали, осталось отправить:

$ # оба варианта по сути идентичны:
$ rsync --progress <имяфайла> nagibator666@srvbak.com:/backup/2022.02.03/<имяфайла>
$ scp <имяфайла> nagibator666@srvbak.com:/backup/2022.02.03/<имяфайла>

Я выставил первой отправку дампа БД, второй — архив файлов, третий — лог резервирования. Данные в БД меняются чаще, чем файлы (которые, вообще-то, можно и гитом рулить), а лог — ну раз пишем, то пусть будет.

Вот готовый гист:

Изучаем, заполняем переменные, корректируем и вешаем это добро на крон, скажем, каждые 4 часа ежедневно:

* */6 * * * .../backup.sh

Сюда можно накрутить чего ещё угодно твоему извращённому вкусу. Для меня пока остались вот эти конкретные вещи (в первом приближении):

  • автоочистка старых бекапов с обеих сторон:
    • локальные бекапы на проде надо хранить недолго, ибо:
      • они ненадёжны по определению, хранить их там — в принципе не очень смысленно, ибо одна точка отказа;
      • они занимают место на диске прода, и чем их больше, и чем они больше, тем быстрее от них хочется избавиться;
    • хранение на резервном сервере должно быть намного дольше, но там диск тоже не резиновый;
  • логирование хешей файлов: я должен знать, что в логах фигурируют одни и те же файлы с одинаковыми хешами и они не пострадали при пересылке на удалённый сервер (например, если почему-то, внезапно, так случится — закончится место на диске или дамп базы завершился с ошибкой и файл недозаписался);
  • не пытаться отправить файл, который не был создан;
  • чё-то ещё, забыл…

Ну вроде всё. Может ещё дополню пост раз-два.

P.S.: вот это — лютое говно.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *