Резервное копирование MongoDb на S3 с помощью CronJobs на Kubernetes

Недавно я столкнулся с проблемой создания инкрементных резервных копий базы данных mongo, чтобы мы могли быстро восстановиться в случае сбоя базы данных или других странных событий, когда база данных становится непригодной для использования.

Существует несколько способов достижения этой цели, но я остановился на одном из них, используя kubernetes, поскольку у меня уже есть кластер kubernetes.

Необходимые условия:

  • Docker, установленный на вашей машине
  • Репозиторий контейнеров (Docker Hub, Google Container Registry и т.д.) — я использую docker hub
  • запущенный кластер Kubernetes

Структура наших рабочих папок должна выглядеть следующим образом:
db_backup/
├──── awesome_backup.sh
├── Dockerfile
├── cronjob-deployment.yaml
└── backup.env

Шаги для достижения этой цели:

  • MongoDB установлена на сервере и запущена (или Atlas)
  • AWS CLI установлен в контейнере docker
  • bash-скрипт, который будет выполняться на сервере для резервного копирования базы данных
  • настроенный AWS S3 Bucket
  • Сборка и развертывание на Kubernetes

Настройка MongoDB.

Вы можете установить базу данных mongo на своем сервере или использовать кластер Atlas. Кластер Atlas является отличным способом установки базы данных mongo и бесплатен для кластеров M0. Вы также можете использовать базу данных mongo на своем сервере или на кластере kubernetes.

Неважно, какой способ вы используете, главное, чтобы база данных mongo была запущена.

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

После создания экземпляра mongodb нам понадобится MONGODB_URI. Сохраните его в надежном месте, он понадобится нам позже.

Настройка AWS CLI в контейнере Docker.

Это очень важный шаг, поскольку мы будем использовать этот контейнер для запуска резервного копирования по расписанию на S3 с помощью kubernetes cronjobs.

Вам нужно создать dockerfile со следующим содержимым. Я объясню каждый шаг в деталях.

# Set up ubuntu image 
FROM ubuntu:18.04

ENV DEBIAN_FRONTEND noninteractive

# install mongodb backup tools 
RUN apt-get update && apt-get install -y mongo-tools

#  install aws cli
RUN apt-get install -y awscli

# copy mongodb backup script to /
COPY ./awesome_backup.sh ./

RUN chmod +x ./awesome_backup.sh

# Run the command on container startup
CMD ["bash"]
Вход в полноэкранный режим Выход из полноэкранного режима

Приведенный выше dockerfile прост и понятен.

Шаг 1:
Извлеките образ ubuntu 18.04. Это будет базовый образ для нашего контейнера. Вы также можете использовать другой дистрибутив linux, например centos или debian. Просто ваши команды или синтаксис могут немного отличаться.
В моем случае я использую образ ubuntu.

Шаг 2:
Установите переменную окружения DEBIAN_FRONTEND на не интерактивный. Это делается для того, чтобы пользователю не предлагалось ввести текст.

Шаг 3:
Установите инструменты резервного копирования mongodb. Это позволит нам создавать резервные копии базы данных mongo с помощью команд типа mongodump.

Шаг 4:
Установите aws cli. Это позволит нам использовать aws cli для взаимодействия с сервисами AWS.

Шаг 5:
Скопируйте скрипт резервного копирования mongodb в корневой каталог контейнера. Честно говоря, вы можете скопировать скрипт в любую директорию, просто убедитесь, что вы отметили, куда он скопирован. Для простоты я просто помещу его в корневую папку.

Мы создадим этот скрипт в следующем шаге, а пока дадим ему имя «awesome_backup» с расширением .sh. Помните… это сценарий на языке bash.

Шаг 6:
Нам нужно изменить права доступа к скрипту, чтобы сделать его исполняемым.

Шаг 7:
Нам также нужно будет запускать команду при запуске контейнера. Это делается путем выполнения команды CMD.

Вот и все. Теперь вы готовы запустить контейнер и запустить сценарий… О!, я сказал «запустить сценарий»?

Да, нам нужно создать скрипт, прежде чем мы сможем его запустить.

Наш замечательный скрипт bash.

Это мозг всего этого процесса. Я подробно расскажу, что делает этот скрипт. После этого вы станете ниндзя bash-скриптов. По крайней мере, вы сможете это сделать.

Смотрите скрипт ниже.

#!/bin/bash

#  Configure all aws variables needed for the script to work
aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID
aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
aws configure set region $AWS_DEFAULT_REGION

# Create a new folder to store the backup files
mkdir -p /backup/
echo "Creating backup folder ... 👜"

# change the current directory to usr/bin folder of the container
cd /usr/bin 
echo "💿 Backup started at $(date)"

# if mongodump command is successful echo success message else echo failure message
if mongodump --forceTableScan  --uri $MONGODB_URI  --gzip --archive > ../../backup/dump_`date "+%Y-%m-%d-%T"`.gz && cd ../../ && aws s3 cp /backup/ s3://$S3_BUCKET/db_backup/ --recursive
then
    echo "💿 😊 👍 Backup completed successfully at $(date)"
    echo " 📦 Uploaded to s3 bucket 😊 👍"
else
    echo  "📛❌📛❌ Backup failed at $(date)"
fi

echo "Cleaning up... 🧹"
# Clean up by removing the backup folder
rm -rf /backup/ 

