rsync для декількох напрямків, використовуючи один список файлів?


22

Мені цікаво, чи можливо для rsync скопіювати один каталог у кілька віддалених напрямків все за один раз чи навіть паралельно. (не потрібно, але було б корисно.)

Зазвичай щось подібне спрацювало б добре:

$ rsync -Pav /junk user@host1:/backup
$ rsync -Pav /junk user@host2:/backup
$ rsync -Pav /junk user@host3:/backup

І якщо це єдиний варіант, я використаю це. Однак / junk розміщений на повільному диску з досить великою кількістю файлів, і перебудова списку файлів приблизно ~ 12 000 файлів кожного разу агоністично повільна (~ 5 хвилин) порівняно з фактичною передачею / оновленням. Чи можна зробити щось подібне, щоб виконати те саме:

$ rsync -Pav /junk user@host1:/backup user@host2:/backup user@host3:/backup 

Дякуємо, що подивилися!

Відповіді:


12

Ось інформація зі сторінки man для rsync про пакетний режим.

РЕЖИМ ПАРТІЇ

Пакетний режим можна використовувати для застосування одного і того ж набору оновлень до багатьох однакових систем. Припустимо, дерево має репліку на декількох хостах. Тепер припустимо, що в цьому вихідному дереві були внесені деякі зміни, і ці зміни потрібно поширити на інші хости. Для цього в пакетному режимі rsync запускається з параметром пакетного запису, щоб застосувати зміни, внесені до вихідного дерева, до одного з дерев призначення. Параметр пакетного запису змушує клієнта rsync зберігати у "пакетному файлі" всю інформацію, необхідну для повторення цієї операції щодо інших, ідентичних дерев призначення.

Генерування пакетного файлу один раз економить необхідність виконання статусу файлу, контрольної суми та генерування блоку даних не один раз під час оновлення кількох дерев призначення. Транспортні протоколи багатоадресної передачі можуть використовуватися для передачі пакетних файлів оновлення паралельно багатьом хостам одночасно, замість того, щоб надсилати однакові дані кожному хосту окремо.

Щоб застосувати записані зміни до іншого дерева призначення, запустіть rsync за допомогою параметра read-batch, вказавши ім'я того ж пакетного файлу та дерево призначення. Rsync оновлює дерево призначення за допомогою інформації, що зберігається у пакетному файлі.

Для вашої зручності файл сценарію також створюється, коли використовується параметр запису-пакет: він буде названий таким же, як і пакетний файл із доданим ".sh". Цей файл сценарію містить командний рядок, придатний для оновлення дерева призначення за допомогою пов'язаного з ним пакетного файлу. Вона може бути виконана за допомогою оболонки Bourne (або Bourne-подібної), необов'язково передаючи ім'я альтернативного дерева дерева призначення, яке потім використовується замість вихідного шляху призначення. Це корисно, коли шлях до дерева призначення на поточному хості відрізняється від того, який використовується для створення пакетного файлу.

   Examples:

          $ rsync --write-batch=foo -a host:/source/dir/ /adest/dir/
          $ scp foo* remote:
          $ ssh remote ./foo.sh /bdest/dir/

          $ rsync --write-batch=foo -a /source/dir/ /adest/dir/
          $ ssh remote rsync --read-batch=- -a /bdest/dir/ <foo

