Управление вашими облачными хранилищами данных с помощью Rclone

Эффективное управление вашими облачными хранилищами данных с помощью Rclone

Как оптимизировать передачу данных между несколькими системами объектного хранилища

Фото от Tom Podmore на Unsplash

Поскольку компании все больше и больше зависят от решений по хранению данных в облаке, необходимо иметь соответствующие инструменты и методы для эффективного управления их большими данными. На протяжении предыдущих публикаций (например, здесь и здесь) мы исследовали несколько различных методов извлечения данных из облачного хранилища и продемонстрировали их эффективность в различных типах задач. Мы обнаружили, что наиболее оптимальный инструмент может изменяться в зависимости от конкретной задачи (например, формата файла, размера файлов данных, образца доступа к данным) и метрик, которые мы хотим оптимизировать (например, задержка, скорость или стоимость). В этой публикации мы рассмотрим еще один популярный инструмент для управления хранилищем в облаке — иногда называемый “швейцарским ножом для облачного хранилища” — командной утилитой rclone. Поддерживая более 70 поставщиков услуг хранилища, rclone обеспечивает функциональность, аналогичную приложениям управления хранилищем, специфичным для поставщиков, таким как AWS CLI (для Amazon S3) и gsutil (для Google Storage). Но выполняет ли он достаточно хорошо, чтобы рассматривать его как жизнеспособную альтернативу? Существуют ли ситуации, когда rclone будет инструментом выбора? В следующих разделах мы продемонстрируем использование rclone, оценим его производительность и подчеркнем его ценность в определенном случае использования — передаче данных между различными системами объектного хранилища.

Оговорки

Эта публикация не претендует на то, чтобы заменить официальную документацию по rclone. Она также не является одобрением использования rclone или любых других инструментов, упомянутых в ней. Лучший выбор для управления данными в облаке будет зависеть от деталей вашего проекта и должен основываться на тщательном тестировании, специфичном для вашего случая использования. Убедитесь, что вы переосмысливаете наши утверждения с учетом самых актуальных инструментов, доступных на момент вашего чтения.

Получение данных из облачного хранилища с помощью Rclone

Следующая командная строка использует rclone sync для синхронизации содержимого облачного пути объектного хранилища с локальным каталогом. В этом примере продемонстрировано использование сервиса хранилища Amazon S3, но можно было бы легко использовать другой облачный сервис хранения.

rclone sync -P \            --transfers 4 \            --multi-thread-streams 4 \            S3store:my-bucket/my_files ./my_files 

Команда rclone имеет десятки флагов для настройки ее поведения. Флаг -P выводит ход передачи данных, включая скорость передачи и общее время. В приведенной выше команде мы включили два (из многих) управления, которые могут повлиять на время выполнения rclone: флаг transfers определяет максимальное количество файлов, которые можно загружать параллельно, а multi-thread-streams определяет максимальное количество потоков для передачи одного файла. Здесь мы оставили их значения по умолчанию (4).

Функциональность rclone зависит от правильного определения файла конфигурации rclone. Ниже мы продемонстрируем определение удаленного местоположения объектного хранилища S3store, используемого в приведенной выше командной строке.

[S3store]    тип = s3    провайдер = AWS    access_key_id = <id>    secret_access_key = <key>    region = us-east-1

Теперь, когда мы видели rclone в действии, возникает вопрос, предоставляет ли он какую-либо ценность перед другими инструментами управления облачным хранилищем, такими как популярная AWS CLI. В следующих двух разделах мы сравним производительность rclone с некоторыми его альтернативами в двух сценариях, которые мы подробно изучили в наших предыдущих сообщениях: 1) загрузка файла размером 2 ГБ и 2) загрузка сотен файлов размером 1 МБ.

Вариант использования 1: Загрузка большого файла

Следующая команда использует AWS CLI, чтобы загрузить файл размером 2 ГБ с Amazon S3. Это всего лишь один из многих методов, которые мы оценили в предыдущем сообщении. Мы используем команду time в Linux для измерения производительности.

time aws s3 cp s3://my-bucket/2GB.bin .

Сообщенное время загрузки составило примерно 26 секунд (т.е. ~79 МБ/с). Имейте в виду, что это значение было рассчитано на нашем собственном компьютере и может существенно различаться в различных средах выполнения. Ниже приведена эквивалентная команда rclone copy:

rclone sync -P S3store:my-bucket/2GB.bin .

В нашей настройке мы обнаружили, что время загрузки с использованием rclone более чем в два раза дольше, чем с использованием стандартной AWS CLI. Вполне вероятно, что это можно существенно улучшить путем правильной настройки флагов управления rclone.

