понедельник, 21 ноября 2022 г.

Частичное зеркалирование данных по SFTP

Появилась необходимость зеркалировать часть данных с системы, которая позволяет их скачать только по SFTP протоколу. Все файлы с данными имеют шаблон имени в который входит определенный идентификатор. На сервере таких идентификаторов - несколько тысяч, но для наших целей нам нужно зеркалировать только некоторые их них. Поскольку мы ограничены протоколом SFTP, то решения вроде Rsync не подходят.

В общем случае клиент должен подключиться к серверу и получить список директорий верхнего уровня, а затем в зависимости от максимально разрешенного уровня вложенности обойти нужные директории и свериться со списоком файлов, которые уже есть локально, скачать недостающие и удалить файлы, которых уже нет на исходном SFTP сервере (там хранятся данные только за несколько дней).

Для решения этой задачи подошла утилитка lftp, которая поддерживает много протоколов включая SFTP. Список шаблонов для синхронизации записали в файлик, который служит аргументом для --include-glob-from. Закачка самих файлов идет в несколько потоков (--parallel) с удалением тех файлов, которых больше нет на источнике (--delete).

#!/bin/bash

LFTP_PROTOCOL=sftp
LFTP_HOST=sftp.example.com
LFTP_PORT=22
LFTP_USERNAME=sftpuser
SFTP_PASSWORD=sftppass
REMOTE_DIR=/remote/path
LOCAL_DIR=/local/path
INCLUDE_LIST=$(dirname $(readlink -f $0))/sftp-mirror.include

lftp -u ${LFTP_USERNAME},${LFTP_PASSWORD} ${LFTP_PROTOCOL}://${LFTP_HOST}:${LFTP_PORT} <<_EOF_
cd ${REMOTE_DIR}
lcd ${LOCAL_DIR}
mirror --recursion=always --no-empty-dirs --delete --parallel=8 --include-glob-from=${INCLUDE_LIST}
close
_EOF_

Файл sftp-mirror.include с шаблонами имен по одному на строку, которые нужно зеркалировать

*Element=ABA090*.xml.gz
*Element=BAC105*.xml.gz
*Element=DOM288*.xml.gz

Расчет разницы и выкачивание новых файлов происходит очень быстро.

Комментариев нет:

Отправить комментарий