Автоматическое резервное копирование курсов

Автоматическое резервное копирование курсов

от Dmitriy Makarov -
Количество ответов: 19

Доброго времени суток! Нужна консультация по поводу автоматического резервного копирования курсов. 

На сайте установлены следующие настройки автоматического резервного копирования


При этом cron запускается через crontab каждые 10 минут. Настраивал как указано здесь еще год назад.

По сути в crontab прописано следующее: 


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

Изначально в настройках была установлена только область для резервного копирования, но обстоятельства потребовали выгружать курсы в архивах .mbz, для чего я и добавил каталог moodlebackup с полными правами на запись/удаление (777). 

Проблемой оказалось то, что в директории /home/moodlebackup за последние 5 дней так и не создалась ни одна резервная копия курса, папка пуста. Но это первая проблема, она же основная.

Второй момент таков... На почту как положено приходит уведомление следующего содержания:

Описание
==================================================
  Курсы; 464
  OK; 93
  Пропущено; 371
  Ошибка; 0
  Не завершено; 0
  Предупреждение; 0
  Отложенное автоматическое резервное
копирование; 0
  Резервное копирование успешно окончено
 Лог выдает следующее (страниц на 15 где-то, указал кусок):


Меня смущает огромное количество пропущенных курсов. В пропущенных журналы напрочь отсутствуют... Эта ситуация выглядит странно, т.к. 80% курсов живые и материалы в них постоянно добавляются, курсы меняются и соответственно резервные копии в идеале должны создаваться, но этого не происходит. 

К примеру два разных семестра одной дисциплины имеют различное количество резервных копий созданных автоматически. Для одного курса резервные копии висят за последние 2 дня, для другого последняя резервная копия создавалась 16 июля 2017. Что влияет на это для меня не совсем понятно, тем более в настройках ясно указано что и сколько должно храниться и когда удаляться... 

На данном этапе произвожу еженедельный экспорт всей виртуальной машины и 3 раза в неделю делаю бэкапы баз данных и ресурсов системы общеизвестным способом, но т.к. нужны архивы курсов, то вынужден возиться еще и с этим вопросом...

Жизненно необходима подсказка по части выгрузки архивов mbz в указанную директорию. Вроде бы указано все как надо, но 5 дней прошло, результата никакого. Хотелось бы с этой темой разобраться окончательно. 

В ответ на Dmitriy Makarov

Re: Автоматическое резервное копирование курсов

от Vadim Tabunshchik -
Изображение пользователя Developers

1. А зачем каждый день курсы бэкапить? Не жалко сервер гонять впустую? Один раз в любой день недели вполне достаточно.

2. по хранилищу: выберите просто «Указанный каталог…» и посмотрите, появятся ли там архивы.

3. «курсы меняются и соответственно резервные копии в идеале должны создаваться, но этого не происходит. » - смотрите журналы таких курсов, действительно ли в них что-то происходит.

Я бы всё-таки настроил опции «Пропускать курсы…» Поверьте, не нужны вам архивы с разницей в 1-2 дня или в 10-20 Кбайт

Ваша задача, как админа, в случае сбоя с наименьшими затратами восстановить приблизительное состояние системы (до сбоя). Преподаватель, если хочет, может хоть после каждого редактирования/удаления страницы/ресурса делать бэкап.

В ответ на Vadim Tabunshchik

Re: Автоматическое резервное копирование курсов

от Dmitriy Makarov -

Была бы моя воля, я бы ограничился экспортом виртуальной машины раза 2 в неделю ну и modledata с дампами раз в неделю на всякий случай, и только улыбаюсь Тем более восстановить виртуалку можно за 30 минут, если уж все совсем плохо... Тут дело в другом ) Если руководство говорит "Делать надо КАЖДЫЙ ДЕНЬ!" значит надо делать каждый день, и объяснять тут бесполезно, уже пытался.. Мощностей кстати хватит за глаза, что что, а к качеству железа в коем то веке подошли грамотно. Сейчас шумиха уляжется с 1 сентября и думаю поменяю на 2-3 раза в неделю.

