Перемещение файлов между хостами с использованием промежуточной области хранения

Перемещение файлов между хостами с использованием промежуточной области хранения

Существует ли хорошее решение для перемещения файлов с хоста A на хост C, используя хост B в качестве пассивной промежуточной области хранения?

А -> Б -> В

Ограничения

  • Хост A и хост C находятся в отдельных сетях и не могут получить доступ друг к другу. Между A и C не могут быть открыты туннели.
  • Как хост A, так и хост C могут запускать и планировать периодические процессы.
  • Хост B предоставляет только область хранения данных и к нему можно получить доступ как с хоста A, так и с хоста C через SSH.
  • B будет «пассивным» и будет обеспечивать только складское помещение.
  • Таким образом, A будет действовать как писатель (файлов на B), а C будет действовать как читатель (файлов на B).
  • Файлы, успешно скопированные с хоста A на хост C (через B), затем могут быть удалены на хосте A.
  • Ни один файл на хосте A не должен удаляться до тех пор, пока не будет получена гарантия (квитанция с контрольной суммой файла?), что он успешно загружен на хост C.
  • К критическим ситуациям относится управление простоями сети, заполнением диска, прерванными процессами и т. д.

Цель состоит в том, чтобы через регулярные промежутки времени перемещать файлы из A в C, используя B в качестве промежуточной области хранения.

Можно предположить, что все хосты работают под управлением Unix/Linux. Предпочтительные инструменты: ssh/rsync/bash + другие "стандартные" инструменты.

Я думал о создании решения, использующего несколько bash-скриптов вокруг rsync в два этапа и использующего квитанции, содержащие контрольные суммы, для определения того, когда файл успешно перемещен полностью.

Существуют ли какие-либо существующие решения?

решение1

Я не вижу необходимости хранить что-либо на B, вы можете просто использовать его для проксирования соединений между A и C с помощью любого прокси-софта, например, переадресации портов ssh или socks. Может быть, вы даже могли бы route/nat через B?

Или, поскольку вы конкретно спросили, чтобы сделать это по-своему, вы могли бы использовать NFS/Samba для копирования файлов и проверки завершения с помощью различных методов. Первое, что приходит на ум, — это создать файл на общем ресурсе для передачи сообщений типа «копирование завершено» или «удалить» между обеими системами. Или, как вы сказали, что-то с MD5 и т. д... Как бы вы это ни сделали, я почти уверен, что это будет пользовательская работа. Но не сложная. Сомневаюсь, что существуют какие-либо существующие способы решения вашей проблемы таким образом.

решение2

Комментарий Свена к вашему вопросу — это, безусловно, правильный способ сделать это.

Это можно сделать так:

  1. Из ASSH в B, создание туннеля на порту 5000

    ssh someuser@B -L 5000:127.0.0.1:5000
    
  2. Из этой оболочки BSSH Cсоздаст второй туннель, заканчивающийся на CSSH-сервере.

    ssh someuser@C -NL 5000:127.0.0.1:22
    
  3. Со второго терминала на A, синхронизируйте файлы напрямую сC

    rsync -avz -e "ssh -p 5000" --progress --remove-source-files /source/directory [email protected]:/destination/directory
    

Возможно, даже можно настроить туннели на шаге 1 и 2 одной командой, но в моем быстром тесте я не смог этого сделать. Возможно, потребуется настроить ключи ssh на Bи C.

Если вы собираетесь автоматизировать процесс копирования, то вам, возможно, стоит рассмотреть что-то вродеавтосшдля настройки и демонтажа туннелей для вас через сервисы. Или вы можете сделать это через cron..

Связанный контент