Резервное копирование данных интернет-магазина: стратегия бэкапа баз данных, файлов и конфигураций с хранением в другом регионе

Для интернет-магазина нужно бэкапить не «весь сервер», а три типа активов: базу данных (транзакции и контент), файлы (загрузки пользователей и медиа) и конфигурации (код и окружение). Частота и способ бэкапа у всех трёх совершенно разные, и если делать их вместе...

独立站备份三件套:数据库、文件、配置,各备各的Backup trio: database, files, config — each backed up separately 反直觉:备份成功不算数,能在 4 小时内恢复出来才算数Counter-intuitive: a backup means nothing until it restores in 4h 资产Asset 怎么备How 数据库Database 每天全量+每小时增量Daily full + hourly binlog RPO ≤ 1 小时RPO ≤ 1 hour 文件Files 对象存储异地同步Offsite object storage sync 用户上传件单独备User uploads backed up 配置Config 代码进 Git,配置进版本库Git tracked, secrets in vault 改一次备一次Version every change 3-2-1 原则:3 份副本、2 种介质、1 份异地3-2-1: 3 copies, 2 media, 1 offsite 本地磁盘一份、服务器一份、异地对象存储一份;后两份放在不同机房Local disk + server + offsite bucket in a different region 红线:只在同一台机器上备 = 没备;每季度必须做一次恢复演练Red line: backup on the same box = no backup; drill quarterly 恢复演练从备份恢复到一台新机器,计时,目标 RTO ≤ 4 小时Restore to a fresh box quarterly, target RTO ≤ 4 hours
Три составляющих бэкапа интернет-магазина: частота резервного копирования базы данных, файлов и конфигураций и стратегия хранения 3-2-1 в другом регионе

Резервное копирование данных интернет-магазина: стратегия бэкапа баз данных, файлов и конфигураций с хранением в другом регионе

Сначала вывод: Для интернет-магазина нужно бэкапить не «весь сервер», а три типа активов: базу данных (транзакции и контент), файлы (загрузки пользователей и медиа) и конфигурации (код и окружение). Частота и способ бэкапа у всех трёх совершенно разные, и если делать их вместе, проблемы гарантированы. На практике применяйте принцип 3-2-1: 3 копии, 2 типа носителей, 1 копия в другом регионе, причём последние две хранятся в разных дата-центрах. Самое важное контринтуитивное понимание — успешный бэкап ничего не значит; значение имеет только возможность полностью восстановить сайт из бэкапа за 4 часа. Бэкап без проверки восстановления равносилен отсутствию бэкапа.

I. Почему нельзя «просто забэкапить весь диск целиком»

Многие владельцы сайтов выбирают стратегию «каждый день упаковывать весь сервер и сохранять». Звучит надёжно, но на практике есть три проблемы.

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

Контринтуитивный вывод здесь такой:Ценность бэкапа определяется не тем, «сколько вы забэкапили», а тем, «можно ли восстановить и как быстро». Я видел слишком много сайтов с «ежедневным бэкапом», которые в день падения сервера обнаруживали, что файлы бэкапа повреждены, пароли неизвестны, а копия в другом регионе ни разу не загрузилась успешно.

Критерий приёмки стратегии бэкапа только один: взять этот бэкап, развернуть на совершенно новой машине и запустить сайт за 4 часа. Именно поэтому Бэкап и восстановление сайта подчёркивает «проверку возможности восстановления».

Тип актива Что входит Частота изменений Последствия пропуска бэкапа
База данных Заказы, заявки, пользователи, таблицы контента Ежечасно Потеря транзакций и данных клиентов
Документ Загрузки пользователей, изображения, вложения, медиа Ежедневно Потеря вложений и изображений товаров
Конфигурации / код Темы, плагины, конфигурация Nginx, переменные окружения При каждом изменении После переустановки невозможно воспроизвести исходный сайт
Полный архив диска Всё вышеперечисленное плюс системный мусор Ежедневно Слишком большой и медленный, восстановление вместе с заражением

II. Бэкап базы данных: полный плюс инкрементальный, RPO в пределах 1 часа

База данных — самый важный из трёх типов активов, и потерять её нельзя. Стратегия — «полный плюс инкрементальный»: раз в сутки ночью делаем логический полный бэкап (mysqldump или аналог), включаем binlog для почасового инкремента. В худшем случае потеряем данные только за последний час — этот показатель называется RPO (целевая точка восстановления).

Нужно учесть две детали. Первая: полный бэкап не запускайте в часы пик, ставьте на 3–5 утра. Вторая: файлы бэкапа нужно проверять на целостность, а не просто смотреть, что «файл создался», — выборочно восстанавливайте во временную базу. Иначе бэкап может оказаться битым начиная с какого-то момента. Когда база вырастет, логический бэкап замедлится — тогда переходите на физический бэкап или автоматическое резервное копирование облачной базы.

