Назад | Перейти на главную страницу

Невозможно выполнить rsync из-за сломанной трубы

Я пытаюсь отразить большую базу данных Mongo между производственным сервером и средой разработки, остановив Mongo на обоих серверах, а затем выполнив команду:

rsync --archive --delete --recursive --verbose --compress --rsh "ssh -t -o StrictHostKeyChecking=no -i key.pem" remoteuser@remotehost:/var/lib/mongodb/ /var/lib/mongodb

Он работает нормально в течение нескольких минут, но затем остановился с ошибкой:

receiving incremental file list
./
collection-228--5129329295041693519.wt
inflate returned -3 (0 bytes)
rsync error: error in rsync protocol data stream (code 12) at token.c(557) [receiver=3.1.1]
rsync: [generator] write error: Broken pipe (32)
rsync error: error in socket IO (code 10) at io.c(820) [generator=3.1.1]

Поиск в Google ошибки предполагает, что это какая-то проблема с сетевым подключением, но я могу нормально подключиться к обоим серверам.

Если я повторно запустил команду, она выйдет из строя в том же файле с тем же сообщением об ошибке. Что вызывает эту ошибку и как ее исправить?

Оказывается, rsync обращается к rsync на удаленном сервере, а версии на моих серверах не совпадают. Я запускал 3.1.1 на целевом сервере, но 3.1.0 на исходном сервере, и, очевидно, этого было достаточно, чтобы прервать загрузку определенных файлов. Я установил 3.1.1 на исходный сервер, и после этого передача прошла безупречно.

Решение:

Так как объяснил Керин здесь, просто обновите свои версии rsync, чтобы убедиться, что они точно так же как на отправляющем, так и на принимающем ПК!

У меня была такая же проблема: ошибка записи сломанного канала при передаче очень большого файла через ssh rsync с помощью rsync --compress (-z) установлен флаг.

Моя ошибка rsync была:

rsync: [sender] write error: Broken pipe (32)
rsync error: error in rsync protocol data stream (code 12) at io.c(837) [sender=3.1.0]

rsync --version с моего ОТПРАВЛЯЮЩЕГО ПК показал rsync version 3.1.0 protocol version 31, тогда как на моем ПРИНИМАЮЩЕМ ПК он показывал rsync version 3.1.2 protocol version 31. Поэтому я решил просто обновить свой ОТПРАВЛЯЮЩИЙ ПК до версии 3.1.2. Как только я это сделал, это сработало!

Как обновить свой rsync версия:

Просто следуйте этим инструкциям здесь, чтобы установить rsync из источника: http://www.beginninglinux.com/home/backup/compile-rsync-from-source-on-ubuntu.

Коротко:

  1. Проверьте свою версию rsync, чтобы знать, что у вас сейчас есть:

    rsync --version
    
  2. Загрузите желаемый исходный файл для нужной вам версии здесь: https://download.samba.org/pub/rsync/src/.

  3. В файловом менеджере графического интерфейса щелкните правой кнопкой мыши и извлеките его.
  4. Скомпилируйте из исходников и установите:

    ./configure
    make
    sudo checkinstall
    
  5. Проверьте свою версию rsync, чтобы убедиться, что она обновлена:

    rsync --version
    
  6. Готово!

  7. (Я не тестировал это, но, очевидно): Чтобы удалить его из вашей системы, используйте:

    dpkg -r rsync
    

Как только я выполнил обновление, чтобы получить одинаковые версии rsync для обеих систем, все заработало отлично!

Связанный:

  1. https://bugs.launchpad.net/ubuntu/+source/rsync/+bug/1300367
  2. https://unix.stackexchange.com/questions/242898/rsync-keeps-disconnecting-broken-pipe/547861#547861
  3. Поиск в Google по запросу "ошибка записи rsync, сломанный канал" - https://www.google.com/search?q=rsync+write+error+broken+pipe&oq=rsync+write+error+&aqs=chrome.0.0j69i57j0l4.2263j0j7&sourceid=chrome&ie=UTF-8&sec_act=d

Вы пытаетесь синхронизировать данные между локальным и удаленным серверами, удаленный сервер выглядит как aws ec2, вы можете использовать команду ниже для синхронизации данных

rsync -ravhz "ssh -i /path/to/EC2_KEY.pem" / path / to / local / files / * EC2_USER @ EC2_INSTANCE: / path / to / remote / files

Пожалуйста, проверьте с серверов и на серверы перед синхронизацией, поскольку вы можете синхронизировать в неправильном направлении

Если вы пытаетесь выполнить синхронизацию с ec2 на локальный сервер, проверьте, открыли ли вы правильные порты между серверами.

Попробуйте сначала подключиться по telnet и проверить соединение между серверами, вам нужно внести IP-адреса и порты в белый список, так как некоторые брандмауэры могут блокировать передачу данных