Я запускаю некоторую команду в cron, которая выполняет rsync по двум центрам обработки данных. Скорость соединения между дата-центрами составляет около 1 Мбит / с. Я заметил, что rsync продолжает давать сбой от 2,7 до 2,9 ГБ переданных данных, что может составлять около часа или более при указанном соединении. Раньше я знал, что наш брандмауэр настроен на закрытие бездействующих соединений, которые открывались более часа.
Но действительно ли передача rsync будет бездействующей? Что я могу сделать, чтобы это исправить?
Ошибка:
rsync: соединение неожиданно закрыто (на данный момент получено 2987596424 байта) [получатель]
Ошибка rsync: ошибка в потоке данных протокола rsync (код 12) в io.c (605) [Receiver = 3.0.9]
rsync: соединение неожиданно закрыто (на данный момент получено 523 байта) [генератор]
Ошибка rsync: ошибка в потоке данных протокола rsync (код 12) в io.c (605) [generator = 3.0.9]
У меня уже есть это в моем ~ / .ssh / config (но, может быть, эти значения нужно увеличить?):
Host *
ServerAliveInterval 60
ServerAliveCountMax 15
Да, rsync
мог остаться тихо во время чтения с диска и пока у них нет пакетов для отправки ...
Ты сказал. наш брандмауэр настроен на закрытие неактивных соединений, открытых более часа но ничего о продолжительность непрерывного простоя.
rsync
процесс на обоих концах, чтение целых файлов для поиска разницы между пакетами на основе ранее вычисленных контрольных сумм.
Хотя нет никакой разницы между файлами на обоих концах, они могут не обмениваться между обоими сторонами, пока не будут обнаружены различия.
Есть небольшой рисунок, представляющий один запуск rsync между моим рабочим столом и его резервной копией:
В котором мы можем увидеть, что прошло несколько секунд без данные:
TIME BLOCKS BYTES
IN OUT IN OUT
...
Jul 28 15:00:07 2013 449 41 23443 1526403
Jul 28 15:00:08 2013 0 0 0 0
Jul 28 15:00:09 2013 0 0 0 0
Jul 28 15:00:10 2013 143 182 21348 1123986
Jul 28 15:00:11 2013 112 142 6966 523326
Jul 28 15:00:12 2013 31 30 1942 1890
Jul 28 15:00:13 2013 30 28 1853 88038
Jul 28 15:00:14 2013 0 0 0 0
Jul 28 15:00:15 2013 57 66 3954 38301
...
В качестве обходного пути вы можете использовать совместное использование ssh на основе сокетов:
Сначала запустите простой ssh для подвешивания сокета и подключения
ssh -M -o ControlPath=$HOME/.ssh/socket_test destHost ping -n localhost
Чем в другом окне:
rsync -e 'ssh -e none -S $HOME/.ssh/socket_test' /src/file destHost:/dst/file
Таким образом, для обоих будет использоваться только одно соединение. ssh-сессии. В ping
обеспечит (много) непрерывного трафика, чем rsync
может работать тихо, используя то же сетевое соединение.