четверг, 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 

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

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

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

    ОтветитьУдалить
  3. Анонимный28 июля 2014 г., 15:22

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

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

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

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

    ОтветитьУдалить
  7. Анонимный10 июля 2015 г., 8:37

    Спасибо за статью, а организовать работу сервиса в режиме push на множество хостов?

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

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

      Удалить