Но суть не в этом... Вчера импортировал копию текущей виртуальной машины на другой физический сервер для работы локально, так вот на нем сегодня в назначенные 15.30 автоматическое резервное копирование сработало безупречно, все как положено... В чем проблема тут не пойму... машины одинаковые ведь, отличаются только IP адресами. В любом случае посмотрю что будет завтра, поменял как вы советуете на "Указанный каталог". Дальше будем посмотреть улыбаюсь Спасибо улыбаюсь

В ответ на Vadim Tabunshchik

Re: Автоматическое резервное копирование курсов

от Dmitriy Makarov -

В общем проблема решилась сама собой после перезагрузки виртуальной машины. Возможно висел какой-то процесс. В любом случае спасибо за оперативную помощь.

В ответ на Dmitriy Makarov

Re: Автоматическое резервное копирование курсов

от Dmitriy Makarov -
Возвращаемся к вопросу бэкапов... Собственно о том, что я посредством экспорта копирую всю виртуалку я говорил в одном из форумов. Также настроено теперь уже автоматическое резервное копирование средствами самого Moodle. Руками делал дамп базы и директорий относящихся к Moodle (папка сайта и moodledata)... По части последнего захотелось определенной автоматизации, но столкнулся с тем, что без перехода в техническое обслуживание иногда бэкап получается битым, выдает ошибку. В принципе я понимаю, что это вызвано скорее всего наличием в системе пользователя какого-либо... отсюда вопрос: возможно ли организовать автоматический переход в режим техобслуживания и из него? Быть может есть готовый скрипт? На сколько я понимаю должен быть исполняющий php отвечающий за это дело? Свой скрипт писал по образу и подобию скриптов представленных ЗДЕСЬ и ЗДЕСЬ (может кому-нибудь тоже поможет).
В ответ на Dmitriy Makarov

Re: Автоматическое резервное копирование курсов

от Vadim Dvorovenko -
Изображение пользователя Developers Изображение пользователя Майнтейнер перевода
В ответ на Vadim Dvorovenko

Re: Автоматическое резервное копирование курсов

от Dmitriy Makarov -

изучаю, но больно много ее... спасибо!

В ответ на Dmitriy Makarov

Re: Автоматическое резервное копирование курсов

от Dmitriy Makarov -

И так... получился вот такого рода shell скрипт... Сегодня в ночь буду проверять работоспособность... 

#!/bin/sh
# задаем переменную DATE. Она будет содержать текущую дату.
DATE=`date +%Y-%m-%d_%H-%M-%S`
# задаем переменную DIR, содержащую путь к каталогу с бэкапами.
DIR=/home/backups/
# задаем переменную DIR2, содержащую путь к каталогу со страницей информирующей о техобслуживании
DIR2=/var/moodledata
# переходим в каталог, где хранится страница о техобслуживании
cd $DIR2
# меняем расширение страницы на HTML, теперь при попытке входе в систему пользователи будут видеть информацию о техобслуживании и не смогут войти в систему.
mv climaintenance.off climaintenance.html
# переходим в каталог, где должны храниться бэкапы.
cd $DIR 
# создаем дамп всей базы данных MySQL и сжимаем дамп.
mysqldump -ulog -ppass base | gzip -c > mysql_moodle_$DATE.gz
# создаем tar сжатый контейнер. т.е. архивируем каталог www и moodledata. дополнительный параметр -P заперщает архиватору отбрасывать корневой '/'.
tar -czf moodle_backup_$DATE.tar.gz -P /var/www /var/moodledata
# переходим в каталог, где хранится страница о техобслуживании
cd $DIR2
# меняем расширение страницы обратно на off. для "отключения" страницы информирующей о техобслуживании
mv climaintenance.html climaintenance.off
# удаляем старые двухдневные копии архивов
find /home/backups/ -name "*.gz" -mtime 2 -exec rm -f {} \;
# Отправляю сообщение себе на почту письмо с сообщением, о том, что сделано.
echo -e "Создание резервной копии сайта сайт.ru успешно завершено "`date`"\n\nСозданы следующие архивы:\nmysql_moodle_"$DATE".gz - Дамп базы данных\nmoodle_backup_"$DATE".tar.gz - Архив директорий.\n\nАрхивы двухдневной давности удалены." | mail -s "Backup on сайт.ru complate" e-mail@mail.ru

