Мне нужно передать огромное количество mp3 между двумя серверами (Ubuntu). Под огромным я подразумеваю около миллиона файлов, размер которых в среднем составляет 300 КБ. Я пробовал с scp
но это заняло бы около недели. (около 500 КБ / с) Если я передаю один файл по HTTP, я получаю 9-10 МБ / с, но я не знаю, как передать их все.
Есть ли способ быстро их все перенести?
Я бы порекомендовал tar. Когда деревья файлов уже похожи, rsync выполняет очень хорошо. Однако, поскольку rsync будет выполнять несколько проходов анализа для каждого файла, а затем копировать изменения, это намного медленнее, чем tar для начальной копии. Эта команда, скорее всего, сделает то, что вы хотите. Он будет копировать файлы между машинами, а также сохранять как разрешения, так и права собственности пользователей / групп.
tar -c /path/to/dir | ssh remote_server 'tar -xvf - -C /absolute/path/to/remotedir'
Согласно комментарию Макинтоша ниже, это команда, которую вы использовали бы для rsync
rsync -avW -e ssh /path/to/dir/ remote_server:/path/to/remotedir
Внешний жесткий диск и доставка курьером в тот же день.
Я бы использовал rsync.
Если вы экспортировали их через HTTP с доступными списками каталогов, вы также можете использовать wget и аргумент --mirror.
Вы уже видите, что HTTP быстрее, чем SCP, потому что SCP все шифрует (и, таким образом, создает узкие места в ЦП). HTTP и rsync будут двигаться быстрее, потому что они не шифруют.
Вот несколько документов по настройке rsync в Ubuntu: https://help.ubuntu.com/community/rsync
В этих документах говорится о туннелировании rsync через SSH, но если вы просто перемещаете данные в частной локальной сети, SSH вам не нужен. (Я предполагаю, что вы находитесь в частной локальной сети. Если вы получаете 9-10 МБ / с через Интернет, тогда я хочу знать, какие у вас соединения!)
Вот еще несколько очень простых документов, которые позволят вам настроить относительно небезопасный сервер rsync (без зависимости от SSH): http://transamrit.net/docs/rsync/
Без особых обсуждений используйте netcat, сетевой швейцарский нож. Никаких накладных расходов протокола, вы напрямую копируете в сетевой сокет. пример
srv1$ tar cfv - *mp3 | nc -w1 remote.server.net 4321
srv2$ nc -l -p 4321 |tar xfv -
С большим количеством файлов, если вы используете rsync, Я бы попробовал установить версию 3 или выше на обоих концах. Причина в том, что младшая версия перечислит каждый файл перед началом передачи. Новая функция называется инкрементная рекурсия.
Новый алгоритм инкрементной рекурсии теперь используется, когда rsync обращается к другой версии 3.x. Это запускает передачу быстрее (до того, как все файлы будут найдены) и требует гораздо меньше памяти. См. Параметр --recursive на странице руководства для ознакомления с некоторыми ограничениями.
При перемещении вчера 80 ТБ данных (миллионы крошечных файлов), переключение с rsync
к tar
оказался намного быстрее, поскольку мы перестали пытаться
# slow
rsync -av --progress /mnt/backups/section01/ /mnt/destination01/section01
и переключился на tar
вместо...
# fast
cd /mnt/backups/
tar -cf - section01 | tar -xf - -C /mnt/destination01/
Поскольку эти серверы находятся в одной локальной сети, место назначения монтируется по NFS в исходной системе, которая выполняет push. Не делать еще быстрее, мы решили не сохранять atime
файлов:
mount -o remount,noatime /mnt/backups
mount -o remount,noatime /mnt/destination01
На приведенном ниже рисунке показана разница, произошедшая при переходе с rsync на tar. Это был мой босса идея и мой коллега оба выполнили это и сделали великий запись в его блоге. мне просто нравится красивые картинки. :)
rsync, как и другие уже рекомендовали. Если накладные расходы ЦП из-за шифрования являются узким местом, используйте другой алгоритм с меньшей нагрузкой на ЦП, например blowfish. Например. что-то вроде
rsync -ax -e 'ssh -c blowfish' /local/path user@host:/remote/path
При копировании большого количества файлов я обнаружил, что такие инструменты, как tar и rsync, более неэффективны, чем они должны быть, из-за накладных расходов на открытие и закрытие многих файлов. Я написал инструмент с открытым исходным кодом под названием fast-archiver, который работает быстрее, чем tar для следующих сценариев: https://github.com/replicon/fast-archiver; он работает быстрее, выполняя несколько одновременных файловых операций.
Вот пример быстрого архивирования и tar при резервном копировании более двух миллионов файлов; fast-archiver архивируется за 27 минут, а tar - за 1 час 23 минуты.
$ time fast-archiver -c -o /dev/null /db/data
skipping symbolic link /db/data/pg_xlog
1008.92user 663.00system 27:38.27elapsed 100%CPU (0avgtext+0avgdata 24352maxresident)k
0inputs+0outputs (0major+1732minor)pagefaults 0swaps
$ time tar -cf - /db/data | cat > /dev/null
tar: Removing leading `/' from member names
tar: /db/data/base/16408/12445.2: file changed as we read it
tar: /db/data/base/16408/12464: file changed as we read it
32.68user 375.19system 1:23:23elapsed 8%CPU (0avgtext+0avgdata 81744maxresident)k
0inputs+0outputs (0major+5163minor)pagefaults 0swaps
Для передачи файлов между серверами вы можете использовать быстрый архиватор с ssh, например:
ssh postgres@10.32.32.32 "cd /db; fast-archive -c data --exclude=data/\*.pid" | fast-archiver -x
Я использую смолу netcat
подход, за исключением того, что я предпочитаю использовать socat
- гораздо больше возможностей для оптимизации для вашей ситуации - например, путем настройки mss. (Также смейтесь, если хотите, но я нахожу socat
аргументы легче запомнить, потому что они последовательны). Так что для меня это очень распространено в последнее время, поскольку я перемещаю вещи на новые серверы:
host1$ tar cvf - filespec | socat stdin tcp4:host2:portnum
host2$ socat tcp4-listen:portnum stdout | tar xvpf -
Псевдонимы необязательны.
wget --mirror
так как Эван Андерсон предложил или любой другой http-клиент. Будьте осторожны, чтобы не иметь неприятных символических ссылок или вводящих в заблуждение индексных файлов. Если все, что у вас есть, это MP3, вы должны быть в безопасности.Я заметил, что другие люди рекомендовали использовать netcat. На основе мой опыт с ним я могу сказать, что он медленный по сравнению с другими решениями.
Похоже, в верхнем ответе может быть пара опечаток. Это может сработать лучше:
tar -cf - /path/to/dir | ssh remote_server 'tar -xvf - -C /path/to/remotedir'
Другая альтернатива - Унисон. В этом случае может быть немного более эффективным, чем Rsync, и настроить слушателя несколько проще.
Благодаря замечательному ответу Скотта Пака (раньше я не знал, как это сделать с помощью ssh), я могу предложить это улучшение (если bash
это ваша оболочка). Это добавит параллельное сжатие, индикатор выполнения и проверит целостность сетевого соединения:
tar c file_list |
tee >(sha512sum >&2) |
pv -prab |
pigz -9 |
ssh [user@]remote_host '
gunzip |
tee >(sha512sum >&2) |
tar xC /directory/to/extract/to
'
pv
- прекрасная программа просмотра прогресса для вашей трубы и pigz
- это параллельная программа gzip, которая по умолчанию использует столько потоков, сколько имеет ваш процессор (я считаю, что до 8 максимум). Вы можете настроить уровень сжатия, чтобы лучше соответствовать соотношению пропускной способности ЦП и сети, и заменить его с помощью pxz -9e
и pxz -d
если у вас гораздо больше ЦП, чем пропускная способность. Вам нужно только убедиться, что две суммы совпадают по завершении.
Эта опция полезна для очень больших объемов данных, а также для сетей с высокой задержкой, но не очень полезна, если связь нестабильна и обрывается. В таких случаях rsync, вероятно, является лучшим выбором, поскольку он может возобновиться.
Пример вывода:
6c1fe5a75cc0280709a794bdfd23d7b8b655f0bbb4c320e59729c5cd952b4b1f84861b52d1eddb601259e78249d3e6618f8a1edbd20b281d6cd15f80c8593c3e - ]
176MiB [9.36MiB/s] [9.36MiB/s] [ <=> ]
6c1fe5a75cc0280709a794bdfd23d7b8b655f0bbb4c320e59729c5cd952b4b1f84861b52d1eddb601259e78249d3e6618f8a1edbd20b281d6cd15f80c8593c3e -
Для блочных устройств:
dd if=/dev/src_device bs=1024k |
tee >(sha512sum >&2) |
pv -prab |
pigz -9 |
ssh [user@]remote_host '
gunzip |
tee >(sha512sum >&2) |
dd of=/dev/src_device bs=1024k
'
Очевидно, убедитесь, что они одинакового размера или ограничения с count =, skip =, seek = и т. Д.
Когда я копирую файловые системы таким образом, я часто сначала dd if=/dev/zero of=/thefs/zero.dat bs=64k && sync && rm /thefs/zero.dat && umount /thefs
обнулить большую часть неиспользуемого пространства, что ускоряет xfer.
Вот небольшой тест для сравнения некоторых методов,
Количество файлов: 9632, Общий размер: 814 Мбайт, средний размер: 84 Кбайт
Команда для tar / netcat была:
Source : tar -cf - /sourcedir/ | nc -v 11.22.33.44 5000
Dest : nc -v -l 5000 | tar -xf -
На @scottpack ответ опции rSync
Чтобы отобразить ход загрузки, используйте параметр --progress после -avW в команде, как показано ниже.
rsync -avW --progress -e ssh /path/to/dir/ remote_server:/path/to/remotedir
Я думаю, что мой ответ здесь немного запоздалый, но я получил хороший опыт использования mc (Midnight Commander) на одном сервере для подключения через SFTP к другому серверу.
Вариант подключения через FTP находится в меню «Левый» и «Правый» путем ввода адреса следующим образом:
/#ftp:name@server.xy/
или
/#ftp:name@ip.ad.dr.ess/
Вы можете перемещаться и выполнять файловые операции почти так же, как в локальной файловой системе.
У него есть встроенная опция для копирования в фоновом режиме, но я предпочитаю использовать экранную команду и отсоединяться от экрана, пока mc копирует (я думаю, что он тоже работает быстрее).
Вы также можете попробовать использовать команду BBCP для перевода. Это буферизованный параллельный ssh, который действительно кричит. Обычно мы можем получить 90% + линейную ставку при условии, что мы будем держать трубу под напряжением.
$ bbcp -s 8 -w 64M -N io 'tar -cO srcdirectory' desthostname:'tar -x -C destdir'
Обычно мы очень стараемся не передвигаться. Мы используем пулы ZFS, к которым всегда можно просто «добавить» больше дискового пространства. Но иногда ... тебе просто нужно перемещать вещи. Если у нас есть "живая" файловая система, копирование которой может занять часы (или дни) даже при полномасштабном запуске ... мы выполняем одну двухэтапную процедуру отправки zfs:
Мы также отправляем наши дампы zfs через BBCP ... это максимизирует использование нашей сети и минимизирует время передачи.
BBCP находится в свободном доступе, вы можете погуглить, и это прямая компиляция. Просто скопируйте его в свой / usr / local / bin как на src, так и на целевую машину, и он будет работать.
Если у вас есть ftp-сервер на стороне src, вы можете использовать ncftpget из сайт ncftp. Он отлично работает с небольшими файлами, поскольку использует tar внутри.
Одно сравнение показывает следующее: перемещение небольших файлов размером 1,9 ГБ (33926 файлов)
Простой scp с соответствующими параметрами легко достигнет 9-10 МБ / с по локальной сети:
scp -C -c arcfour256 ./local/files.mp3 remoteuser@remoteserver:/opt/remote
С этими параметрами вполне вероятно, что пропускная способность станет в 4 или 5 раз быстрее, чем без параметров (по умолчанию).
Вы не упомянули, находятся ли две машины в одной локальной сети или безопасный канал (например, с использованием SSH) является обязательным, но вы можете использовать другой инструмент. netcat.
Я бы использовал на принимающей машине следующее:
cd <destdir>
netcat -l -p <port> | gunzip | cpio -i -d -m
Затем на отправляющей стороне:
cd <srcdir>
find . -type f | cpio -o | gzip -1 | netcat <desthost> <port>
Он имеет следующие преимущества:
gzip -1
обеспечивает легкое сжатие, не перегружая ЦП, поэтому дает хороший компромисс, давая небольшое сжатие при сохранении максимальной пропускной способности. (Возможно, не так выгодно для данных MP3, но не повредит.)например.,
find <dir1> <dir2> -type f | cpio -o | gzip -1 | netcat <desthost> <portone>
find <dir3> <dir4> -type f | cpio -o | gzip -1 | netcat <desthost> <porttwo>
Ноты:
tar
вместо того cpio
Если вы предпочитаете.gzip -1
вместо этого, чтобы избежать перегрузки процессора. (Или, по крайней мере, установите для параметра CompressionLevel значение 1.)Я столкнулся с этим, за исключением того, что переносил журналы Oracle.
Вот разбивка
scp
inefficient and encrypted (encrypted = slower than unencrypted
depending on the link and your processor)
rsync
efficient but typically encrypted (though not necessarily)
FTP / HTTP
both seem to be efficient, and both are plaintext.
Я использовал FTP с большим успехом (где большой успех эквивалентен ~ 700 Мбит / с в сети Gb). Если вы получаете 10 МБ (что равно 80 МБ / с), вероятно, что-то не так.
Что вы можете рассказать нам об источнике и получателе данных? Это одиночный привод на одиночный привод? RAID на USB?
Я знаю, что на этот вопрос уже есть ответ, но если ваша сеть работает так медленно с перекрестным кабелем Гбит / с, что-то абсолютно необходимо исправить.
Для 100 МБ / с теоретическая пропускная способность составляет 12,5 МБ / с, поэтому при 10 МБ / с у вас все хорошо.
Я бы также поддержал предложение сделать rsync, возможно, через ssh. Что-то вроде:
rsync -avW -e ssh $SOURCE $USER@$REMOTE:$DEST
При скорости 100 Мбит / с ваши процессоры должны иметь возможность обрабатывать шифрование / дешифрование без заметного влияния на скорость передачи данных. А если вы прервете поток данных, вы сможете продолжить с того места, где остановились. Остерегайтесь, с "миллионами" файлов запуск займет некоторое время, прежде чем что-либо действительно передаст.
Я не думаю, что вы добьетесь большего успеха, чем scp, если не установите более быстрые сетевые карты. Если вы делаете это через Интернет, это не поможет.
Я бы рекомендовал использовать rsync. Возможно, он не будет быстрее, но, по крайней мере, если он не удастся (или вы отключите его, потому что это займет слишком много времени), вы можете продолжить с того места, на котором остановились в следующий раз.
Если вы можете подключить 2 машины напрямую через гигабитный Ethernet, это, вероятно, будет самым быстрым.
Если вы отправляете файлы в формате MP3 и другие сжатые файлы, вы не получите особого результата от решения, которое пытается еще больше сжать эти файлы. Решением может быть что-то, что может создать несколько соединений между обоими серверами и, таким образом, увеличить нагрузку на пропускную способность между двумя системами. Когда это достигнет максимума, мало что можно будет получить без улучшения вашего оборудования. (Например, более быстрые сетевые карты между этими серверами.)
rsync, или вы можете захотеть удалить его в один файл, а затем scp. Если вам не хватает места на диске, вы можете направить tar прямо через ssh во время его создания.
Я попробовал несколько инструментов для копирования файла размером 1 ГБ. Результат ниже: HTTP - самый быстрый, с wget -c nc - второй в строке scp - самый медленный и пару раз терпел неудачу. Невозможно возобновить работу rsync использует ssh в качестве бэкэнда, поэтому результат тот же. В заключение, я бы выбрал http с wget -bqc и подождал. Надеюсь, это поможет
Мне пришлось скопировать диск BackupPC на другую машину.
Я использовал rsync.
В машине было 256 МБ памяти.
Я выполнил следующую процедуру:
rsync
без -H
(заняло 9 часов)cpool
каталог и начал с pc
каталог; Я перерезал передачу.rsync
с участием -H
флаг, и все файлы жестко связаны в pc
были правильно перенесены (процедура нашла все реальные файлы в cpool
а затем связан с pc
справочник) (заняло 3 часа).В конце концов я мог проверить с df -m
что не было потрачено лишнего места.
Таким образом я избегаю проблемы с памятью и rsync. Все время я могу проверить производительность, используя top и atop, и в итоге я передал 165 ГБ данных.