FastNetMon

Monday 15 February 2010

Использование rsync для передачи файлов на удаленный сервер

Довольно часто приходится копировать иерархии папок с одного места на другое с сохранением владельцев/разрешений. Обычно, я это делал посредством cp -a + sshfs, но есть намного более правильное для этой задачи средство - rsync. Который умеет ряд замечательных фишек, например, ограничение скорости передачи данных, работу поверх ssh, возможность передачи только изменившихся файлов и проч.

Для работы поверх SSH сначала необходимо настроить доступ по сертификату на удаленный сервер: http://phpsuxx.blogspot.com/2009/12/ssh_17.html

Простейшая команда для синхронизации двух файловых иерархий выглядит так (обращаю внимание, никаких оканчивающих слешей в путях быть не должно!!! иначе поведение rsync будет не таким, как ожидается):
rsync -avH --numeric-ids /var/backup vuser@domain.ru:/backup2/user


Причем, /var/backup - это локальная папка, а вот передается она на удаленный сервер domain.ru в папку /backup2/user, при этом целевая папка не обязательно должна существовать - rsync создаст ее сам. Ключ v выводит дополнительную информацию, которая крайне полезна во время отладки. А вот о ключе -a стоит поговорить подробнее, так как он крайне полезен и удобен:


This is equivalent to -rlptgoD. It is a quick way of saying you want recursion and want to preserve almost everything (with -H being a notable omission). The only exception to the above equivalence is when --files-from is specified, in which case -r is not implied.

Note that -a does not preserve hardlinks, because finding multiply-linked files is expensive. You must separately specify -H.


То есть при копировании будут следующие настройки:
1) рекурсивная передача
2) символические ссылки будут копироваться как символические ссылки а не файлы, на которые они указывают
3) после копирования будут сохранены разрешения на файлы и папки (unix chmod)
4) будет сохранено время изменения
5) будет сохранена группа-владелец файла / папки
6) будет сохранен пользователь-владелец файла / папки
7) будут сохранены в исходном виде файлы устройств
8) будут сохранены в исходном виде специальные файлы (именованные сокеты и fifo)

Обращаю внимание, что для сохранения пунктов 5, 6, 7, 8 на удаленной системе у Вас должны быть root полномочия.

Ключ -H предназначен для копирования hard (жестких) ссылок как ссылок, а не как отдельных файлов, набор фич ключа -a этого не делает и об этом указано в документации.

А ключик --numeric-ids предназначен для того, чтобы при восстановлении данных о владельце на принимающей стороне не происходило разыменование имени группы / пользователя (владельцев файлов), а копировались лишь числовые значения uid / gid. То есть, вместо того, чтобы на исходном сервере сохранить данные о владельце в виде www-data:www-data, скопировать файл на целевой сервер, узнать, какой uid/gid соответствует группе-пользователю www-data на целевом сервере и установить их (uid/gid) для файла, мы просто копируем 33:33 (uid/gid www-data) как данные о пользователе-группе и устанавливаем их на целевом сервере.

Но почему это делать обязательно? Допустим, мы переносим OpenVZ контейнер (с Debian на борту) с сервера, где на ноде www-data создан как 33:33 на сервер, где www-data по каким-то причинам оказался 44:44, как результат мы получим 44:44 как владельца всех файлов сайта в контейнере, что, разумеется, приведет к его неработоспособности.

Теперь о фишках, исходная папка занимает довольно много места:

du -sh /var/backup
280M /var/backup


Теперь запускаем первый раз выше означенную команду передачи файлов на удаленный сервер:

sent 292542176 bytes received 982 bytes 11472280.71 bytes/sec
total size is 292502769 speedup is 1.00


Тут все как и ожидалось - передано 280 мегабайт и ускорения (speedup) нету никакого.

Теперь повторяем запуск и видим следующее чудо:

sent 209914 bytes received 337186 bytes 364733.33 bytes/sec
total size is 292502769 speedup is 534.64


Ускорение аж в 500 раз и передано треть мегабайта вместо 280 мегабайт, что налицо является огромной экономией - вот в этой фиче и есть основная ценность rsync - он не передает только изменившиеся файлы :)

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

Также при проблеме с пропускной способностью канала стоит добавить ключик -z, который включит сжатие передаваемых файлов.

2 comments :

  1. спасибо за ман :), сегодня скопировал свой home папку на удаленный сервер

    ReplyDelete
  2. Спасибо, то что нужно. Со слешами в конце rsync тему самому пришлось раскапывать.

    ReplyDelete

Note: only a member of this blog may post a comment.