Запускаю все через crontab в 1 час 30 минут по мск

30 01 * * * /home/backups/backup.sh >/dev/null

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

В будущем хочу реализовать все через rsync улыбаюсь

В ответ на Dmitriy Makarov

Re: Автоматическое резервное копирование курсов

от Vadim Dvorovenko -
Изображение пользователя Developers Изображение пользователя Майнтейнер перевода

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

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

Поэтому как примерно следует делать бэкап:

Для бэкапа базы данных на mysql следует использовать Percona. Она позволяет сделать моментальный снимок базы данных не останавливая сервер. То есть в один момент времени запись данных переключается на новый файл, а основной не трогается. Пока он копируется, пусть даже долго, запись идёт только во временный файлом. После окончания копирования основного файла изменения из нового файла копируются обратно в основной, и запись переключается обратно на него. В результате получается согласованная копия.

Перед тем, как запускать копирование БД таким способом, нужно добавить в config.php строчку $CFG->fileslastcleanup=time(); - это предотвратит очистку корзины во время резервного копирования.

После окончания резервного копирования БД следует сделать rsync папки moodledata в место бэкапа. В этой папке много всего, но копировать нужно только filedir и trashdir. В filedir хранятся все файл системы, в trashdir хранятся файлы, которые были удалены, но так как они могли быть удалены после снятия копии базы, их придется хранить, чтобы возвращать потом в filedir. Правда непонятно, какие из них именно нужны. Идеальный вариант, чтобы быть уверенными насчёт файлов в trashdir, что они реально нужны, это делать прямо перед снятием бэкапа БД очистку корзины, потом, если какой-то файл на момент копирования moodledata оказался в trashdir, значит удаление было уже после снятия бэкапа базы и его следует при восстановлении возвращать в filedir.

Другие папки в moodledata вообще не нужно переносить. Кэш моментально будет перестроен при восстановлении, поэтому о нём жалеть не стоит, а вот несогласованный кэш часто приводит к полной недоступности сайта. Остальные файлы - сессии, блокировки, временные, их копировать тоже нет смысла, так как при восстановлении все будут заходить в систему заново.

Теперь про rsync. в Moodledata 99% файлов неизменны и 1% это то, что появилось с последнего бэкапа. Поэтому копирование с rsyns в разы ускорит процесс резервирования. Так как в filedir файлы хранятся по хэшам и содержимое файла никогда не меняется, можно использовать максимально быстрые режимы сравнения. Хорошо подходит --size-only, а вот --ignore-times и --checksum не стоит включать, только замедлят. Но в случае, если используете rsync, возникает другая проблема - можно иметь только одну копию файлов - последнюю. Чтобы этого избежать, в месте, куда будут закидывать бэкапы moodledata следует создать LVM разделы - они поддерживают snapshot-ы, за счёт которых можно хранить несколько копий moodledata не расходуя места на совпадающие между копиями файлы. В идеале, использовать LVM и там, где у Вас находится оригинал папки moodledata. Ещё лучше вообще всё держать на LVM, тогда можно вообще ограничиться созданием снимков LVM.

Так что вот итоговый алгоритм бэкапа.

1. Добавляете в config.php строку  $CFG->fileslastcleanup=time() - 60 * 60 * 24 *365;

2. Запускаете через cli задачу планировщика по очистке корзины.

