S3sync когда `aws s3 sync` уже не справляется
Репозиторий давно не обновлялся
Последнее обновление было 7 месяцев назад.
Знакомая ситуация? Нужно перелить несколько миллионов (а то и миллиардов) мелких файлов в S3. Вы запускаете стандартный aws s3 sync, откидываетесь в кресле и... ждете. Час, два, а иногда и сутки. В такие моменты начинаешь задумываться: неужели в XXI веке нет способа делать это быстрее?
Оказывается, есть. Сегодня я хочу рассказать об одном проекте, который попался мне на GitHub и стал настоящей находкой для работы с большими объемами данных в S3-совместимых хранилищах. Встречайте — s3sync, утилита на Go, которая делает ровно одну вещь, но делает ее чертовски быстро.
Что это и зачем нужно?
s3sync — это консольная утилита для высокоскоростной синхронизации данных. Если коротко, это aws s3 sync на стероидах. Автор проекта изначально создавал ее для синхронизации миллиардов мелких файлов, и вся архитектура заточена именно под эту задачу.
Кому это пригодится?
- DevOps-инженерам, которым нужно настроить бэкапы или миграцию данных между S3-бакетами.
- Системным администраторам для переноса локальных файловых архивов в облако.
- Разработчикам, работающим с большими наборами данных, например, в машинном обучении или аналитике.
Главное отличие от стандартных инструментов — распараллеливание. Утилита использует многопоточность для загрузки и скачивания файлов, что позволяет утилизировать сетевой канал на полную катушку.
Ключевые возможности: что под капотом?
Давайте разберемся, что делает s3sync таким эффективным инструментом.
1. Феноменальная скорость
Это главная фишка проекта. Автор заявляет о скорости листинга объектов в S3 на уровне 5000 объектов в секунду, а скорость синхронизации мелких файлов (1-20 КБ) при 128 воркерах может достигать 2000 объектов в секунду. Конечно, все упирается в ваш сетевой канал, но цифры впечатляют. Если вам нужно перенести огромный архив фотографий, логов или пользовательских ассетов, разница во времени по сравнению со стандартными средствами будет колоссальной.
2. Гибкость направлений синхронизации
Утилита не ограничивает вас одним сценарием и поддерживает три основных направления:
- S3 в локальную файловую систему (FS): классический сценарий для скачивания бэкапов.
- Локальная FS в S3: идеально для загрузки данных на сервер.
- S3 в S3: супер-удобная фича для миграции данных между бакетами или регионами. Не нужно сначала скачивать все на локальную машину, а потом загружать обратно.
3. Хирургическая точность с фильтрами
Часто нам не нужно копировать все подряд. s3sync предлагает набор мощных фильтров, чтобы синхронизировать только то, что действительно необходимо:
- По расширению файла (
--filter-ext): например, скопировать только.jpgи.png. - По времени модификации (
--filter-after-mtime): отлично подходит для инкрементальных бэкапов, когда нужно докачать только новые файлы. - По Content-Type или ETag.
- Исключающие фильтры (
--filter-not-ext): скопировать все, кроме временных файлов.tmp.
Такой подход экономит не только время, но и трафик.
4. Контроль и надежность
Для серьезных задач важна предсказуемость. s3sync позволяет:
- Ограничивать скорость по количеству объектов в секунду (
--ratelimit-objects) или по пропускной способности (--ratelimit-bandwidth). Это полезно, чтобы не забивать весь сетевой канал. - Автоматически повторять неудачные операции (
--s3-retry). Сеть моргнула? Не беда, утилита попробует еще раз. - Наблюдать за процессом в реальном времени с помощью статистики (
--sync-progress).
Важный момент: s3sync работает в режиме "неразрушающей" синхронизации. Это значит, что файлы в папке назначения, которых нет в источнике, не удаляются. Это делает инструмент более безопасным для бэкапов.
Цена скорости: о чем стоит помнить
Как известно, бесплатный сыр бывает только в мышеловке. За высокую производительность приходится платить, и в случае с s3sync — это оперативная память.
По умолчанию утилита загружает каждый объект в RAM перед отправкой. Это и дает выигрыш в скорости на мелких файлах. Формула простая: требуемая RAM ≈ <средний размер объекта> * <количество воркеров>. Если вы работаете с терабайтами мелких файлов, памяти может потребоваться немало.
К счастью, есть решение. Во-первых, автор уверяет, что использование быстрого SSD под swap-файл почти не влияет на производительность. А во-вторых, для работы с крупными файлами предусмотрен "стриминговый" режим. Он активируется, если в пути к бакету указать s3s:// вместо s3://. В этом режиме потребление памяти значительно снижается, но может упасть скорость на маленьких объектах.
Как попробовать на практике?
Начать пользоваться s3sync очень просто. Можно скачать готовый бинарник со страницы релизов или использовать Docker-образ.
Вот пара примеров из документации:
Пример 1: Синхронизируем локальную папку в бакет S3
Предположим, у нас есть папка с бэкапами /opt/backups/s3/, и мы хотим загрузить ее содержимое в бакет my-awesome-bucket.
s3sync --tk YOUR_KEY --ts YOUR_SECRET -w 128 fs:///opt/backups/s3/ s3://my-awesome-bucket
Здесь мы указываем ключи доступа к S3 (--tk, --ts) и запускаем 128 параллельных воркеров (-w 128) для максимальной скорости.
Пример 2: Копируем данные из одного бакета в другой
Нужно перенести содержимое бакета old-bucket в new-bucket.
s3sync --sk KEY1 --ss SECRET1 --tk KEY2 --ts SECRET2 -w 128 s3://old-bucket s3://new-bucket
Обратите внимание, как элегантно решается задача — утилита сама будет "переливать" данные в облаке.
s3sync — это не замена aws cli на каждый день. Это узкоспециализированный, но очень мощный инструмент для конкретной задачи: быстрой синхронизации огромного количества файлов.
Кому он точно понравится:
- Тем, кто регулярно выполняет миграцию данных между S3-хранилищами.
- Тем, кто устал часами ждать завершения бэкапов.
- Тем, кому нужна гибкость фильтрации и контроль над процессом.
Если стандартный aws s3 sync заставляет вас пить слишком много кофе в ожидании, дайте шанс s3sync. Возможно, это именно тот инструмент, которого не хватало в вашем арсенале для работы с облачными хранилищами.