Пример из практики: В 4 утра в базе случайно удалили таблицу заказов. Порядок восстановления: берём полный бэкап за прошлую ночь, восстанавливаем во временную базу, затем проигрываем binlog с 4 утра вчерашнего дня до момента аварии — и база возвращается к состоянию за минуту до сбоя. Весь процесс занимает около часа, потери минимальны.

Способ резервного копирования Частота RPO Этап применения
Ежедневный полный логический бэкап 1 раз в день Около 24 часов Менее 5000 посещений в день
Полный + инкремент binlog Полный ежедневно, инкремент ежечасно ≤ 1 часа Стандартный вариант для проектов с транзакциями
Автоматический бэкап облачной базы Управляет провайдер Обычно в пределах 5 минут Удобный вариант после переезда в облако
Репликация master-slave в реальном времени В реальном времени близко к 0 Добавляют при высоких требованиях к доступности

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

Файлы (вложения из заявок, изображения товаров, медиа) объёмные и меняются медленно — их не стоит запихивать в ежедневный бэкап базы. Синхронизируйте каталог загрузок в удалённое объектное хранилище отдельным инструментом инкрементальной синхронизации, достаточно раза в день. Как управлять большими файлами вроде картинок и видео, читайте в Управление медиаактивами.

Конфигурацию и код забывают чаще всего. У многих база резервируется отлично, а конфиги Nginx, версии плагинов и переменные окружения разбросаны по серверам — после переустановки непонятно, как всё работало.

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

Актив Инструмент / способ резервного копирования Частота Удалённое хранилище
Полный бэкап базы Автоматический скрипт mysqldump Каждую ночь Объектное хранилище в другом регионе
Инкремент базы Архив binlog Каждый час Вместе с полным бэкапом в удалённое хранилище
Файлы пользователей Инкрементальная синхронизация в объектное хранилище Ежедневно Пишутся сразу в удалённое хранилище
Код и конфигурация Коммит в Git При каждом изменении Удалённый репозиторий в облаке
Переменные окружения и ключи Менеджер паролей Сохраняется при каждом изменении Зашифрованное хранение в облаке

Четыре. Удалённое хранилище: как применить принцип 3-2-1

3-2-1 — старое правило резервного копирования, но одиночки часто выполняют только первую половину. Полностью оно звучит так: храните 3 копии данных, на 2 разных носителях, и 1 из них — в другом месте. Смысл «другого места» не в «ещё одном диске», а в том, что оно не погибнет вместе с основным при той же аварии.

На практике для одного облачного сервера это так: на локальном диске — свежая копия (восстанавливается быстрее всего), ещё одна — в дата-центре, где стоит сервер, и третья — в объектном хранилище в другом городе. Снапшоты блочного диска в том же аккаунте и регионе не считаются настоящим удалённым хранением: пожар в дата-центре или блокировка аккаунта — и все копии пропадут разом. Удалённую копию храните не меньше 30 дней, а раз в месяц — долгосрочный архив полугодовой давности, чтобы шифровальщик не зашифровал и старые бэкапы.

Пример из практики: Сервер зашифровал шифровальщик. Локальная копия и копия на сервере зашифрованы, но копия в объектном хранилище в другом городе, которой 30 дней, лежит офлайн — вредоносное ПО до неё не дотянется. Вы восстанавливаете её на новой машине и теряете максимум 30 дней данных, но сайт жив.

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

Где лежит копия Носитель Срок хранения Что даёт
Локальный диск сервера Облачный диск Последние 7 дней Быстрое повседневное восстановление
Объектное хранилище в том же дата-центре Объектное хранилище Последние 30 дней Восстановление при сбое сервера
Удалённое объектное хранилище Бакет в другом регионе 30 дней + месячный архив Авария уровня дата-центра или аккаунта
Копия на локальный диск Личный жёсткий диск Раз в квартал Подстраховка на случай, если и провайдеру нет доверия

Пять. Ловушки: четыре самых частых ложных ощущения безопасности при резервном копировании

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

Третья ловушка — «бэкапим данные, но не конфигурацию». Базу восстановили, а какие версии плагинов стояли, как был настроен Nginx — вспомнить не можете, и сайт всё равно не поднимается. Четвёртая ловушка — «у бэкапа нет оповещений». Скрипт резервного копирования тихо отвалился три недели назад, и никто не заметил, пока в день восстановления не выяснилось, что копия пустая. Задача резервного копирования обязана слать оповещение о сбое: два дня подряд без успеха — и вам приходит уведомление.

