Существует ли хорошее решение для перемещения файлов с хоста 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
Комментарий Свена к вашему вопросу — это, безусловно, правильный способ сделать это.
Это можно сделать так:
Из
A
SSH вB
, создание туннеля на порту 5000ssh someuser@B -L 5000:127.0.0.1:5000
Из этой оболочки
B
SSHC
создаст второй туннель, заканчивающийся наC
SSH-сервере.ssh someuser@C -NL 5000:127.0.0.1:22
Со второго терминала на
A
, синхронизируйте файлы напрямую сC
rsync -avz -e "ssh -p 5000" --progress --remove-source-files /source/directory [email protected]:/destination/directory
Возможно, даже можно настроить туннели на шаге 1 и 2 одной командой, но в моем быстром тесте я не смог этого сделать. Возможно, потребуется настроить ключи ssh на B
и C
.
Если вы собираетесь автоматизировать процесс копирования, то вам, возможно, стоит рассмотреть что-то вродеавтосшдля настройки и демонтажа туннелей для вас через сервисы. Или вы можете сделать это через cron..