Кошмар системного администратора, найденный в Яндексе
Кошмар системного администратора, найденный в Яндексе

Это горящий дата центр крупнейшего хостинг провайдера Европы - OVH. После пожара некоторые проекты так и не восстановились, другие долго зализывали раны. И чтобы такого не произошло - надо делать регулярные резервные копии. О том как, с какой периодичностью и что в них включать мы сегодня и поговорим.

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

Зачем нужны резервные копии?

Самый очевидный - это ситуация на фото. Дата центры в последнее время часто выходят из строя. Нет, это не значит, что они стали менее надежными. Просто их стало больше и такие случае чаще попадают в новостные ленты. У нас были и более экзотические варианты. Например, однажды мы потеряли проект клиента, т.к. владельцы хостинга разругались друг с другом и один из них пришел в дата центр, все вырубил и унес все сервера. Как вы, наверное, догадались, файлы забрать нам не дали. Проект мы быстро восстановили из резервок.

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

Ошибка разработчика. Например, не учли некоторые моменты при создании синхронизации и грохнули доп поля у всех товаров. Или, например, “срочные” правки на бою удаляют статус у части заказов и весь сервис синхронизации заказов сыпется как карточный домик. В таких случаях быстрый откат базы из резервки спасает ситуацию. Все мы люди и у нас такие случаи тоже бывают, поэтому резервки есть всегда, даже если на проекте работает кто-то из топ разработчиков.

Резервка дает возможность быстро поднять проект локально. Пожалуй, это самое неочевидное преимущество резервной копии. Резервка - это всегда запакованный сайт и это дает возможность быстро скачать необходимые данные и поднять проект локально. На некоторых проектах, мы делаем такие манипуляции на автомате, оборачивая это в Vagrant, что дает возможность разработчику быстро поднять локальную копию сайта из последней резервной копии без лишних танцев с бубном. “Быстрое”, конечно, понятие относительно и если разраб уехал в глухую деревню, где у него только 3g интернет и тот ловит с базовой станции из соседнего села, то поднимет он ее только когда выйдет на пенсию.

Где хранить резервные копии?

Есть много вариантов хранения. Мы остановились на облаках для личного использования (яндекс диск, cloud.mail.ru, дропбокс и прочие подобные сервисы). Посудите сами, стоимость терабайта от 2000 рублей и никаких дополнительных платежей за трафик, коннекты и пр. Сервис подбираем исходя из потребностей клиента, иногда даже бесплатного аккаунта хватает.

Кратко про альтернативным варианты:

  • Резервные копии от хостера. Мало того, что инфраструктура для хранения бэкапов принадлежит той же компании, так еще и хранятся они обычно в том же дата центре, что и ваш основной сайт, поэтому в случае проблем вы потеряете и сайт и резервки.

  • Облака для бизнеса. Это всякого рода AWS и прочие Яндекс облака. Сейчас такое не делает только ленивый. В целом, это дорого, очень сложная тарификация и они, откровенно, не для этого.

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

  • Место в облаке Битрикс. В Битриксе есть облачный бэкап и если у вас есть активная лицензия, то у вас есть инструмент и место хранения (от 2 до 10 Гб в зависимости от лицензии). Расширить это место нельзя (узнавал у поддержки). Места откровенно мало, бэкап и восстановление только стандартными средствами. Есть ряд клиентов которые этим пользуются, но больше одной резервной копии туда положить сложно.

Что и как хранить?

Лицо сисадмина, когда вы рассказываете ему о резервных копиях
Лицо сисадмина, когда вы рассказываете ему о резервных копиях

На самом деле с составом копий не все так просто.

База данных. Мы обычно работаем с mysql и там практически всегда забывают включить хранимые процедуры в бэкпап, тк по умолчанию утилита mysqldump этого не делает. Не на каждом проекте есть хранимки, но об этом нужно помнить.

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

Файлы. Если на хостинге/сервере много сайтов, то каждый сайт должен быть в отдельном архиве (включая отдельные архивы для dev и stage серверов). Для интернет магазинов и разного рода фэшн сайтов лучше выделять медийку (картинки, видео) в отдельный архив, т.к. они реже нужны для восстановления и в случае аварии архив с кодом в таком случае скачается быстрее.

Cron скрипты. На сложных проектах в кроне, как правило, не один вызов. И при потере сервера восстановить все крон скрипты очень сложно, а иногда невозможно. Поэтому cron всегда должен быть включен в резервные копии. Да, мы знаем что такое crunz и аналоги, но к нам часто приходят уже готовые проекты на поддержку и приходится работать с тем что есть, а уже потом рефакторить.

Прочие скрипты и настройки. У нас чаще всего это конфиги для supervisord и sphinx. Их достаточно бэкапить раз в месяц, либо держать копию в гите.

Частота резервных копий зависит от проекта. Наша стандартная схема: 7 дневных копий базы данных и еженедельные резервные копии файлов за 60 дней. В еженедельные копии файлов мы также подливаем и базу (база и архивы файлов даже в этом случае хранятся отдельно согласно рекомендациям выше). Такой схемы вполне хватает для основных сценариев восстановления. Резервные копии создаем в часы минимальной нагрузки на сервер, как правило, это час ночи по серверному времени (нужно учитывать часовой пояс основной аудитории проекта).

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

Как делать?

