rsync через VPN: нова спроба, яка повторно використовує перервану передачу
Обірваний тунель завершує з'єднання, а не дані. Збережіть фрагмент із --partial-dir, запустіть ту саму копію знову й перевірте файл перед публікацією.
Ваше завантаження зупиняється на чотирьох гігабайтах архіву на дванадцять гігабайт, і звичка, вивчена в менеджерах завантажень, каже натиснути продовжити. rsync не відновить потік TCP, бо цей потік зник із останнім повторним передаванням тунелю. Що він може — зберегти вже отримані байти й використати їх як основу для наступної спроби, а це інший механізм з іншим набором правил. Вибрані прапорці вирішують, чи відбудеться це повторне використання взагалі.
Нова спроба відновлює стан, а не продовжує потік
Коли сеанс SSH обривається, на далекому кінці лишається тільки те, що встигло записатися на диск, і більше нічого. Немає ні токена сеансу, до якого можна знову приєднатися, ні порядкового номера, який можна відтворити. Наступний запуск відкриває нове з'єднання, знову читає джерело й питає отримувача, що в нього вже є.
Саме це останнє питання пояснює, чому варто зберігати частковий файл. Копія в отримувача дає rsync матеріал для порівняння, і алгоритм передає лише ті відмінності, які може визначити. Це все одно нова передача метаданих і новий прохід джерелом, тому зекономлений час пропорційний тому, яка частина файлу збігається, а не тому, наскільки просунулося попереднє з'єднання. Якщо отримувач нічого не зберіг, наступна спроба — повна копія, скільки б гігабайтів не перемістила перша.
Вирішіть, де живе багаторазовий фрагмент
Типова поведінка записує частковий файл за цільовим шляхом, через що наполовину записаний архів стає видимим під остаточним ім'ям. --partial-dir переміщує його до вибраного вами каталогу, і посібник описує цей каталог як збережений для використання як дані пізнішою передачею. Відносне ім'я розв'язується всередині каталогу призначення, і це саме те, що потрібно, коли два кінці можуть мати різне компонування.
rsync -e ssh --partial-dir=.rsync-partial --info=progress2 -- \
large-archive.bin [email protected]:/srv/incoming/
Порядок важливий і на боці призначення: частковому каталогу потрібно достатньо місця для фрагмента, а тому — достатньо і для завершеного файлу. Заповнення цільового тому посеред передачі дає збій, який виглядає як проблема мережі, але нею не є, і може залишити збережений фрагмент обрізаним. Перевірте вільне місце на приймальному хості до початку запуску, а не після його провалу. Кілька секунд із df -h тим самим шляхом SSH — найдешевша можлива перевірка плану.
Права доступу — менша, але справжня турбота. Частковий каталог, доступний для запису стороннім обліковим записам, дозволяє комусь іншому підмінити вміст, який ваш наступний запуск вважатиме вже отриманим. Тримайте його у власності облікового запису передачі й не розміщуйте там, звідки публікують інші служби.
Запустіть ту саму копію, а не розумнішу
Повторне використання діє, лише коли джерело й призначення досі описують той самий об'єкт. Той самий шлях, те саме ім'я, той самий файл. Перейменування джерела або вказування на інший каталог призначення починає нове порівняння ні з чим корисним.
Не додавайте --whole-file, сподіваючись на дельта-поведінку. Цей параметр велить rsync копіювати весь файл без порівняння ковзної контрольної суми, що розумно на швидкому локальному каналі й точно неправильно після невдалого далекого завантаження. --inplace теж змінює картину: він пише безпосередньо у файл призначення, тому переривання залишає файл, що змішує старий і новий вміст, без окремого фрагмента, на який можна відкотитися.
Рядок поступу повідомляє сукупний поступ передачі. Це не сигнал завершення. Число, що сягає ста відсотків, поки з'єднання ще відкрите, означає, що дані відправлено, а не що отримувач щось перейменував, синхронізував чи прийняв.
Приймайте об'єкт лише після того, як він збігся
Спочатку підтвердьте код виходу, потім порівняйте результат, а не покладайтеся на відсутність помилок. Перевірка розміру ловить більшість обрізаних передач; порівняння контрольних сум ловить решту, і обидва варіанти дешеві порівняно з повторним запуском завантаження.
Якщо архів публікує нижчий процес, змусьте цей процес чекати на прийнятий файл. Збережений фрагмент, що потрапляє в каталог під наглядом під остаточним ім'ям, підхоплюється наступним скануванням, і помилка споживача буде про пошкоджені вхідні дані, а не про передачу, яка так і не завершилася.
Не чіпайте джерело, доки отримувач не підтвердить. Перегенерація архіву між спробами змінює базу порівняння, і наступний запуск або передає майже все, або створює файл, що не збігається ні зі старим, ні з новим джерелом.
Коли межа — це канал, а не прапорець
Накладні витрати заголовка й протоколу — одна зі статей вартості передачі, і рідко саме вона вирішує, скільки часу займає великий файл. Поведінка під час перезапуску важливіша: спосіб, що переживає обрив без ручних кроків, віддає придатний файл раніше, ніж швидший спосіб, якому треба починати заново. Сховище на обох кінцях і шлях автентифікації входять до того самого порівняння.
Порівняйте дозволені альтернативні шляхи з тим самим файлом і тим самим призначенням і позначте, звідки кожен відновлюється після переривання. Цей єдиний стовпець скаже про завантаження на дванадцять гігабайтів через VPN більше, ніж будь-яка пікова швидкість, виміряна в короткому тесті.