Примечание

Перед выполнением последующих команд требуется, чтобы все реплики БД уже были предварительно развернуты по инструкции "Установка MongoDB и настройка набора реплик (ELIS 1.36.1)".

Примечание

Настройка резервного копирования БД выполняется на каждой реплике БД отдельно!

Для настройки периодического резервного копирования БД необходимо выполнить следующие шаги:

1. Создайте файл по пути /etc/cron.daily/iot-backupdb:

sudo nano /etc/cron.daily/iot-backupdb

В данный файл необходимо записать следующее содержимое:

/etc/cron.daily/iot-backupdb
#!/bin/sh

set -a
. /mongo_backup_env
set +a

mongobackups_path="/var/backups/mongobackups"

backup_db() {
    db_name=$1
    path_backup="${mongobackups_path}/${db_name}/"
    mkdir -p ${path_backup}

    current_date=$(date +%Y-%m-%d_%H-%M)

    # backup database
    backup_archive_name=${path_backup}${db_name}_${current_date}.gz
    mongodump --db=${db_name} --gzip --archive=${backup_archive_name}

    days=$2
    # remove all backup archives older ${days}
    find ${path_backup} -regex ".*\.gz" -mtime +${days} -delete
}

if [ "${DISK_USAGE_THRESHOLD_CRITICAL}" -gt 0 ] && [ "${DISK_USAGE_THRESHOLD_WARN}" -gt "${DISK_USAGE_THRESHOLD_CRITICAL}" ]
then
    disk_avail_space=`df --output=avail ${mongobackups_path} | sed '2!d'`
    disk_size=`df --output=size ${mongobackups_path} | sed '2!d'`
    db_size=`du -s ${mongobackups_path} | cut -f1`
    free_disk_space_percent=`echo "scale=2;(${disk_avail_space}-${db_size})*100/${disk_size}" | bc -l`
    backup_days=`echo "scale=0;(${free_disk_space_percent}-${DISK_USAGE_THRESHOLD_CRITICAL})*3/(${DISK_USAGE_THRESHOLD_WARN}-${DISK_USAGE_THRESHOLD_CRITICAL})" | bc -l`

    if [ "${backup_days}" -gt "3" ]
    then
        backup_days=3
    fi
else
    backup_days=3
fi

if [ "${backup_days}" -ge "0" ]
then

    #Check mongo shells
    if [ -e /bin/mongo ]
    then
        echo "Using old mongo shell"
        MONGO_SHELL=mongo
    else
        echo "Using new mongosh"
        MONGO_SHELL=mongosh
    fi

    #Checking if current replica is secondary
    $MONGO_SHELL --eval "quit(rs.status().myState == 1 ? 0 : 1)"

    if [ "$?" -eq "0" ]; then
        echo "Only SECONDARY replicas are backed up"
        exit 1
    fi

    backup_db ${IOT_CORE_DB} ${backup_days}
    backup_db ${MQTT_BROKER_DB} ${backup_days}
    backup_db ${AUTHORIZATION_SERVER_DB} ${backup_days}
else
    echo "Too much space used on disk! Removing all backups to free more space..."
    rm -rf ${mongobackups_path}/*
fi

2. Сделайте созданный файл исполняемым при помощи следующей команды:

sudo chmod +x /etc/cron.daily/iot-backupdb

3. Создайте файл по пути /mongo_backup_env:

sudo nano /mongo_backup_env

В данный файл необходимо записать следующее содержимое:

/etc/cron.daily/iot-backupdb
IOT_CORE_DB=iot-core
MQTT_BROKER_DB=iot-broker
AUTHORIZATION_SERVER_DB=iot-authorization-server
DISK_USAGE_THRESHOLD_WARN=10
DISK_USAGE_THRESHOLD_CRITICAL=5

4. Создайте папку для резервных копий:

sudo mkdir /var/backups/mongobackups


Стоит отметить, что резервные копии создаются только на репликах, имеющих состояние SECONDARY. Это сделано для того, чтобы не создавать нагрузку на основную реплику БД (имеющую состояние PRIMARY) в момент создания резервной копии.

Резервные копии БД сохраняются в директории /var/backups/mongobackups. Для каждой БД создается дочерняя директория с названием БД:

  • /var/backups/mongobackups/iot-authorization-server — резервные копии БД сервера авторизации;
  • /var/backups/mongobackups/iot-broker —  резервные копии БД MQTT-брокера;
  • /var/backups/mongobackups/iot-core — резервные копии БД ядра платформы умного дома.

В каждой из перечисленных директорий будут сохраняться резервные копии БД с расширением *.gz за последние 3 дня.

  • Нет меток