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

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 не будет опубликован. Обязательные поля помечены *