Перед выполнением последующих команд требуется, чтобы все реплики БД уже были предварительно развернуты по инструкции "Установка MongoDB и настройка набора реплик (ELIS 1.34)". |
Настройка резервного копирования БД выполняется на каждой реплике БД отдельно! |
Для настройки периодического резервного копирования БД необходимо выполнить следующие шаги:
1. Создайте файл по пути /etc/cron.daily/iot-backupdb:
sudo nano /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 |
В данный файл необходимо записать следующее содержимое:
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. Для каждой БД создается дочерняя директория с названием БД:
В каждой из перечисленных директорий будут сохраняться резервные копии БД с расширением *.gz за последние 3 дня.