четверг, 24 ноября 2011 г.

Синхронизация файлов с помощью 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 

12 комментариев:

  1. Спасибо. Полезно. Rsync удобно использовать для отлеживания изменений.

    ОтветитьУдалить
  2. А как указывать нестандартный порт ssh?

    ОтветитьУдалить
  3. Как можно автоматизировать ввод пароля для доступа по SSH?

    ОтветитьУдалить
  4. по ключам ssh на обоих серверах

    ОтветитьУдалить
  5. Пробовал cwRsync под Windows скорость намного медленнее чем Linux-Linux, а так быстрая штука

    ОтветитьУдалить
  6. rsa ключи открытый и закрытый прогугли

    ОтветитьУдалить
  7. Спасибо за статью, а организовать работу сервиса в режиме push на множество хостов?

    ОтветитьУдалить
    Ответы
    1. Первое что приходит в голову - просто запустить несколько rsync на разные хосты.

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

      Удалить
  8. Есть два сервера, на обоих поднята Samba. Папка-источник и папка-получатель отшарены. Делаю на хосте-получателе rsync -a -e ssh host1:/dir1 /dir1, а потом сравниваю с виндовой машины Total Commander'ом - куча файлов, имеющиеся в источнике, в получателе отсутствует, вывода в консоль об ошибках не было. Что копать?

    ОтветитьУдалить