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

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

Что такое AWS S3?

Мы будем хранить наши резервные копии в AWS S3. AWS означает Amazon Web Services и является облачным сервисом Amazon. S3 — это одна из их служб, расшифровывающаяся как Simple Storage Service. Он использует те же масштабируемые системы хранения, которые Amazon использует для работы своего интернет-магазина.

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

У них также есть своя модель ценообразования, что очень выгодно. Например, за первые 50 ТБ в месяц вы платите всего 0,023 доллара США за ГБ. Однако первые 5 ГБ подпадают под уровень бесплатного пользования в течение первых 12 месяцев и поэтому полностью бесплатны.

Мы собираемся использовать это бесплатное хранилище для автоматического хранения наших резервных копий.

Установка интерфейса командной строки AWS

Чтобы написать скрипт для резервного копирования, необходимо установить интерфейс командной строки AWS. Это программа, позволяющая взаимодействовать с AWS в командной строке.

То, как именно вы устанавливаете интерфейс командной строки AWS, зависит от вашей операционной системы. Это объясняется на самом веб-сайте AWS.

Для многих операционных систем есть более простой способ, чем описанный там. Например, как пользователь macOS, вы можете просто использовать Brew:

brew install awscli

Если вы установили интерфейс командной строки AWS, вы можете проверить, работает ли он, выполнив следующую команду:

$ aws --version
aws-cli/2.5.2 Python/3.9.11 Darwin/21.1.0 exe/x86_64 prompt/off

Вход в интерфейс командной строки AWS

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

Затем вам нужно создать ключи доступа для использования CLI. Вы делаете это в консоли AWS в разделе IAM › Учетные данные безопасности. Создайте новую пару ключей и не закрывайте всплывающее окно. Вот где ваши полномочия. Вы не сможете вернуть их позже.

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

$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: json

Настройка корзины S3

Следующим шагом будет создание корзины S3, в которой мы будем хранить резервные копии. Для этого перейдите в Консоль AWS и в S3.

Там вы нажимаете «Создать ведро».

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

Все остальные настройки можно оставить без изменений.

Внизу нажмите «Создать корзину», чтобы фактически создать корзину S3.

Откройте только что созданное ведро, а затем создайте новую папку, нажав «Создать папку». Назовите его backups или как вам удобно. Это будет папка, в которой фактически хранятся резервные копии.

Открыв папку, вы можете нажать «Копировать S3 URI» в правом верхнем углу. Это понадобится нам на следующем шаге.

Настройка сценария резервного копирования

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

Для этого я использую вариант сценария Йонг Мук Кима, который он опубликовал в своем блоге.

#!/bin/bash
NOW=$(date +"%Y-%m-%d")
NOW_TIME=$(date +"%Y-%m-%d %T %p")
NOW_MONTH=$(date +"%Y-%m")
MYSQL_HOST="localhost"
MYSQL_PORT="3306"
MYSQL_DATABASE="database"
MYSQL_USER="user"
MYSQL_PASSWORD="password"
BACKUP_DIR="/Users/bowero/backup/$NOW_MONTH"
BACKUP_FULL_PATH="$BACKUP_DIR/$MYSQL_DATABASE-$NOW.sql.gz"
AMAZON_S3_BUCKET="s3://cronly-backups/backups/"
AMAZON_S3_PATH="$AMAZON_S3_BUCKET$NOW_MONTH/"
AMAZON_S3_BIN="/usr/local/bin/aws"
#################################################################
mkdir -p ${BACKUP_DIR}
backup_mysql(){
       mysqldump -h ${MYSQL_HOST} \
         -P ${MYSQL_PORT} \
         -u ${MYSQL_USER} \
         -p${MYSQL_PASSWORD} ${MYSQL_DATABASE} | gzip > ${BACKUP_FULL_PATH}
}
upload_s3(){
      ${AMAZON_S3_BIN} s3 cp ${BACKUP_FULL_PATH} ${AMAZON_S3_BUCKET}
}
backup_mysql
upload_s3

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

  • MYSQL_DATABASE: имя вашей базы данных MySQL.
  • MYSQL_USER: имя вашего пользователя MySQL.
  • MYSQL_PASSWORD: ваш пароль MySQL.
  • BACKUP_DIR: место, где вы хотите локально хранить свои резервные копии.
  • AMAZON_S3_BUCKET: URI корзины S3 (полученный на предыдущем шаге).
  • AMAZON_S3_BIN: расположение вашего бинарного файла AWS CLI. Если вы этого не знаете, вы также можете просто заполнить aws.

Вы можете сохранить файл под любым именем, например backups. Файл не нуждается в расширении, но если вы хотите его указать, .sh не является чем-то необычным.

Вам все еще нужно сделать исполняемый файл. Вы делаете это с помощью следующей команды:

$ chmod +x backup.sh

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

./backup.sh

Если он работает правильно, вы увидите что-то вроде:

upload: 2022-06/cronly-2022-06-17.sql.gz to s3://cronly-backups/backups/cronly-2022-06-17.sql.gz

Затем ваша резервная копия добавляется в S3, если все идет хорошо. Вы можете легко проверить это с помощью консоли AWS, просто перейдя в корзину S3 и открыв папку backups.

Настройка задания cron

Конечно, вы не хотите запускать это вручную ежедневно. Вот почему вам нужно создать задание cron.

Вы можете сделать это несколькими способами. Одним из простых способов является встроенный способ в системах Unix.

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

Интервал и задание выражаются через crontab. Это строка, которую cron читает, чтобы знать, что и когда делать. Это правило выглядит так:

a b c d e /directory/command

Здесь a b c d e — это интервал, а последняя часть — это команда, которую вы хотите запустить.

Если мы намерены делать резервные копии каждый день в 4 утра, мы можем сделать это с помощью следующей вкладки cron:

0 4 * * * /home/Users/backup.sh

Вы можете легко изучить crontab с помощью такого инструмента, как crontab.guru.

Чтобы добавить crontab в вашу систему, запустите в командной строке:

crontab -e

Откроется текстовый редактор CLI по умолчанию. Здесь вы можете добавить файл crontab. Затем сохраните файл.

Наш скрипт резервного копирования теперь запускается автоматически каждый день в 4 утра.

Дополнительно: мониторинг работы cron

Если это важный процесс, неплохо убедиться, что задание cron действительно запущено.

Я создал продукт под названием Cronly, который позволяет вам делать это без особых усилий. Вы просто создаете cronjob на Cronly.app и добавляете запрос cURL в конец backup.sh. Например:

curl -m 10 https://cronly.app/api/monitors/pulse/39e9c77a-61bc-4b31-a813-e6bb04340529

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

Заключение

И это снова был он! Теперь вы узнали, как:

  • Установите интерфейс командной строки AWS
  • Создайте корзину S3 и каталог
  • Автоматически создавать и загружать резервные копии в облако
  • Настроить задание cron
  • Мониторинг ваших заданий cron

Поздравляем! Ты действительно заслуживаешь похлопывания по спине.