Я пытаюсь создать резервную копию удаленного сервера. Это моя конфигурация:
Server1 (webserver)
Server2 (backupserver)
Это мой маленький сценарий. Он запускается с server2:
#!/bin/bash
date=`date +%F`
basepath=/var/backup
webfolder=$basepath/$date/websites/
for f in $(ssh root@server1 "ls -l /var/www/ | egrep '^l'")
do
if [[ $f = *.* ]]
then
echo "processing $f ";
ssh root@server1 "tar zcf - /var/www/$f/web/" > $webfolder/$f.tar.gz
fi
done;
Проблема в том, что он слишком медленный! Как мне ускорить этот скрипт?
Обновления:
Я уже безуспешно использовал Rsync. Это команда, которую я использую:
/usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded \
--rsh="/usr/bin/ssh -p 22" root@123.123.123.123:/var/www \
/home/backups/daily.0/webserver/
Серверы подключаются через гигабитный коммутатор Dell. Оба сервера имеют сетевую карту Gigabit. Они находятся в одной подсети.
Решение rSync:
В конце концов, благодаря предложениям, я пошел по этому пути:
Жду первый раз много времени для первого бекапа.
Дистрибутив: серверы Debian
Вы изобретаете велосипед. Вам следует попробовать использовать rsync. rsync создаст для вас список файлов и использует удивительный алгоритм, который работает очень быстро, даже по медленным ссылкам или зашифрованным соединениям, которые медленнее из-за накладных расходов.
Очень легко запустить rsync -vvarP root@server1:/var/www/ root@server2:/var/backup/
Я не думаю, что это наиболее вероятное объяснение, но, прочитав проблему, с которой вы столкнулись с rsync, вполне возможно, что вы страдаете от несоответствия дуплексного режима на одном или обоих соединениях NIC-коммутатора.
Попробуйте сделать netstat -in
на обоих серверах и проверьте количество ошибок при передаче. Ненулевые ошибки передачи часто сигнализируют о несоответствии дуплексного режима, и одним из следствий этого является разрешение медленных, малых пакетов (интерактивных) соединений беспрепятственно, но жесткое ограничение полноскоростных соединений для передачи больших объемов данных.
редактировать (после вашего комментария ниже): Хорошо, это не симптом несоответствия дуплексного режима, поэтому проигнорируйте мое предложение. По-прежнему было бы полезно выяснить, в чем узкое место, когда вы прямо сейчас попробуете rsync-over-ssh, поскольку это не процессор.
Я бы посоветовал вам использовать rsnapshot. Он также основан на rsync. Я использую его для резервного копирования многих удаленных серверов. Это займет некоторое время в первый раз, а затем очень быстро, если ваши данные не сильно меняются. Это полностью настраиваемый и довольно быстрый (сеть в моем случае является узким местом).
Поскольку ваши два сервера находятся на одном коммутаторе и в одном сегменте сети, я предлагаю установить демон rsync на вашем резервном сервере и избегать использования SSH в целом.
Я предлагаю следующие настройки для вашего демона rsync. Я бы дал более конкретную инструкцию, но вы не упомянули свой дистрибутив.
[yourshare]
path = /yourpath/
read only = no
list = yes
uid = youruser
gid = youruser
hosts allow = you.rip.add.res
Это может быть ограничено доступом только с серверов, с которых вы хотите создать резервную копию. Оттуда вы сможете запланировать задание rsync прямо к месту назначения без использования SSH, что устранит эту проблему.
Если ваш сайт состоит из большого количества файлов, процесс rsync может зависнуть при отправке добавочного списка файлов. В таком случае параметры --delete-before или --delete-after могут оказаться полезными.
Есть также некоторые конфигурации, в которых файлы сначала копируются, а затем анализируются локально. Я давно не использовал rsync через SSH, но возможно, что настройки, которые вы пытаетесь сделать, имеют такой эффект.