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

rsync - необъяснимая ошибка

Я использую такой сценарий:

rsync -avu --delete --progress user@host:~/backup .

и каждый раз, через некоторое время, появляется эта ошибка:

rsync: connection unexpectedly closed (10251754 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [receiver=3.1.0]
rsync: connection unexpectedly closed (45482 bytes received so far)  [generator]
rsync error: unexplained error (code 255) at io.c(226) [generator=3.1.0]

# generator = Debian 5, rsync  version 3.0.3  protocol version 30 (Generator[A])
# receiver = Ubuntu 14.04, rsync  version 3.1.0  protocol version 31 (Receiver[A])

У меня более десяти лет опыта в rsync, Все перепробовал, но не могу понять, почему так происходит.

С обеих сторон: У меня нет ошибок в логах, никаких странностей в tcpdump, никаких проблем с подключением, никаких межсетевых экранов. Через некоторое время передача просто внезапно прекращается.

Эта проблема не ограничивается одним сервером.

Я подумал, что это может быть королем несовместимости между версиями rsync, поэтому я переключаю генератор на новый новый сервер (Debian 8) на совершенно другую ферму серверов, и у меня есть обновление rsync на приемнике, но я получаю эту ошибку:

rsync: connection unexpectedly closed (31931964 bytes received so far) [receiver]
rsync: [generator] write error: Broken pipe (32)
rsync error: unexplained error (code 255) at io.c(820) [generator=3.1.2]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [receiver=3.1.2]

# generator = Debian 8, rsync  version 3.1.1  protocol version 31 (Generator[B])
# receiver = Ubuntu 14.04, rsync  version 3.1.2  protocol version 31 (Receiver[B])

Затем я попытался синхронизировать Receiver [A] с Generator [B] через прокси-сервер, и он работает

Receiver[A](Italy) <=> HTTP Proxy(Paris) <=>  Generator[B](Strasbourg)

Итак, теперь у меня есть

Receiver[A] <=> Generator[A] // ERROR
Receiver[A] <=> Generator[B] // ERROR   
Receiver[B] <=> Generator[B] // ERROR

Receiver[A] <=> HTTP Proxy <=> Generator[A] // OK
Receiver[A] <=> HTTP Proxy <=> Generator[B] // OK  

Я тоже пробовал без HTTP-прокси

Receiver[A] <=> Generator[C] // OK
Receiver[A] <=> Generator[D] // OK  
Receiver[A] <=> Generator[E] // ERROR

где генераторы [C], [D] и [E] серверы в Париже (та же серверная ферма моего HTTP Proxy) с участием rsync 3.0.9, prot. v. 30.

Так нижняя строка здесь: У меня несколько серверов в разных местах. На Receiver[A] У меня нет брандмауэра, и все работает хорошо несколько дней назад. Сейчас rsync возвращение unexplained error и я не могу понять почему.

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

Спасибо за вашу помощь!

Похоже, вам сложно определить проблему, но нет проблем с ее воспроизведением. В этом случае может помочь устранение неполадок самого SSH-соединения, а также данных, которые вы получаете через него.

Вы можете запустить свой rsync команду, как показано ниже, она выдаст некоторые данные du:

rsync -e 'bash -x -c "ssh -vvvv $0 $@ 2>/tmp/rsync-ssh.stderr | tee /tmp/rsync.stdout"' -avu --delete --progress user@host:~/backup .

Глядя в конец этих файлов, можно найти что-нибудь полезное. Например, если соединение SSH было прервано, что-то должно появиться в /tmp/rsync-ssh.stderr. И если это действительно проблема с другой стороны, фактический дамп протокола rsync в /tmp/rsync.stdout может иметь некоторый строковый намек (strings /tmp/rsync.stdout).

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

Возможно, что rsync может записывать в кеш диска быстрее, чем диск на сервере может за ним успевать, см. например https://unix.stackexchange.com/a/331189/163108 для более подробного объяснения, и https://unix.stackexchange.com/a/523896/163108 для аналогичной проблемы, но в другом случае при использовании rsync через samba/cifs навесной привод.

Возможное решение - дросселировать rsync используя --bwlimit= вариант. В зависимости от производительности сети / диска сервера, я бы рекомендовал попробовать значения в диапазоне 2000-10000 (в кбит / с).