Вариант использования 2: Загрузка большого количества маленьких файлов

В этом варианте использования мы оцениваем время выполнения загрузки 800 относительно маленьких файлов размером 1 МБ каждый. В предыдущем блоге мы обсудили этот вариант использования в контексте передачи образцов данных в обучающую рабочую нагрузку глубокого обучения и продемонстрировали превосходную производительность s5cmd в режиме beast. В режиме beast мы создаем файл с набором операций копирования объектов, которые выполняются s5cmd с использованием нескольких параллельных воркеров (по умолчанию 256). Вариант использования режима beast для s5cmd показан ниже:

time s5cmd --run cmds.txt

Файл cmds.txt содержит список из 800 строк следующего вида:

cp s3://my-bucket/small_files/<i>.jpg <local_path>/<i>.jpg

Команда s5cmd в среднем занимает время 9,3 секунды (с учетом десяти проб).

Rclone поддерживает функциональность, аналогичную режиму beast в s5cmd, с помощью параметра командной строки files-from. Ниже мы выполняем копирование наших 800 файлов с помощью rclone с установленным значением transfers равным 256, чтобы соответствовать значениям параллелизма по умолчанию s5cmd.

rclone -P --transfers 256 --files-from files.txt S3store:my-bucket /my-local

Файл files.txt содержит 800 строк следующего вида:

small_files/<i>.jpg

Копирование наших 800 файлов с помощью rclone занимает в среднем 8,5 секунды, чуть меньше, чем с использованием s5cmd (с учетом десяти проб).

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

Передача данных между системами объектного хранения

В наши дни не редкость, когда команды разработчиков хранят свои данные в более чем одном объектном хранилище. Причиной этому может быть необходимость защиты от возможного отказа хранилища или решение использовать сервисы обработки данных от нескольких провайдеров облачных услуг. К примеру, ваше решение для разработки искусственного интеллекта может опираться на обучение моделей в AWS с использованием данных в Amazon S3 и запуск анализа данных в Microsoft Azure, используя те же данные, хранящиеся в Azure Storage. Дополнительно вы можете хотеть хранить копию данных в локальной инфраструктуре хранения, такой как FlashBlade, Cloudian или VAST. В таких случаях требуется возможность передачи и синхронизации данных между несколькими объектными хранилищами в безопасной, надежной и своевременной манере.

Некоторые провайдеры облачных услуг предлагают специализированные сервисы для таких целей. Однако они не всегда соответствуют точным потребностям вашего проекта или не предоставляют вам желаемый уровень контроля. К примеру, Google Storage Transfer отличается быстрым перемещением всех данных в указанной папке хранения, но (на данный момент написания) не поддерживает передачу определенного подмножества файлов из нее.

Другой вариант, который мы можем рассмотреть, – это применение существующего управления данными к этой цели. Проблема в том, что инструменты, такие как AWS CLI и s5cmd, не позволяют (на данный момент написания) указывать различные настройки доступа и аккредитации безопасности для исходной и целевой систем хранения. Таким образом, для миграции данных между хранилищами требуется их передача в промежуточное (временное) хранилище. В следующей команде мы используем комбинацию s5cmd и AWS CLI для копирования файла из Amazon S3 в Google Storage через системную память с использованием пайпинга Linux:

s5cmd cat s3://my-bucket/file \      | aws s3 cp --endpoint-url https://storage.googleapis.com      --profile gcp - s3://gs-bucket/file

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

Передача данных с помощью Rclone

В отличие от инструментов, таких как AWS CLI и s5cmd, Rclone позволяет нам указывать различные настройки доступа для исходного и целевого хранилищ. В следующем файле конфигурации Rclone мы добавляем настройки для доступа к Google Cloud Storage:

[S3store]    type = s3    provider = AWS    access_key_id = <id>    secret_access_key = <key>[GSstore]    type = google cloud storage    provider = GCS    access_key_id = <id>    secret_access_key = <key>    endpoint = https://storage.googleapis.com

Передача одного файла между системами хранения имеет такой же формат, как его копирование в локальную директорию:

rclone copy -P S3store:my-bucket/file GSstore:gs-bucket/file

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

rclone copy -P --transfers 256 --files-from files.txt \            S3store:my-bucket/file GSstore:gs-bucket/file

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

Итоги

В этой статье мы исследовали управление хранением на основе облачных технологий с использованием Rclone и продемонстрировали его применение для задачи поддержки и синхронизации данных между несколькими системами хранения. Существует несомненно множество альтернативных решений для передачи данных. Но удобство и элегантность метода на основе Rclone вызывают сомнений.

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