Cloud Transfer · Клонирование S3
Как перенести S3-бакет между облаками
Перенести бакет из одного облака в другое технически просто: прочитать объекты в одном S3 endpoint и записать в другой. Дальше сложнее: десятки терабайт или миллионы объектов, обрыв соединения, лишние ключи на приёмнике и проверка, что данные действительно доехали.
- Разовый перенос без удаления на приёмнике —
rclone copy. - Приёмник должен точно совпасть с источником —
rclone sync. - MinIO и S3 — можно
mc mirror. - Оба бакета у одного провайдера — сначала его server-side copy.
- Регулярный или большой перенос между облаками — managed-сервис, без отдельной VM и повторных запусков вручную.
Как копируется S3
Бакеты у одного провайдера
Объекты могут не проходить через вашу машину. Yandex Cloud описывает перенос внутри организации как aws s3 cp --recursive и копирование на стороне сервера: клиент отдаёт команду, содержимое остаётся внутри Object Storage. К Selectel, VK Cloud или Cloud.ru эта инструкция объекты не выводит. Для пары бакетов одного поставщика сначала смотрите его документацию.
Бакеты у разных провайдеров
У двух независимых S3 нет общего server-side copy. Кто-то читает объект в источнике и пишет его в приёмник: VM с rclone, сервер с mc, свой воркер или managed-сервис. Здесь появляются сеть, исходящий трафик, ключи двух облаков, повтор после обрыва и проверка результата. Selectel и VK Cloud показывают rclone только как вход к себе.
rclone copy или rclone sync
Для переноса между облаками rclone удобен тем, что источник и приёмник — два remote со своими endpoint и ключами. Статья на Хабре как раз собирает такую схему и ставит машину рядом с источником.
rclone copy
Копирует новые и изменившиеся объекты. То, что есть только на приёмнике, не удаляет. Если на источнике A, B, C, а на приёмнике A, B, D, после copy на приёмнике будут A, B, C и D. Для обычной миграции это более безопасный режим.
rclone sync
Приводит приёмник к составу источника. В том же примере D исчезнет. Команда может удалить данные, поэтому перед боевым запуском смотрят --dry-run. Это важно, если приёмник уже обслуживает приложение.
aws s3 sync
aws s3 sync по умолчанию дописывает новые и изменённые объекты. Лишние ключи снимает только --delete. У s3cmd sync для этого --delete-removed. На один запуск AWS CLI приходится один --endpoint-url, поэтому прямой транспорт между двумя разными S3 этой командой неудобен. Внутри одного облака aws s3 cp --recursive часто остаётся управляющим клиентом для server-side copy.
MinIO Client
mc mirror синхронизирует S3-совместимые хранилища. По умолчанию лишние объекты на приёмнике не удаляет, для этого нужен --remove. Обычный mirror переносит текущие объекты, а не историю версий бакета.
Сравнение
| Инструмент | Между разными S3 | Удаляет лишнее | Для чего |
|---|---|---|---|
rclone copy |
Да | Нет | Разовая миграция |
rclone sync |
Да | Да | Точное зеркало |
aws s3 cp --recursive |
Ограниченно | Нет | Копия внутри одного S3 |
aws s3 sync |
Ограниченно | Только с --delete |
Один endpoint |
s3cmd sync |
Ограниченно | Только с --delete-removed |
Простые задачи одного S3 |
mc mirror |
Да | Только с --remove |
MinIO и S3-compatible |
rsync |
Нет | Не про бакет | Каталог по SSH |
Между независимыми облаками из командных утилит обычно остаётся схема «источник → rclone → приёмник».
Что обычно забывают
- Версии. «Перенесли бакет» может значить только текущие объекты, а может — историю версий и delete markers. Обычный copy и mirror сами по себе не равны переносу всей истории.
- Метаданные. Кроме байтов у объекта бывают Content-Type, Cache-Control, свои meta-заголовки, теги, класс хранения, Object Lock. Если они нужны приложению, их проверяют отдельно: не каждая связка S3 сохраняет их сама.
- Миллионы мелких объектов. Тысяча больших файлов и сто миллионов маленьких при похожем объёме ведут себя по-разному. Во втором случае упираются не в канал, а в число LIST, HEAD, GET и PUT.
- Исходящий трафик. Источник отдаёт объём наружу. На большом бакете стоимость трафика и запросов важнее стоимости машины с rclone. Если объекты лежат в холодном классе, к этому добавляется их чтение.
- Шифрование. Ключ одного облака в другое не переносится. При чтении источник расшифровывает объект, по сети он идёт по TLS, приёмник шифрует уже своим ключом.
- Проверка. Нулевой код выхода ещё не сверка. Смотрят число объектов, объём, ошибки прогона и выборочно контрольные суммы. Для короткого простоя после основной копии делают ещё один проход по изменениям и только потом переключают приложение.
Где запускать rclone
Для переноса между облаками нужна машина, через которую проходит трафик. Её ставят рядом с источником: исходящий путь короче, а при большом числе ключей смотрят память. На ней два remote, ключи обоих облаков и повторный запуск, если соединение оборвалось.
Что лучше взять
Разовый перенос без удаления лишнего закрывает rclone copy. Точное зеркало — rclone sync, сначала с --dry-run. Внутри одного поставщика сначала его инструкция: у Yandex Cloud это копия на стороне сервера.
Регулярный или большой перенос между облаками собирает отдельно машину, утилиту, ключи и повторные запуски. Эту сборку лучше отдать managed-сервису.
Cloud Transfer переносит объекты между Yandex Cloud, VK Cloud, Selectel, MWS, Cloud.ru, Timeweb Cloud, EdgeCenter, K2 Cloud и Ростелеком. Данные можно оставить в обоих или забрать из одного. Отдельную VM под rclone для этого не собирают.
Резервное копирование сюда не входит. Рядом тот же перенос для баз — логическая репликация PostgreSQL и MySQL. Копии дисков виртуальных машин обсуждаются отдельно: способ ещё не зафиксирован.
Короткие ответы
Чем rclone copy отличается от rclone sync?
rclone copy копирует новые и изменившиеся объекты и не удаляет то, что есть только на приёмнике. rclone sync приводит приёмник к составу источника и снимает лишние ключи. Перед sync имеет смысл прогон с --dry-run.
Можно ли aws s3 sync между двумя разными облаками?
Команда дописывает новые и изменённые объекты, а лишние снимает только с --delete. На один запуск у AWS CLI приходится один endpoint. Между двумя разными S3 удобнее rclone с двумя remote.
Удаляет ли mc mirror лишние объекты?
Сам по себе нет. Лишние ключи снимает --remove. Обычный mirror переносит текущие объекты, а не историю версий бакета.
Можно ли клонировать S3-бакет через rsync?
Нет. rsync копирует каталог по SSH. У бакета такой сессии нет.
Когда нужен managed-сервис?
Разовый перенос без удаления лишнего закрывает rclone copy. Регулярный или большой перенос между облаками собирает отдельно машину, ключи и повторные запуски. Эту сборку делает Cloud Transfer.
Написать на hello@cloudtransfer.ru