echo "Done 🎉"
Вход в полноэкранный режим Выход из полноэкранного режима

Возможно, вы зададитесь вопросом, почему я поставил знак ‘$’ перед некоторыми словами с заглавной буквы. Это переменные окружения, которые мы будем передавать контейнеру во время выполнения.

Чтобы просто объяснить сценарий в деталях, сценарии bash начинаются с символа shebang (#!), а затем команды. В данном случае #!/bin/bash.

  • Сначала мы настроим aws cli с помощью команды aws configure. Это позволит установить переменные aws cli, такие как AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY и AWS_DEFAULT_REGION.

  • Затем мы создадим новую папку для хранения файлов резервного копирования.

  • Затем мы изменим текущую директорию на папку usr/bin контейнера.

  • Теперь есть оператор if, который проверяет, если: команда mongodump выполнена успешно И мы изменили текущий каталог на ../../ (обратно в корневую папку) И затем загрузили резервную копию в s3 bucket.

  • Если все эти условия выполнены, то мы выдадим эхо сообщения об успехе. Если нет, мы выдадим сообщение о неудаче.

  • Затем мы выполним команду rm. Это приведет к удалению папки с резервной копией.

ГОТОВО!!!

Я выдал несколько сообщений, чтобы объяснить, какой шаг скрипт выполняет в данный момент в каждой точке потока выполнения. Это поможет при чтении журналов и отладке скрипта.

Если вы следовали за мной до этого момента, вы — ниндзя скриптов Rockster bash 😊👍.

Настройка ведра AWS S3.

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

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

aws s3api create-bucket —bucket $S3_BUCKET —region $AWS_DEFAULT_REGION

$S3_BUCKET — это имя ведра, которое вы хотите создать.
$AWS_DEFAULT_REGION — регион, в котором вы хотите создать ведро.

например:

Примечание: Для простоты вы можете создать файл .env (например, backup.env) в корневой папке проекта и добавить в него следующие переменные.

S3_BUCKET=xxxxxx
MONGODB_URI=xxxxxx
AWS_ACCESS_KEY_ID=xxxxxx
AWS_SECRET_ACCESS_KEY=xxxxxx
AWS_DEFAULT_REGION=xxxxxx
Войти в полноэкранный режим Выйти из полноэкранного режима

Мы собираемся использовать .env файл для создания секретов в нашем кластере kubernetes, которые затем будут использоваться для передачи переменных контейнеру во время выполнения.

Барабанная дробь 🥁 !!!!!

Тада 🎉 !!!!!

Сборка и развертывание

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

Если вы не знакомы с kubernetes, вы можете прочитать больше о нем здесь: Основы Kubernetes

Для сборки и развертывания. Убедитесь, что у вас правильная структура папок. Моя выглядит следующим образом:
db_backup/
├──── awesome_backup.sh
├── Dockerfile
├── cronjob-deployment.yaml
└── backup.env

Убедитесь, что вы находитесь в корневой папке проекта (db_backup).

Затем выполните следующее для сборки контейнера:

docker build . -t имя_хранилища/имя_контейнера:имя_тега

Например, docker build . -t abc_inc/cronjob-server:latest.

Чтобы запустить контейнер локально, вы можете использовать следующую команду для передачи секретов из env-файла и запуска контейнера:

Вы можете запустить контейнер в хранилище docker или image, выполнив следующую команду:

docker push repository_name/container_name:tag_name

например, docker push abc_inc/cronjob-server:latest.

Теперь мы создадим файл развертывания cronjob.

apiVersion: batch/v1
kind: CronJob
metadata:
  name: db-backup
  namespace: default   # namespace where the cronjob will be deployed
spec:
  schedule: "*/5 * * * *"   # this runs the container every 5 minutes you can change this to any time you want.
  successfulJobsHistoryLimit: 1
  failedJobsHistoryLimit: 1
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: db-backup
              image: abc_inc/cronjob-server:latest
              command: ["/bin/bash", "-c", "sh ./awesome_backup.sh"]       #command to run when container starts
              imagePullPolicy: IfNotPresent
              envFrom:
                - secretRef:
                    name: backup-secrets     #secrets stored being passed into the container as environment variables
          restartPolicy: Never

Вход в полноэкранный режим Выход из полноэкранного режима

В предпоследней строке yaml-файла вы видите, что мы ссылаемся на секретное имя. Именно здесь мы будем передавать переменные контейнеру.

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

kubectl create secret generic secret-name —from-env-file=path-to-env-file

например, kubectl create secret generic backup-secrets --from-env-file=backup.env.

Этот секрет будет загружен из env-файла и будет доступен контейнеру из кластера.

После создания секрета мы развернем файл развертывания cronjob в нашем кластере kubernetes, запустив его:

kubectl apply -f cronjob-deployment.yaml

Когда вы запустите kubectl get all, вы увидите, что ваш Kubernetes CronJob Scheduled.

NAME                          SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob.batch/db-backup      */5 * * * *   False     0        4m58s           6h23m
Вход в полноэкранный режим Выйдите из полноэкранного режима

После запуска через 5 минут вы должны увидеть gzip резервную копию вашей MongoDB на вашем S3 bucket.

Ссылка
Источник изображения: https://educba.com

Оцените статью
Procodings.ru
Добавить комментарий