0

Синхронизация файлов с помощью rsync по ssh

Для копирования файлов по сети можно использовать множество инструментов.
Наиболее распространённым считается ftp, но многие используют и scp для небольших объемов.
С синхронизацией все немного сложнее.. В статье lftp — Синхронизация папок по ftp я описал, как можно выполнять синхронизацию по ftp, но это не очень удачная идея и применима, только когда нет альтернатив.

Для синхронизации данных можно использовать rsync по ssh.
Если у Вас есть доступ по ssh на сервер, то это наиболее простой и надёжный способ, который не требует никаких предварительных настроек. Кстати это и более безопасно.

Итак сначала расскажу про использование rsync вообще , т.к. rsync по ssh — это частный случай использования.
В общем виде команда выглядит так:

Pull: rsync [ОПЦИИ] [ПОЛЬЗОВАТЕЛЬ@]ХОСТ:ИСТОЧНИК... [ПОЛУЧАТЕЛЬ]
Push: rsync [ОПЦИИ] ИСТОЧНИК 1 [ИСТОЧНИК N] [ПОЛЬЗОВАТЕЛЬ@]ХОСТ:ПОЛУЧАТЕЛЬ

В документации по rsync вариант, когда копируются файлы с локальной системы на удалённую, называется «push». В случае же, когда файлы копируют с удалённой системы на локальную, называется «pull». В моих примерах я использую только push.
Как видно, обязательным параметром для rsync является ИСТОЧНИК, которых может быть более одного. А вот ПОЛУЧАТЕЛЬ может и вовсе отсутствовать, в этом случае rsync все лишь выведет список файлов источника.

Приведу краткий перечень основных ключей: 
-a, работа в режиме архивирования, экфивалентна -rlptgoD.
Передав rsync эту опцию вы получите:
-r,  рекурсивное копирование каталогов;
-l,   копирование символических ссылок «как есть», то есть rsync не
будет следовать по ним, обращаясь к файлам;
-p,  сохранение прав доступа к файлам;
-t,   сохранение штампов времени модификации файлов;
-g, -o,   сохранение владельца и группы файла соответственно;
-D,   эквивалентно —devices —specials
—devices  сохранение файлов устройств (опция будет работать
только для суперпользователя);
—specials    сохранение специальных файлов.

-u  Режим обновления — пропускаются файлы на получателе, имеющие
более позднюю дату модификации, чем в источнике.

-v,  заставляющая rsync выводить имена копируемых файлах.

-q, не выводит сообщения об ощибках —

-z, включает режим сжатия

-P,  отображать прогресс при копировании.

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

-n,  режим тестирования, нужен для проверки, что скопирует rsync.
Используется с  -v и/или -i

-i, показывать, какие изменения выполняются. Используется часто с -n

-H, — сохранять жесткие ссылки, оставляя их на другом конце бэкапа;

-x   — не выходить за пределы текущей точки монтирования;

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

-compare-dest=DIR — сохранять новые и измененные файлы в отдельной
директории, не трогая на время копирования
основную директорию назначения, в конце — разом,
путем переименования, обновить содержимое
бэкапа;

—link-dest=DIR — использовать жесткие ссылки на файлы в DIR, например,
для создания подобия снапшотов;

—ignore-errors — продолжать копирование и удаление после появления
ошибок;
—max-delete — ограничение максимально числа удаляемых за один раз
файлов и каталогов;

-A — сохранять не только права доступа, но и ACL; —files-from=FILE — задать
список директорий и файлов для бэкапа в файле;

Команды для синхронизации:
В общем виде для передачи данных копирование данных используем команду (1-я команда заливает на сервер, 2-я скачивает)


rsync -zavP /tmp/dir1 /tmp/dir2 root@10.10.10.10:/root
rsync -zavP root@10.10.10.10:/root /tmp/dir1

С гарантией соответствия исходным данным я использую команду:


rsync -czavP /tmp/dir1 /tmp/dir2 root@10.10.10.10:/root
rsync -czavP root@10.10.10.10:/root /tmp/dir1

Для проверки, что будет делать rsyn добавляем опции -nvi.
Работа в тестовом режиме.


rsync -nvizaP /tmp/dir1 /tmp/dir2 root@10.10.10.10:/root
rsync -nvizaP root@10.10.10.10:/root /tmp/dir1 

Важные моменты, которые нужно учитывать:

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

rsync -a /dir1/dir2 /dir3 - будет создана иерархия /dir3/dir2/файлы 
rsync -a /dir1/dir2/ /dir3 - будет создана иерархия /dir3/файлы 

2. При транзитном переносе файлов через дополнительную машину не нужно забывать, что опция «-a» подразумевает трансляцию имен пользователей и групп в локальные uid/gid,
т.е. скопировав данные с первой машины на вторую, а потом со второй на локально подключенный жесткий диск, предназначенный для третьей машины, получим на третьей машины совершенно иных владельцев каталогов и файлов. Не тех которые были в /etc/password первой машины, а тех, которые в данным момент в /etc/password второй машины (изменятся типовые пользователи, например, web, ftp, dhcp, номера uid/gid которых отличаются на двух машинах).
Чтобы этого не произошло нужно испольщовать опцию «—numeric-ids«.

3. Особенности задания файлов исключений—exclude-from=файл» или « —exclude маска1 —exclude маска2«).
Для того чтобы исключить из бэкапа содержимое директории, но саму директорию оставить, нужно указать в «exclude» файле «/dir/*», а не «/dir/» (под «/dir» подпадет и /dir123, и файл /dir.txt, для директорий указание «/» в конце обязательно).

Звездочка («*») в шаблоне действует только на имя файла/каталога, чтобы маской охватывалась часть пусти, включая «/», нужно писать «**».

Шаблон не начинающийся с ‘/’ проверяется с конца строки.
Например «/dir/test» будет проверен c начала пути, а «dir/test.txt» или «*.log» с конца.

Если необходимо исключить все поддиректории в /dir, кроме /dir/best, в список исключений нужно поместить: + /dir/best/ — /dir/* При переборе содержимого «exclude» файла, срабатывает первое правило под которое подпадает текущий путь, не важно исключающие или нет.

В качестве корня выступает директория назначения, т.е. «/» в «exclude» файле = «/dir3/dir2» или «/dir3» из первого совета.

4. Запрещение двойного сжатия при передаче данных по SSH. rsync при задании опции «-z» более оптимально сжимает передаваемые данные, поэтому сжатие средствами ssh можно отключить:


export RSYNC_RSH="ssh -c arcfour -o Compression=no -x"

rsync -a -z -v -P --bwlimit=16 /dir1 /dir2 user@test.ru:/dir3/

где, —bwlimit=16 ограничивает пропускную способность при копировании бэкапа в 16 Кбайт в сек.

5. Изменение уровня точности при сравнении локального и удаленного времени модификации файлов. Например, для того чтобы считать идентичными файлы время модификации которых отличается на 1 секунду необходимо указать: «—modify-window=1«.

Ссылки:
Полезные рецепты при работе с rsync
Backup в Linux: rsync-клиент
cwRsync — реализация rsync под Windows

Честно взято тут: http://nix-sa.blogspot.ru/2011/11/rsync-ssh.html 🙂 — Хорошая статья все по теме и понятно.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *