Непрерывное развертывание с использованием LFTP временно зависает примерно после 10 файлов.

Я использую GitLab Community Edition и настройку GitLab runner CI для развертывания (синхронизации) набора файлов JSON на сервере с использованием LFTP. Однако эта работа, кажется, «зависает» на несколько минут примерно каждые 10 файлов. Иногда приходится синхронизировать примерно 400 файлов, поэтому это задание просто падает, потому что иногда его выполнение занимает больше часа. Все файлы JSON имеют размер 1 КБ. Ни на исходном, ни на целевом серверах не должно быть брандмауэров, ограничивающих скорость FTP. Оба размещены на OVH.

Следующая команда LFTP выполняется для синхронизации всего:

lftp -v -c "set sftp:auto-confirm true; open sftp://$DEVELOPMENT_DEPLOY_USER:$DEVELOPMENT_DEPLOY_PASSWORD@$DEVELOPMENT_DEPLOY_HOST:$DEVELOPMENT_DEPLOY_PORT; mirror -Rev ./configuration_files configuration/configuration_files --exclude .* --exclude .*/ --include ./*.json"

Задание выполняется в Docker с использованием этого контейнера для развертывания всего. Что может быть причиной этого?


person Dennis van der Veeke    schedule 15.04.2018    source источник
comment
Вы когда-нибудь находили решение этой проблемы? У нас точно такая же проблема   -  person Phillip    schedule 14.06.2019
comment
К сожалению, я так и не понял, в чем причина проблемы. Я считаю, что в качестве обходного пути я установил тайм-аут примерно на 1 секунду, который выполняет свою работу. @Филипп   -  person Dennis van der Veeke    schedule 14.06.2019
comment
Да, в итоге я обошел это, снизив тайм-аут до чего-то очень низкого, а также настроив файл CI для повторной попытки задания в случае сбоя. Это привело к завершению проекта. Я вставлю свое решение ниже.   -  person Phillip    schedule 14.06.2019


Ответы (2)


Для тех из вас, кто пришел из Google, у нас была точно такая же настройка. Чтобы заставить LFTP перестать зависать при работе в докере или каком-либо другом CI, вы можете использовать эту команду:

lftp -c "set net:timeout 5; set net:max-retries 2; set net:reconnect-interval-base 5; set ftp:ssl-force yes; set ftp:ssl-protect-data true; open -u $USERNAME,$PASSWORD $HOST; mirror dist / -Renv --parallel=10"

Это делает несколько вещей:

  1. Это делает так, что он не будет ждать вечно или попадет в непрерывный цикл, когда он не может выполнить команду. Это должно ускорить процесс.

  2. Убедитесь, что мы используем SSL/TLS. Если вам это не нужно, удалите эти параметры.

  3. Синхронизирует одну папку с новым местоположением. Варианты -Renv можно объяснить здесь: https://lftp.yar.ru/lftp-man.html

Наконец, в gitlab CI я настроил задание на повторную попытку в случае сбоя. Это запустит новый экземпляр докера, который обойдёт ограничения на любой открытый файл или соединение. Приведенная выше команда LFTP будет запущена снова, но, поскольку мы используем флаг -n, она будет перемещаться только по тем файлам, которые были пропущены при первом задании, если это не удастся. Благодаря этому все перемещается без проблем. Подробнее о повторных попытках задания CI можно прочитать здесь: https://docs.gitlab.com/ee/ci/yaml/#retry

person Phillip    schedule 14.06.2019
comment
Большое спасибо за этот ответ. set net:timeout 5; set net:max-retries 2; set net:reconnect-interval-base 5 решена проблема, из-за которой команда зеркала lftp зависала после загрузки большого объема данных на сервер sftp (загрузка каталога с большим количеством больших файлов прошла успешно, но что-либо нижестоящее не было синхронизировано). lftp не исчезнет из списка процессов, пока не будет убит вручную, вероятно, потому, что sftp закрыл соединение во время передачи (согласно этому обсуждению: talk.plesk.com/threads/). - person RaphiS; 22.05.2021

Вы смотрели на использование rsync вместо этого? Я совершенно уверен, что вы можете извлечь выгоду из инкрементного копирования файлов, а не каждый раз копировать весь набор.

person Timir    schedule 04.05.2018