Ложное ощущение безопасности Внешнее проявление Реальная проблема Как исправить
Бэкап в другой папке на той же машине Каждый день появляются файлы бэкапа Сервер упал — всё пропало Обязательно хранить копию в другом месте
Восстановление никогда не проверяем Скрипт бэкапа рапортует об успехе Файл бэкапа может быть повреждён Раз в квартал проводить учебное восстановление
Бэкапим только базу данных База бэкапится каждый день Конфигурация и код разбросаны где попало Конфигурацию — в Git, ключи — в сейф
У бэкапа нет оповещений Три недели никто не замечал Задача резервного копирования молча падала Два сбоя подряд — и приходит оповещение

FAQ: частые вопросы

Как часто нужно делать резервную копию сайта?
Зависит от типа данных. База данных — полная копия ежедневно плюс инкремент binlog каждый час, RPO в пределах 1 часа. Пользовательские файлы — инкрементальная синхронизация раз в день. Код и конфигурации — в Git при каждом изменении. Нельзя применять одну частоту ко всем данным. Если на сайте ещё нет транзакций, хватит и ежедневной полной копии базы. Но как только появляются заказы и запросы — переходите на часовой уровень.
В правиле 3-2-1 — насколько далеко должно быть “другое место”?
Важна не физическая дистанция, а то, чтобы одна авария не уничтожила все копии сразу. Два диска в одном серверном зале — не другое место. Снимки в том же аккаунте и регионе — тоже. Как минимум одну копию нужно хранить в объектном хранилище в другом городе. Для особо важных данных скачайте ещё одну копию на личный диск раз в квартал — на случай, если и у провайдера что-то случится.
Зачем нужны учения по восстановлению, если файлы бэкапов уже есть?
Нет. Успешный бэкап не значит, что данные можно восстановить. Без учений можно обнаружить при восстановлении, что файл повреждён, пароль забыт, а инструкция устарела. Раз в квартал: возьмите последний бэкап, восстановите на чистую машину и замерьте время. Цель — RTO в пределах 4 часов. Если дольше — оптимизируйте процесс. Только после этого бэкап можно считать настоящим.
Достаточно ли автоматических снимков от облачного провайдера?
Как одна из копий — да, но полагаться только на них нельзя. Снимки провайдера лежат в том же аккаунте и регионе: при аварии на уровне дата-центра, блокировке аккаунта или сбое у провайдера они исчезнут вместе с рабочими данными. Правильно так: снимки — для быстрого повседневного восстановления, а базу и файлы дополнительно отправляйте в объектное хранилище в другом регионе. Две отдельные копии закрывают и повседневные задачи, и катастрофу.
Нужно ли бэкапить загруженные пользователями изображения и вложения вместе с базой?
Нет, не смешивайте. Изображения и вложения большие по объёму и меняются редко — если включить их в ежедневный полный бэкап базы, он станет огромным и медленным. Просто синхронизируйте папку загрузок в объектное хранилище в другом регионе раз в день отдельным инструментом. А для названий, сжатия и переиспользования изображений товаров и медиафайлов стоит навести порядок в медиатеке, чтобы в бэкапе не копились дубликаты тяжёлых картинок.
Как скрипт бэкапа узнает, что тихо упал?
Настройте оповещения о сбоях для задач резервного копирования. После выполнения скрипт проверяет три вещи: код возврата равен 0, размер файла бэкапа в норме, копия действительно загружена в другое место. Если что-то не так или два дня подряд не появляется новый файл бэкапа — сразу уведомление в удобный вам канал. Бэкап без оповещений — это ставка на то, что скрипт никогда не даст сбой.

В заключение

Резервное копирование — та область, где проще всего обмануть самого себя: скрипт работает, файлы сохраняются, выглядит надёжно. Но настоящая проверка только одна — восстановление. Для одиночного независимого сайта достаточно разделить три типа активов, держать копии по схеме 3-2-1 в другом месте и раз в квартал проводить учебное восстановление. Всё это настраивается за один вечер, а дальше работает автоматически каждый день — раз в неделю достаточно взглянуть на оповещения.

Три шага на практике. Первый: полный бэкап базы данных ежедневно плюс инкрементальный каждый час, целевой RPO — 1 час. Второй: файлы и конфигурацию хранить отдельно — файлы ежедневно синхронизировать в объектное хранилище в другом регионе, код и конфигурацию — в Git. Третий: раз в квартал проводить учебное восстановление с замером времени — уложиться в 4 часа, а к задачам резервного копирования подключить оповещения о сбоях.

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

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

crater
crater Эксперт Crater

Официальный аккаунт организации · crater Crater

环形山 (Crater) — компания, которая помогает выходить на зарубежные рынки: разработка сайтов на WordPress, Google SEO и комплексный рост в GEO. Мы работаем с умными устройствами, промышленным оборудованием, SaaS и новой энергетикой.

Возможности продуктаБелая книга по методологииОтраслевые отчёты
965篇分享
78статей в базе знаний