№ 4855 В разделе
Sysadmin
от February 16th, 2013,
В подшивках: Backups, Bash, Linux, SVN
Поставили мне недавно задачку ежедневно бэкапить наш корпоративный SVN. Когда я зашел посмотреть что там именно нужно бэкапить у меня аж челюсть отвисла… Репозиторий весил 37 гигабайт. 35 Гб одним файлом (!) + всякая мелочь.
Решено было сделать так:
strings
strings
на кусочки по 250 Мб и положить в отдельную директориюstrings
(не измененные не будут копироваться)Первый раз конечно будет скачиваться вообще весь репозиторий. Зато последующие разы только мелкие файлы и 1-4 кусочка по 250 Мб. Довольно простой метод и весьма устойчив к перебоям связи, которые у нас бывают.
Тот самый скрипт на рабочем сервере, который подготавливает файл strings к разрезанию и зеркалирует остальные файлы репозитория. Назовем его prepare_svn.sh. Он запускается не по крону, но также автоматически через ssh с бэкапного сервера (обязательно беспарольный вход с помощью ключа с бэкапного сервера на рабочий). Этот скрипт должен лежать в директории /data/backups/svn
. Измените пути, когда будете применять это к своему серверу.
#!/bin/bash BACKDIR="/data/backups/svn" rm -rf $BACKDIR/repo_strings.split mkdir $BACKDIR/repo_strings.split #turn off svn. you [realy] need it! chmod -x /usr/bin/svnserve sleep 120 #copy files excluding fucking big "strings" echo "coping repo files" rsync -vaz --exclude=db/strings /SVN/base /data/backups/svn/repo_svn_files/ #split fucking "strings" echo "splitting megafucking strings" split -d -a 3 -b 256000000 /SVN/base/db/strings $BACKDIR/repo_strings.split/ #fine. turn on svn chmod +x /usr/bin/svnserve
В скрипте выше перед копированием все подчищается. Это делать нужно обязательно. Размер частей большого файла измеряется в байтах. По окончанию работы этого скрипта SVN сервер включается обратно.
А вот и сам управляющий скрипт на бэкапном сервере. Он располагается внутри директории /opt/backup_svn
и запускается по крону в любимое для вас время. Скрипт сначала запустит на удаленном сервере скрипт подготовки, затем скопирует с рабочего сервера сначала мелкие файлы репозитория, а третьим шагом скопирует измененые частички файла strings
.
#!/bin/bash LOCALDIR="/opt/backup_svn" REMOTEDIR="/data/backups/svn" #run remote prepare script ssh -i /root/.ssh/megakey.pem root@myserver.ru "$REMOTEDIR/prepare_svn.sh" #rsync small files rsync -vaz --checksum --rsh="ssh -l root -i /root/.ssh/megakey.pem" myserver.ru:$REMOTEDIR/repo_svn_files/ $LOCALDIR/repo_svn_files/ #rsync fucking big "strings" rsync -vaz --checksum --rsh="ssh -l root -i /root/.ssh/megakey.pem" myserver.ru:$REMOTEDIR/repo_strings.split/ $LOCALDIR/repo_strings.split/
Теперь у вас есть бэкапилка для больших репозиториев.
Fortune cookie: The old archeologist, Throstle, Discovered a marvelous fossil. He knew from its bend And the knot on the end, 'Twas the penis of Paul the Apostle.
Спасибо. Пригодится может быть.