Ускоряем передачу файлов с сервера на сервер через rsync

Rsync — замечательная утилита для синхронизации файлов между файлами. Она отлично подходит для создания бекапов, резервных копий и просто для переброса произвольных файлов с сервера на сервер. Rsync не единственный в своём роде, у него множество альтернатив: FTP, SSH, FISH, SCP и другие. Однако, эр-синк превосходит их по скорости и возможностям.

Запускается таким образом:

rsync [OPTION]... SRC [SRC]... DEST

где SRC и DEST могут быть как локальными файлами, так и адресами удалённых серверов в ssh-формате: [USER@]HOST:/path/to/files

Иначе говоря есть как минимум 2 стратегии передачи файлов:

  1. закачать файлы с текущего сервер на удалённый
  2. скачать файлы с удалённого сервера на текущий

Почему rsync работает медленно?

Одна из причин — использование опции —checksum (-с), что включает режим сравнения файлов по контрольной сумме, а не времени или размеру. При передаче большого объёма данных (от 10 Гб) или большого количества файлов эта опция может сильно замедлять передачу данных. Поэтому её лучше не использовать без явной на то необходимости.

Ещё одна вредная опция влияющая на скорость передачи данных — —compress (-z), которая отвечает за сжатие данных во время передачи. Например, скорость передачи файла размером 20Гб с включённым сжатием на соседний сервер по сети 100 Мбит колеблется между 10—20 Мб в секунду. Однако, при отключении сжатия тот же файл передаётся уже на скорости 20-60 Мб в секунду, т.е. в 2-3 раза быстрее!

При копировании больших файлов, например, баз данных более 30 Гб скорость ближе к концу файла может падать до 5-10 Мб в секунду. Как это решить сейчас расскажу.

Ещё один способ ускорить передачу файлов по rsync — использовать опцию —whole-file (-W). Однако, эта опция не совместима с флагом —append-verify. Кстати, опция —whole-file используется по-умолчанию если передача происходит в рамках одного сервера. Данный способ отключает возможность докачки и догрузки файла в случае обрыва соединения, а сам файл грузится под временным именем и только после полной передачи переименовывается. Этот способ передаёт данные со скоростью 40-70 Мб в секунду.

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

Как сделать бэкап с помощью rsync

Допустим, вы зашли по ssh на server1 и хотите сделать полную копию директории /var/lib/data/ на server2. Тогда команда будет выглядеть так:

rsync -W -ah --stats -v --progress /var/lib/data/* root@server2:/backups/server1/var/lib/data/

Флаг —human-readable (-h) выводит числа в понятном для человека формате, не в байтах, в мегабайтах или гигабайтах.

Опция -archive (-a) включает режим архивирования, что эквивалентно флагам -rlptgoD (без -H,-A,-X).

Флаг —progress показывает в реальном времени информацию о ходе выполнения передачи файлов, например:

collection-0-7602351091860075087.wt
 36.86K 100% 8.79MB/s 0:00:00 (xfer#7, to-check=41/48)
collection-11-7602351091860075087.wt
 4.10K 100% 1000.00kB/s 0:00:00 (xfer#8, to-check=40/48)
collection-2-7602351091860075087.wt
 16.38K 100% 3.12MB/s 0:00:00 (xfer#9, to-check=39/48)
collection-22-7602351091860075087.wt
 17.42G 58% 18.35MB/s 0:11:04

Флаг —verbose (-v) выводит подробную информацию о процессе синхронизации и используется для отладки.

Опция —stats выводит подробную статистику после завершения передачи данных, выглядит она примерно так:

Number of files: 529414
Number of files transferred: 529411
Total file size: 54.97G bytes
Total transferred file size: 54.97G bytes
Literal data: 54.97G bytes
Matched data: 0 bytes
File list size: 15.32M
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 55.02G
Total bytes received: 10.06M
sent 55.02G bytes received 10.06M bytes 20.10M bytes/sec
total size is 54.97G speedup is 1.00

Если же вам не нужно делать копию данных, а нужно перенести данные с одного сервера на другой, то добавьте опцию —remove-source-files, и тогда после завершения синхронизации исходный сервер удалит файлы.

Альтернативный способ передачи файлов

cd /path/to/files; tar cf - . | pv | ssh user@host "cd /path/to/files; tar xf -"

В данном случае используется комбинированный подход. На исходном сервере файлы архивируются в stdout с помощью tar, затем передаются на целевой сервер и на лету разархивируются. Из недостатков перед rsync: теряются оригинальные метки создания и редактирования файла, а так же владелец и права доступа. В середине можно заметить вызовы команды pv, всё что она делает — отображает скорость данных проходящих между источником и приёмником. Её нужно устанавливать отдельно, если такой возможности нет, то команду pv можно смело удалить из цепочки.

По скорости этот метод может отличаться как в лучшую, так и в худшую сторону от rsync. Проверяйте оба способа, так как сильно зависит от характеристик серверов, дисков, сети между ними, количества, размера и содержимого файлов.