Передача 15 ТБ крошечных файлов

79

Я архивирую данные с одного сервера на другой. Изначально я начал rsyncработу. Потребовалось 2 недели для создания списка файлов только для 5 ТБ данных и еще одна неделя для передачи 1 ТБ данных.

Затем мне пришлось убить работу, так как нам нужно немного простоя на новом сервере.

Было решено, что мы доработаем это, так как нам, вероятно, больше не понадобится доступ к нему. Я думал разбить его на куски по 500 ГБ. После того, как я tarэто тогда, я собирался скопировать это через ssh. Я использовал tarи, pigzно это все еще слишком медленно.

Есть ли лучший способ сделать это? Я думаю, что оба сервера на Redhat. Старый сервер Ext4, а новый XFS.

Размеры файлов варьируются от нескольких кб до нескольких мегабайт, а в 5 ТБ - 24 млн. JPEG. Так что я предполагаю около 60-80 миллионов за 15 ТБ.

редактировать: после игры с rsync, nc, tar, mbuffer и pigz в течение нескольких дней. Узким местом будет дисковый ввод-вывод. Поскольку данные распределяются на 500 дисках SAS и около 250 миллионов jpegs. Однако теперь я узнал обо всех этих замечательных инструментах, которые я смогу использовать в будущем.

lbanz
источник
1
возможный дубликат linux в linux, передача 10TB?
D34DM347 9.09.15
2
Одним из вариантов является создание сжатых tar-файлов на внешнем диске и их перенос в новую систему. Дополнительный диск ускорит создание файлов tar (не будет записывать на существующие диски в системе, возможно, при попытке прочитать с них 15 ТБ) и не будет связывать новый сервер.
Брайан,
4
Есть ли лучший способ сделать это? - Да, репликация DFS в Windows Server 2012 R2 подготовит это примерно за 10 часов . И он будет синхронизировать изменения и выбрать, где он остановился после перезагрузки.
TessellatingHeckler
27
@TessellatingHeckler: так вы предлагаете мигрировать OP из Redhat в Windows перед архивированием?
Томас Уэллер
12
@ThomasWeller Они спросили «есть ли лучший способ?», И есть. Я не рекомендую, чтобы они использовали лучший способ. Они могут свободно использовать команды в конвейере, которые не могут восстановиться после прерывания, не будут проверять содержимое файла, не могут сообщать о состоянии копирования, не могут использовать ранее скопированные блоки, чтобы избежать копирования частей файлов, не имеют неявного поддерживает низкоприоритетное копирование, не может быть приостановлено, не упоминает о копировании ACL и нуждается в ком-то, чтобы оставаться в системе для его запуска. Тем не менее, любой, кто следует за ним, может быть заинтересован - или ему будет предложено сказать «x делает это в Linux».
TessellatingHeckler

Ответы:

64

У меня были очень хорошие результаты , используя tar, pigz(параллельный GZIP) и nc.

Исходная машина:

tar -cf - -C /path/of/small/files . | pigz | nc -l 9876

Машина назначения:

Извлекать:

nc source_machine_ip 9876 | pigz -d | tar -xf - -C /put/stuff/here

Сохранить архив:

nc source_machine_ip 9876 > smallstuff.tar.gz

Если вы хотите видеть скорость передачи данных только через трубу pvпосле pigz -d!

h0tw1r3
источник
3
FYI, вы можете заменить pigzс gzipили удалить его полностью, но скорость будет значительно медленнее.
h0tw1r3
10
Как это можно принять, если ОП уже пробовал tarи pigz? Я не понимаю ...
Томас Уэллер
5
@ThomasWeller, с чего ты взял, что он попробовал pigz? Судя по вопросу, похоже, что он только что попробовал rsync, и рассматривал возможность использования tarдля разделения и объединения данных. Особенно, если он не использовал параметр -z/ --compressна rsync, pigzтеоретически может помочь значительно.
Доктор J
1
@ThomasWeller да, действительно, я уже пробовал tar и pigz, но не nc. Я использовал ssh, поэтому он добавил намного больше накладных расходов.
августа
2
@lbanz это просто означает, что tarданные не генерируются достаточно быстро, pigzчтобы использовать много ЦП для сжатия. Чтение большого количества маленьких файлов включает в себя гораздо больше системных вызовов, гораздо больше операций поиска дисков и намного больше нагрузки на ядро, чем чтение того же количества байтов больших файлов, и кажется, что вы просто узкое место на фундаментальном уровне.
Хоббс
21

Я бы придерживался решения rsync. Современный (3.0.0+) rsync использует инкрементный список файлов, поэтому ему не нужно создавать полный список перед передачей. Так что перезапуск не потребует от вас повторной передачи в случае проблем. Разделение передачи на каталог верхнего или второго уровня оптимизирует это еще больше. (Я бы использовал rsync -a -Pи добавил, --compressесли ваша сеть работает медленнее, чем ваши диски.)

