Как перекинуть большой объем данных между двумя серверами из разных сетей при скорости передачи 100 Кбит/с

«Как перекинуть большой объем данных между двумя серверами из разных сетей при скорости передачи 100 Кбит/с» — вопрос из категории Сети, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для передачи больших данных по узкому каналу (100 Кбит/с) между разными сетями я использую комбинацию сжатия, докачки и контроля скорости. Основной инструмент — rsync.

Основная команда:

rsync -azP --bwlimit=100 --partial --progress /source/directory/ user@remote-server:/destination/path/

Ключи и их назначение:

  • -a (archive) — сохраняет права, временные метки и рекурсивно копирует.
  • -z (compress) — сжимает данные во время передачи, что критично при низкой скорости.
  • -P — объединяет --progress (показывает ход передачи) и --partial (сохраняет частично переданные файлы для докачки).
  • --bwlimit=100 — жестко ограничивает скорость использования полосы пропускания примерно до 100 Кбит/с, чтобы не загружать канал полностью.

Почему rsync, а не scp? rsync эффективнее при повторных передачах (пересылает только разницу) и надежнее при обрывах связи.

Дополнительные стратегии для очень больших объемов:

  1. Разбиение на части: Архивирую данные с помощью tar, разбиваю на куски split и передаю поочередно.
    tar czf - /source/data | split -b 100M - data_part.tar.gz.
    # Затем передаю каждый файл data_part.tar.gz.* отдельно
  2. Проверка целостности: После передачи всегда проверяю контрольные суммы (sha256sum) на исходном и целевом серверах.
  3. Sneakernet как крайняя мера: Если данные измеряются терабайтами, а сроки жесткие, обсуждаю с командой физическую доставку дисков (HDD/SSD) — это может быть быстрее.