3. Меняете в config.php строку на $CFG->fileslastcleanup=time();

4. Стартуете бэкап бд с помощью Percona. Можно фоновым процессом, чтобы минимизировать расхождения между базой данных и moodledata.

5. Если у вас LVM на разделе с moodledata, создаёте снимок и монтируете состояние до создания снимка по отдельному пути.

6. Если у вас LVM на разделе с резервной копией moodledata, создаёте там новый снимок, чтобы старая резервная копия сохранилась в старом снимке.

7. Делаете rsync папок moodledata/filedir и moodledata/trashdir в папку с резервной копией. Для rsync нужно использовать в том числе параметр --delete, так как удаленные в оригинале файлы можно удалить и из копии (так как старые копии этого файла можно поднять из снимков). Если вдруг у вас нет LVM на приёмнике резервной копии, то не используйте параметр --delete - более новую копию можно будет использовать и со старой базой данных, просто будут копиться лишние файлы.

8. Удаляете снимок на разделе с moodledata, если создавали. Изменения при этом нужно объединить.

9. Убираете из config.php строку $CFG->fileslastcleanup=time();

10. Где-то фоном заканчивает копироваться база данных, если ещё не докопировалась.


В общем, достаточно сложно. Гораздо проще использовать нормальный гипервизор и нормальное средство резервирования виртуальных машин, которое может автоматически копировать всё без отключения и экономить место за счёт использования snapshot-ов виртуальной машины, так что можно резервировать хоть по 3 раза в день. А на выходе у вас всегда будет готовая к запуску копия машины, о чём Вы и сами говорили.

Неудачный бесплатный гипервизор - настройте в виртаулке диск с LVM и создавайте снимки всей системы, а старые снимки удаляйте. Всё равно сейчас бэкапите в рамках той же самой машины. Правда есть нюанс - как тут пишут нужно перед созданием снимка в mysql нужно сделать FLUSH TABLES WITH READ LOCK, а после - UNLOCK TABLES.

Но на самом InnoDB выполняет дамп базы в транзакции, поэтому даже при использовании традиционного способа с mysqldump, дамп базы будет консистентным. Поэтому вполне будет достаточно сделать дамп БД и скопировать moodledata/filedir не останавливая сервер. А не запустился бэкап у вас после восстановления, скорее всего, из-за того, что скопировали всю moodledata, а не только filedir, и битым оказался именно кэш.

В ответ на Vadim Dvorovenko

Re: Автоматическое резервное копирование курсов

от Dmitriy Makarov -

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

В ответ на Dmitriy Makarov

Re: Автоматическое резервное копирование курсов

от Dmitriy Makarov -
Кстати, в crontab может быть проблема с такой записью 

30 01 * * * /home/backups/backup.sh >/dev/null

У меня например при обычном создании задания

 crontab -e 

Скрипт не отправлял сообщение на почту.

Корректно заработал такой вариант

sudo crontab -u root -e
И потом

30 01 * * * /bin/bash /home/backups/backup.sh >/dev/null 2>&1
Если нужно вывести лог для поиска проблемы, то вместо 
>/dev/null 2>&1

пишем

>/home/backups/backup.log 2>&1

в процессе выполнения скрипта по указанному пути создастся файл с логом


В ответ на Dmitriy Makarov

Re: Автоматическое резервное копирование курсов

от Dmitriy Makarov -

Возвращаясь к нашим баранам... 

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

scp -B -i /root/.ssh/for_scp /home/backups_$DATE.gz user@server.ru:~/backups
Ну надо понимать, что это просто пример, пути я конечно не указываю.

Это были линуксовые машины и собственно проблем в принципе не наблюдалось и всех все устраивало.

Сейчас ситуация изменилась таким образом, что место для резервного копирования предоставляют ВНЕЗАПНО на WS2016 и максимум что могут предложить это ftp. Другие варианты категорически для начальника того отдела неприемлимы, в т.ч. и rsync, особенно его выбешивают фразы "туннельное соединение", "защищенный" и "ssh" улыбаюсь  

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