Лиса
источник
Я использую rsync 2.6.8 на старом сервере. Так как это одна из тех коробок, где нам не разрешено устанавливать / обновлять что-либо, как указано поставщиком, или это приводит к аннулированию гарантии. Я мог бы обновить его и посмотреть, будет ли это быстрее.
lbanz
18
Найдите (или создайте) статически связанный бинарный файл rsync и просто запустите его из своего дома. Надеюсь, это не испортит никаких гарантий.
Фокс
Как насчет unison? Как это по сравнению с rsync?
Гвинет Ллевелин
15

Настройте VPN (если это Интернет), создайте виртуальный диск некоторого формата на удаленном сервере (сделайте его ext4), подключите его на удаленном сервере, затем подключите его на локальном сервере (используя протокол уровня блока, такой как iSCSI). ), и используйте dd или другой инструмент уровня блока, чтобы сделать передачу. Затем вы можете скопировать файлы с виртуального диска на реальный (XFS) диск по своему усмотрению.

Две причины:

  1. Отсутствие накладных расходов на файловую систему, что является основным виновником производительности
  2. Не ищите, вы смотрите на последовательное чтение / запись с обеих сторон
Артур Кей
источник
3
Обход файловой системы это хорошо. Копирование на уровне блоков файловой системы, монтируемой для чтения и записи, - очень плохая идея. Размонтируйте или смонтируйте только для чтения.
JB.
Копия 15 ТБ - отстой. Это означает, что новому серверу нужно минимум 30.
Артур Кей
3
Если сервер использует LVM, можно сделать снимок файловой системы только для чтения и скопировать его. Затраты пространства только для изменений в файловой системе, которые происходят во время чтения снимка.
Лиори
9

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

Робин Хаммонд
источник
2
Это около 1PB дисков 2TB, так что это слишком много.
августа
3

Используйте mbuffer, и если он находится в защищенной сети, вы можете избежать шага шифрования.

JamesRyan
источник
3

(Многие разные ответы могут работать. Вот еще один.)

Создайте список файлов с помощью find -type f(это должно закончиться через пару часов), разделите его на маленькие порции и перенесите каждый порцию с помощью rsync --files-from=....

PTS
источник
3

Вы рассматривали sneakernet? Под этим я подразумеваю перенос всего на тот же диск, затем физическое перемещение этого диска.

около месяца назад Samsung представила накопитель на 16 ТБ (технически это 15,36 ТБ), который также является SSD: http://www.theverge.com/2015/8/14/9153083/samsung-worlds-largest-hard -Драйв-16TB

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

Nzall
источник
2

Если есть вероятность получить высокий коэффициент успеха при дедупликации, я бы использовал что-то вроде borgbackup или Attic.

Если нет, проверьте решение netcat + tar + pbzip2 , измените параметры сжатия в соответствии с вашим оборудованием - проверьте, что является узким местом (ЦП? Сеть? IO?). Pbzip2 будет приятно работать на всех процессорах, обеспечивая лучшую производительность.

neutrinus
источник
lzma ( xz) распаковывается быстрее, чем bzip2, и хорошо работает на большинстве входных данных. К сожалению, xzопция многопоточности пока не реализована.
Питер Кордес
Обычно стадия сжатия требует больше мощности, чем декомпрессия, поэтому, если ограничивающим фактором является процессор, pbzip2 приведет к лучшей общей производительности. Декомпрессия не должна влиять на процесс, если обе машины похожи.
нейтринус
Да, моя точка зрения была обидна, что нет однопотоковой многопоточной lzma. Хотя для этого варианта использования передачи целых файловых систем данных, pigzбыло бы вероятно. будь самым медленным компрессором, который ты хочешь использовать. Или даже lz4. ( lz4mtДоступен многопоточный поток для одного потока. Он не очень эффективно обрабатывает потоки (порождает новые потоки очень часто), но ускоряется)
Питер Кордес
2

Вы используете RedHat Linux, так что это не будет применяться, но в качестве другого варианта:

Я имел большой успех, используя ZFS для хранения миллионов файлов, так как inode не проблема.

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

ZFS - это прежде всего файловая система Solaris, но ее можно найти в illumos (форк с открытым исходным кодом Sun's OpenSolaris). Я знаю, что также было немного удачного использования ZFS в BSD и Linux (используя FUSE?) - но у меня нет опыта в этом.

sleepyweasel
источник
3
Там был не-FUSE родным Linux порт ZFS для довольно долгого времени: zfsonlinux.org
EEAA
1

Запустите rsyncдемон на целевой машине. Это значительно ускорит процесс передачи.

Хайко Виснер
источник
-1

Вы можете сделать это с помощью tar и ssh, вот так:

tar zcf - <your files> | ssh <destination host> "cat > <your_file>.tar.gz"

Или, если вы хотите сохранить отдельные файлы:

tar zcf - <your files> | ssh <destination host> "tar zxf -"

Фабио Брито
источник
1
Это не будет дедупликация, нет возможности возобновить, сжатие с использованием только одного процессора.
нейтринус