Начать перенос

Cloud Transfer · Клонирование S3

Как перенести S3-бакет между облаками

Перенести бакет из одного облака в другое технически просто: прочитать объекты в одном S3 endpoint и записать в другой. Дальше сложнее: десятки терабайт или миллионы объектов, обрыв соединения, лишние ключи на приёмнике и проверка, что данные действительно доехали.

Как копируется 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 → приёмник».

Что обычно забывают

  1. Версии. «Перенесли бакет» может значить только текущие объекты, а может — историю версий и delete markers. Обычный copy и mirror сами по себе не равны переносу всей истории.
  2. Метаданные. Кроме байтов у объекта бывают Content-Type, Cache-Control, свои meta-заголовки, теги, класс хранения, Object Lock. Если они нужны приложению, их проверяют отдельно: не каждая связка S3 сохраняет их сама.
  3. Миллионы мелких объектов. Тысяча больших файлов и сто миллионов маленьких при похожем объёме ведут себя по-разному. Во втором случае упираются не в канал, а в число LIST, HEAD, GET и PUT.
  4. Исходящий трафик. Источник отдаёт объём наружу. На большом бакете стоимость трафика и запросов важнее стоимости машины с rclone. Если объекты лежат в холодном классе, к этому добавляется их чтение.
  5. Шифрование. Ключ одного облака в другое не переносится. При чтении источник расшифровывает объект, по сети он идёт по TLS, приёмник шифрует уже своим ключом.
  6. Проверка. Нулевой код выхода ещё не сверка. Смотрят число объектов, объём, ошибки прогона и выборочно контрольные суммы. Для короткого простоя после основной копии делают ещё один проход по изменениям и только потом переключают приложение.

Где запускать 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