У цих прикладах rsync використовується для оновлення / adest / dir / from / source / dir /, а інформація для повторення цієї операції зберігається у "foo" та "foo.sh". Потім "віддалений" хост оновлюється пакетними даними, що надходять у каталог / bdest / dir. Відмінність між двома прикладами показує деяку гнучкість у вашій роботі з партіями:

  • Перший приклад показує, що початкова копія не повинна бути локальною - ви можете натискати або витягувати дані до / з віддаленого хоста, використовуючи синтаксис віддаленої оболонки або синтаксис демона rsync, як бажано.

  • Перший приклад використовує створений файл "foo.sh", щоб отримати правильні параметри rsync під час виконання команди "batch batch" на віддаленому хості.

  • Другий приклад зчитує пакетні дані за допомогою стандартного введення, щоб пакетний файл не потрібно було скопіювати спочатку на віддалену машину. Цей приклад дозволяє уникнути сценарію foo.sh, оскільки йому потрібно було використовувати модифікований параметр --read-batch, але ви можете редагувати файл сценарію, якщо хочете використовувати його (просто будьте впевнені, що жоден інший варіант не намагається використовувати стандартний вхід, наприклад, опція "--exclude-from = -").

    Застереження:

    Параметр читання-пакет очікує, що дерево призначення, яке воно оновлює, буде ідентичним дереву призначення, яке було використано для створення набору файлів пакетного оновлення. При виявленні різниці між деревами призначення, оновлення може бути відмінено попередженням (якщо файл здається, що він уже оновлений), або може бути спроба оновлення файлу, а потім, якщо файл не вдасться перевірити , оновлення відхилено з помилкою. Це означає, що слід повторно запустити операцію зчитування пакетів, якщо команда була перервана. Якщо ви хочете змусити пакетне оновлення завжди намагатися здійснювати незалежно від розміру та дати файлу, використовуйте параметр -I (під час читання партії). Якщо виникла помилка, дерево призначення буде, ймовірно, частково оновленим. В такому разі,

    Версія rsync, що використовується у всіх напрямках, повинна бути принаймні такою ж новою, як та, яка використовується для створення пакетного файлу. Rsync загине з помилкою, якщо версія протоколу у пакетному файлі надто нова, щоб rsync зчитування пакетного зчитування оброблявся. Дивіться також опцію --protocol, щоб створити rsync генерувати пакетний файл, який може зрозуміти старший rsync. (Зауважте, що пакетні файли змінили формат у версії 2.6.3, тому змішування версій, старших за версію з новішими версіями, не працюватиме.)

    Читаючи пакетний файл, rsync змусить значення певних параметрів відповідати даним у пакетному файлі, якщо ви не встановили їх таким же, як команда batch write. Інші параметри можна (і повинні) змінити. Наприклад, --write-batch змінюється на --read-batch, --files-from випадає, і --filter / - include / - параметри виключення не потрібні, якщо не вказано один із параметрів --delete .

    Код, який створює файл BATCH.sh, перетворює будь-який фільтр / включає / виключає параметри в єдиний список, який додається як "тут" документ до файлу сценарію оболонки. Досвідчений користувач може використовувати це для зміни списку виключень, якщо бажано змінити те, що видаляється --delete. Звичайний користувач може ігнорувати цю деталь і просто використовувати сценарій оболонки як простий спосіб запустити відповідну команду - read-batch для пакетних даних.

    Початковий пакетний режим у rsync був заснований на "rsync +", але в останній версії використовується нова реалізація.

Я думаю, ти можеш спробувати

rsync --write-batch=foo -Pav /junk user@host1:/backup
foo.sh user@host2:/backup
foo.sh user@host3:/backup

Пропонована команда не працює:remote destination is not allowed with --read-batch
kynan

Показати повну команду. -для імені файлу означає читати зі стандартного вводу, а STDIN також зчитується з fooприкладу, локального файлу.
Хлоя

2
Це, мабуть, є максимально правильним рішенням того, що я намагався зробити, хоча мій випадок використання для цього вже давно випарувався в ефір. : D
Джессі

4

Ви можете спробувати використати унісон . Створювати список файлів слід набагато швидше, оскільки він зберігає кеш файлів.


2
Примітка: Unison не зберігає "кеш" файлів. Він зберігає лише базу даних імен файлів, часових позначок, контрольних сум. Він все ще робить сканування файлової системи та створює контрольну суму для порівняння з віддаленою. Єдиною перевагою Unison є двостороння синхронізація. Я рекомендую Unison, але це тут не допоможе.
Хлоя

4