Для клиентов компании используем свои скрипты, которые делают все вещи, описанные выше, и заливают копию в подготовленное хранилище. Заодно отправляют уведомления в телеграм со служебной информацией и статусом бэкапа. Решение подходит только для серверов и VDS. На обычном хостинге его не запустить. В целом в наших скриптах нет ничего сложного и костяк решения гуглится по запросу "webdav резервные копии бесплатно и без смс".

Для популярных CMS есть отдельные решения, которые делают почти то же самое. Например, для Битрикс мы иногда используем ammina.backup (не реклама). В целом модуль работает стабильно, но не на каждом хостинге. Не работает, как правило, из-за ограничений хостинга на потребляемые ресурсы. Смена тарифного плана на более дорогой снимает ограничение и заставляет его работать.

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

Проверил и забыл?

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

Основные проблемы, которые возникают при проверках:

  • Проблемы с сетью на стороне сервера. Практически не прогнозируется. Бэкап не улетает в облако.

  • Перегруз сервера по ресурсам (низкая скорость отклика дисков, низкая производительность сервера) и, как следствие, зависание скрипта создания копии. Прогнозированию не поддается, можно только смириться и проверять.

  • Закончилось свободное место на сервере клиента (подрос объем сайта, кеш какого-либо компонента распух и его надо почистить, логи клиентских скриптов или сервера распухли и начали заниматься много места и пр.). Как следствие, не хватает пространства для создания копии и все падает. Решается мониторингом сервера и алертами админам. Мы это реализуем на базе Prometheus и Grafana.

  • Закончилось место в облачном хранилище. Как правило, это следствие предыдущего пункта. Так же мониторим в Prometheus.

Вместо заключения

Все что описано выше подойдет для интернет проектов, включая разного рода CRM системы, самописы и прочие “битриксы”, стоящие на сервере с объемом данных до 500-700 Гб. Все что ближе к терабайту просто так не резервируется и там уже нужны другие подходы.

Комментарии (7)


  1. Pitcentr0
    30.06.2023 07:06
    +1

    один из удобных вариантов это через CLI отправлять данные в S3 хранилище одной командой которую можно повесить на cron, т.е для bitrix взять и отправлять в S3 папку backup а сам бэкап делать без папки upload а папку upload изредка как есть отправлять с большим кол-вом файлов в S3, из плюсов upload легко с локальной версией сайта синхронизировать а backup без upload весит мало, для БД и cron отдельный скрипт сохранения в каталог и синхронизация так же в S3


    1. ChizhM
      30.06.2023 07:06

      1. По ошибке или хацкеры удалили upload, частично или полностью.

      2. Произошла синхронизация по cron.

      3. Ааааа...паника-паника...Где же взять данные? :-)


      1. Pitcentr0
        30.06.2023 07:06

        в случаях когда это не единственная копия а одна из то все будет хорошо


        1. ChizhM
          30.06.2023 07:06

          Когда вы это заметите уже и остальные будут синхронизированы с поредевшим upload ом.


  1. NotSlow
    30.06.2023 07:06
    +1

    С бэкапами важно не увлекаться. Сервер в первую очередь должен заниматься сайтом (или что там), а не насиловать диск с процессором, пакуя архивы.

    Я к примеру использую 7zip с ключами -mmt1 и -mx1 (но зависит конечно от того что именно архивируется). Чтобы занимать только 1 ядро и не гнаться за каждым лишним байтом ценою сильно большей нагрузки на cpu.

    Плюс при пересылке curl'ом использую ключ --limit-rate чтобы и интернет канал не забивать целиком одной лишь этой задачей.

    Также бывает что есть смысл часто архивировать базу и какие-то основные файлы, а тонны фото/видео вовсе ни к чему так часто (и тяжело) бэкапить. Можно используя symlink'и делать разделение, хранить например папку с фотками уровнем выше от сайта. Плюс в случае когда нужно развернуть бэкап, бывает также полезно быстро развернуть файлы/базу, а не ждать пока вместе с ними докачаются еще и горы второстепенных фото.

    Практически все что угодно можно самостоятельно делать на любом shared хостинге, не обязательно даже иметь ssh или особые фичи панели управления.

    Ну а в случае ограниченного бюджета можно рассмотреть вместо всяких платных хранилищ собственный роутер домашний. Почти к любому можно подкинуть usb жесткий диск, докупить у провайдера выделенный ip (или даже без этого обойтись) и держать все бэкапы у себя под боком, а не опять таки зависеть от кого-то.


    1. kmolochkov Автор
      30.06.2023 07:06

      Спасибо за уточнения по нагрузке.

      Ну а в случае ограниченного бюджета можно рассмотреть вместо всяких платных хранилищ собственный роутер домашний.

      Кстати да, про роутер с USB диском забыл. Я раньше так делал, пока в облака не переехали. Только без статик айпи. Просто поставил на роутер rsync (для вдс) и lftp (для просто хостеров) и по расписанию выкачивал. Соединение с сервером инициировал роутер и сам скачивал что нужно. А база создавалась по крону и клалась в определенную папку на сервере о которой роутер так же знал. В целом работало стабильно и шустро. Канал только нужно потолще.


  1. Devadas
    30.06.2023 07:06

    Как-то пробовал timeshift для linux, последняя Убунту. Очень удобно, но местами как-то не понятно. Устанавливал скрипты и в процессе делал снимки системы. Потом откатился на самое первое состояние и на сервере остались какие-то части этих скриптов... Оно так и работает?