Назад | Перейти на главную страницу

Как ускорить передачу файлов между массивами хранения?

У меня есть два больших массива хранения от разных производителей, каждый с пропускной способностью около 10 Гбит / с для чтения / записи. Мне нужно переместить несколько ТБ файлов из одного в другой. Каждый говорит по NFS и CIFS. В настоящее время при использовании cp, scp или rsync интерфейс GbE промежуточного хоста становится узким местом, поскольку мне приходится читать из одного массива и записывать в другой. Ни в одном из массивов нет хоста, в который я могу войти, чтобы исключить посредника. У меня есть группы хостов, которые могли бы обеспечить дополнительную пропускную способность, если бы я только мог сделать что-то вроде:

  rsync [src] [dest] --parallel-hosts=host1,host2,host3,host4

Есть ли простое решение этой проблемы?

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

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

Вы можете сделать это с помощью rsync примерно так:

  • сначала запустите rsync с --itemize-changes (это просто просматривает файловые системы и выводит список файлов, которые будут скопированы и т. д.)
  • обработать вывод --itemize-changes, чтобы извлечь имена файлов и разбить список на части
  • запускать каждый фрагмент в отдельном процессе rsync (или на отдельной машине), используя rsync с --files-from = chunkXX

Это очень помогает для сетевых файловых систем (NFS, Lustre и т. Д.), Где вы обычно не можете получить достаточную производительность от одного процесса / машины rsync.

По-прежнему требуется время, чтобы просмотреть файловые системы для их сравнения, но фактическое перемещение данных может быть очень быстрым. Кроме того, такие вещи, как cpio и cp, имеют тенденцию превосходить rsync при перемещении необработанных данных.

Другой вариант, который я использую довольно часто, - это простое find -type f /src а затем разделите этот список файлов и загрузите его в cpio на нескольких хостах.

Мне бы хотелось узнать, как это сделать проще / быстрее ...

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

Если вы не можете найти способ, чтобы контроллеры разговаривали друг с другом (как уже упоминали другие), вы можете попробовать сделать это:

На ваше место назначения сервер, выполните следующую команду:

$ nc -l -p 9999 | tar xvzf -

Затем на вашем источник сервер, выполните следующую команду:

$ tar cvzf - <SOURCEFILES> | nc -q 1 <DST_SERVER> 9999

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

Удачи!