Підтримка rsync --batch-modeбагатоадресної передачі Якщо це можливо у вашій мережі, можливо, варто розглянути це.


2

як щодо зміни файлових систем?

Деякий час тому я перейшов багато терабайтний FS з ext3 на XFS. Час на сканування каталогів (із останнім разом я перевірив близько 600 000 файлів) зайняв від 15-17 хвилин до менш ніж 30 секунд!


1

Це не пряма відповідь, але якщо ви використовуєте rsync версії 3+, вона почне передачу, перш ніж вона генерує весь список файлів.

Ще одним варіантом, який все ще не дуже ефективний, було б запускати їх як робочі місця, тому кілька запускаються одночасно.

Крім того, я просто подумав про цю неприємність, якщо ви не заперечуєте проти використання дьогтю:

tar cf - . | tee >(ssh localhost 'cat > test1.tar') >(ssh localhost 'cat > test2.tar') >/dev/null

Там, де кожен localhost був би різним сервером (звичайно, передбачає вхід на основі ключів). Ніколи не використовував вище, ніж раніше.


Хм! Як не дивно, cwrsync (rsync 3.0.7), схоже, цього не робить. Мені доведеться розібратися, чому це, однак, це було б великою допомогою для скорочення цих величезних умов виконання. Спасибі!
Джессі

Ця версія з обох сторін?
Кайл Брандт

Ні, насправді; локальна машина cwrsync 3.0.7, а віддалений хост (ну, з тим, з ким я зараз працюю) - rsync 3.0.3 на Debian Lenny. Не здається, що це було б занадто великою різницею версій, щоб вона погано поводилася, але я не знаю .. Я розглядаю питання модернізації Debian.
Джессі

1
Який дивний маленький однолінійний. Це, мабуть, спрацювало б, якби я не використовував той факт, що rsync не потребує зменшення кількох гігів даних по декількох повільних посиланнях, коли, максимум, лише кілька сотень кілобатів змінилося. Крім того, отримання обох кінців до (cw) rsync 3.0.7 все ж робило створення списку файлів та передачу послідовно. Не надто стурбований цим, хоча.
Джессі

Не "tar cf -." те саме, що "tar c". ?
Йохан Буле

1

Як щодо виконання завдань rsync з host1, host2 та host3? Або запустіть завдання, щоб скопіювати його на host1, а потім запустіть його на host2 та host3, щоб отримати його з host1.


1

Кращим рішенням буде створення сховища з git та просто натискання на 3 хости. Швидше, вам не знадобиться частина списку файлів, і вона витрачає менше ресурсів.

Удачі,
Жоао Мігель Невес


10
git не зберігає часу модифікації та дозволів (за винятком виконавчого біта) і вимагає збереження другої копії даних у вигляді об’єктів git, .git/хоча натискання на віддалені файли, які б уже мали більшість даних, були б швидшими. git не є заміною для rsync.
Дан Д.

Крім того, git може публічно переглядатись, якщо ви не платите.
Хлоя

8
@Chloe, ти помиляєшся git для GitHub. Сам Git є вільним відкритим вихідним кодом розподілена система контролю версій, і будь-хто може розмістити GIT репозиторій будь-якими засобами, в тому числі http, nfsі afp. GitHub - веб-сайт, який піклується про створення та підтримку git repos для вас та робить їх загальнодоступними (якщо ви не платите).
toriningen

1
@Chloe GitHub є загальнодоступним, але BitBucket надає приватні репости.
sws

2
Також Git не відслідковує порожні каталоги.
Flimm

1

Шукаючи цю відповідь сам, я думаю, вам потрібно спершу зробити пакет за допомогою rsync, а потім надіслати їх усім, що зробило б це так, що список файлів потрібно було б стиснути лише один раз, а потім ви могли просто фон усі три rsyncs, щоб запустити їх паралельно.


1

Іншим можливим рішенням є просто запуск стільки процесів rsync паралельно, скільки у вас хостів, тобто fork.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.