В ответ на Dmitriy Makarov

Re: Автоматическое резервное копирование курсов

от Vadim Tabunshchik -
Изображение пользователя Developers
максимум что могут предложить это ftp. Другие варианты категорически для начальника того отдела неприемлимы

А что в таком случае можно предложить? Ведь наверняка вас начальник пошлет подальше после предложения установить какой-то софт на WS2016 в смятении

По теме: я бы использовал OpenVPN

В ответ на Vadim Tabunshchik

Re: Автоматическое резервное копирование курсов

от Dmitriy Makarov -

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

В ответ на Dmitriy Makarov

Re: Автоматическое резервное копирование курсов

от Vadim Dvorovenko -
Изображение пользователя Developers Изображение пользователя Майнтейнер перевода

Нет ничего плохого в том, чтобы шифровать архив с резервной копией паролем. Такое например, при бэкапе в облако используется. Считайте, что ваш WS2016 - это облачный сервис, поменять вы его не можете, доверять вы его не можете, использовать другой не можете. 

Если у вас moodle на линуксе, вы можете для удобства смонтировать ftp как папку в своей файловой системе. Это позволит, например, самостоятельно накидать скрипт для удаления неактуальных версий. Архивировать с шифрованием можно в сразу в эту же папку - дополнительного места для этого не потребуется.


В ответ на Dmitriy Makarov

Re: Автоматическое резервное копирование курсов

от Dmitriy Makarov -

Собственно проблема моя думаю решена, но на всякий случай для тех, кто столкнется с ней информацию предоставлю.

Собственно какая проблема возникла... После переноса сайта на другой сервер перестало работать автоматическое резервное копирование в ряде курсов дисциплин. Лог выдавал следующую ошибку:

Exception: cannotfindparentidforelement id

ошибка при бекапе

Таких курсов скопилось довольно много (298) и как устранить ошибку не представлял в принципе. Причем в ряде курсов бэкап работал и автоматический и в ручном режиме. По элементам курса все было идентично.

Ковыряя саму ошибку понятно, что бэкап не может быть сделан из-за отсутствия информации по одному из элементам. Т.к. в системе есть плагины элементов курса стал смотреть именно в эту сторону. В моем случае таким элементом курса оказался openmeetings. С данным плагином при переносе сайта нужно быть осторожнее. Лучше всего его вообще временно удалить т.к. по сути информации никакой важной в нем нет, а вот после переноса системы даже если сам ресурс ОМ остался на месте и данные по нем не менялись в moodle такие элементы курса становятся пустышками (открыть ОМ они не могут). Причину этого я не нашел, возможно какой косяк самого плагина? баг авторизации для него? В общем те курсы, где элемент создавался или обновлялся после переноса прекрасно работают, а вот там где элемент не пересохранялся имеется проблема...

РЕШЕНИЕ: удалить плагин, при этом удаляются все его элементы во всех курсах. установить по новой. бэкапы ручные теперь работают, думаю будет и автоматический.

В ответ на Dmitriy Makarov

Re: Автоматическое резервное копирование курсов

от Dmitriy Makarov -
собственно да. все работает. теперь на все 298 курсов всего 3 ошибки, но это скорее всего еще скрипт не отработал
В ответ на Dmitriy Makarov

Re: Автоматическое резервное копирование курсов

от Dmitriy Makarov -
и так... проблема вернулась. ошибка все та же. возникает на 2-м бэкапе курса при добавлении элемента Openmeetings в курс дисциплины. возможно ли как-то исключить данный элемент из автоматического резервного копирования? собственно проблема поднималась весной на гитхабе (https://github.com/openmeetings/openmeetings-moodle-plugin/issues/34), но решения так и не было. ошибка аналогичная... при всем том, что на тестовой системе все вроде работает, но она на http, а эта с ssl...