Перенос миллионов файлов с одного сервера на другой

15

У меня есть два сервера. Один из них имеет 15 миллионов текстовых файлов (около 40 ГБ). Я пытаюсь перенести их на другой сервер. Я подумал об их архивации и передаче архива, но понял, что это не очень хорошая идея.

Поэтому я использовал следующую команду:

scp -r usrname@ip-address:/var/www/html/txt /var/www/html/txt

Но я заметил, что эта команда просто передает около 50000 файлов, а затем соединение теряется.

Есть ли лучшее решение, которое позволяет мне передавать всю коллекцию файлов? Я имею в виду использовать что-то вроде rsyncпередачи файлов, которые не были переданы при потере соединения. Когда произойдет другое прерывание соединения, я снова наберу команду для передачи файлов, игнорируя те, которые уже были успешно переданы.

Это невозможно с scp, потому что это всегда начинается с первого файла.

юли чика
источник

Ответы:

33

Как вы говорите, используйте rsync:

rsync -azP /var/www/html/txt/ username@ip-address:/var/www/html/txt

Варианты:

-a : enables archive mode, which preserves symbolic links and works recursively
-z : compress the data transfer to minimise network usage
-P : to display a progress bar and enables you to resume partial transfers

Как говорит @aim в своем ответе, убедитесь, что у вас есть трейлинг /в исходной директории (и в том, и в другом тоже хорошо).

Больше информации со страницы руководства

garethTheRed
источник
1
Я предлагаю добавить -hфлаг, чтобы использовать читаемые человеком единицы. И если вы хотите больше многословия, у вас есть несколько вариантов: -iи / или -v/ -vv.
nyuszika7h
2
Как правило, есть очень небольшая причина не всегда использовать rsync вместо scp. Его основное использование такое же, и он предлагает много дополнительных удобных функций.
pimlottc
Если sshэто не вариант для вас, и вам не нужно или вам не нужно шифрование, вы можете попробовать мой скрипт s3.amazonaws.com/skaperen/rsend
Skaperen
7

Просто используйте rsync поверх ssh!

rsync -av username@ip:/var/www/html/txt /var/www/html/

Со страницы руководства:

-a , - архив : это эквивалентно -rlptgoD. Это быстрый способ сказать, что вы хотите рекурсию и хотите сохранить почти все (при этом -H - заметное упущение). Единственное исключение из вышеприведенной эквивалентности - это когда указывается --files-from, в этом случае -r не подразумевается.

-v , - verbose : эта опция увеличивает объем информации, которую вы получаете во время передачи. По умолчанию rsync работает тихо. Один -v даст вам информацию о том, какие файлы передаются, и краткую сводку в конце. Два параметра -v предоставят вам информацию о том, какие файлы пропускаются, и немного больше информации в конце. Более двух опций -v следует использовать только при отладке rsync.

Обратите внимание, как я использовал косые черты в конце папок - это важно .

цель
источник
Возможно, вам следует добавить больше информации о значении косой черты. На rsyncстранице руководства: «Конечная косая черта в источнике изменяет это поведение, чтобы избежать создания дополнительного уровня каталога в месте назначения. Вы можете рассматривать конечный / источник как« скопировать содержимое этого каталога », а не« скопировать каталог по имени «, но в обоих случаях атрибуты содержащего каталога переносятся в содержащий каталог на месте назначения».
nyuszika7h
... а значение флагов -av?
MrWhite
0

Используйте lftp, он намного быстрее, чем rsync, и лучше всего подходит для зеркалирования веб-сайтов (много маленьких файлов). Он также может передавать параллельно, используя несколько соединений:

lftp -u username,password sftp://ip-address -e 'mirror --only-newer --no-dereference --parallel=5 /remote/path/ /destination/;quit'

Если одно соединение разорвано, оно снова подключится и продолжит работу. Если вы прервете передачу, она пропустит существующие файлы и продолжит.

http://lftp.yar.ru/

Михайло
источник
0

Другой способ - передать (необязательно сжатый) tar-файл через ssh:

tar -czf - ./* | ssh other.host.foo "cd /tmp; tar -xzf-"
jmullee
источник