Як ви синхронізуєте величезні розріджені файли (зображення диска VM) між машинами?


22

Чи є така команда, як rsync, яка може синхронізувати величезні, розріджені файли з одного Linux-сервера на інший?

Дуже важливо, щоб файл призначення залишався рідким. Він може бути довшим (але не більшим), ніж накопичувач, який його містить. Лише змінені блоки повинні надсилатись через провід.

Я спробував rsync, але не отримав радості. https://groups.google.com/forum/#!topic/mailing.unix.rsync/lPOScZgFE9M

Якщо я напишу програму для цього, я просто винаходити колесо? http://www.finalcog.com/synchronise-block-devices

Спасибі,

Кріс.


rsync надзвичайно неефективний з величезними файлами. Навіть з --inplace, він спочатку прочитає весь файл на цільовому хості, а потім почне читати файл на локальному хості та передати відмінності (просто запустіть dstat або подібний під час запуску rsync та спостерігайте)
ndemou

Відповіді:


21
rsync --ignore-existing --sparse ...

Створення нових файлів у розрідженому режимі

Слідом за

rsync --inplace ...

Щоб оновити всі наявні файли (включаючи раніше створені розріджені) на місці.


3
Зворотній зв'язок, щоб мати, rsync --existing --inplaceа потім rsync --ignore-existing --sparseмати швидке синхронізацію
Майк

2
Хто-небудь може пояснити коментар Майка і як це повинно прискорити синхронізацію?
Пріксо

Я думаю, що Майк означає спочатку змінити місце, а потім додати нові, так що нових не потрібно - замінити знову через різницю у часі між першим та другим дзвінками. Це справедливо лише в тому випадку, якщо ви rsync безпосередньо з сховища даних і VM працює. Якщо він не означає щось інше?
Юань

Я згоден з Юаном. Друга команда Стіва знову буде синхронізувати нові файли, ви можете переконатися, використовуючи послідовність команд Mikes.
falstaff

rsync надзвичайно неефективний з величезними файлами. Дивіться мій коментар до питання.
ndemou

5

Rsync передає зміни в кожен файл, а з --inplace слід переписати лише ті блоки, які змінилися, не відтворюючи файл. Зі сторінки їх функцій .

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

Використання --inplace має працювати для вас. Це покаже вам прогрес, стисніть передачу (на рівні стиснення за замовчуванням), перекладіть вміст локального каталогу зберігання рекурсивно (це важливо для першого сліду), внесете зміни до файлів на місці та використовуйте ssh для транспорту.

rsync -v -z -r --inplace --progress -e ssh /path/to/local/storage/ \
user@remote.machine:/path/to/remote/storage/ 

Я часто також використовую прапор -a, який робить ще кілька речей. Це еквівалентно -rlptgoD Я залишаю точну поведінку для вас, щоб шукати на сторінці man.


1
'-S' призначений для розріджених файлів, а не для відбивання довгих рядків. На сторінці man: -S, --sparse ефективно обробляти рідкісні файли. Я спробую це, дякую.
fadedbee

Дякую, я це виправдав - я збирався щось із сказаного у посиланні, яке ви надали.
рекобат

Ні, на жаль це не вирішує проблему. Це робить синхронізацію файлу, але виходить розріджений файл на дальньому кінці в не-розріджений файл. Я використовую ssh / rsync, який постачається з Ubuntu 9.04.
fadedbee

Мій вище коментар був невірним. Проблема полягала в тому, що rsync створює непрості файли на першій копії. --Inplace rsync працює правильно, за умови, що цільовий файл вже існує і такий же довгий (не великий), як початковий файл. Зараз у мене є рішення, але воно вимагає від мене перевірити, чи кожен файл вже існує на цільовому сервері. Якщо це так, я роблю --inplace, якщо цього немає, я використовую --sparse. Це не ідеально, але це працює.
fadedbee

rsync надзвичайно неефективний з величезними файлами. Дивіться мій коментар до питання
ndemou

4

Я закінчив писати програмне забезпечення для цього:

http://www.virtsync.com

Це комерційне програмне забезпечення вартістю 49 доларів за фізичний сервер.

Зараз я можу копіювати розріджений файл розміром 50 ГБ (вміст 3 Гб вмісту) за 3 хвилини на житлову широкосмугову мережу.

chris@server:~$ time virtsync -v /var/lib/libvirt/images/vsws.img backup.barricane.com:/home/chris/
syncing /var/lib/libvirt/images/vsws.img to backup.barricane.com:/home/chris/vsws.img (dot = 1 GiB)
[........>.........................................]
done - 53687091200 bytes compared, 4096 bytes transferred.

real    2m47.201s
user    0m48.821s
sys     0m43.915s 

4
TBH, термін заявки, в який можна синхронізувати, є досить безглуздим, оскільки це очевидно залежить від кількості змінених даних. Що точніше сказати, це те, що вашому програмному забезпеченню потрібні 3 хвилини, щоб з'ясувати, які блоки змінилися, і навіть ця швидкість, ймовірно, залежить від вводу / виводу вашого диска і, можливо, доступних циклів процесора.
Витяжка реальності

6
Ви повинні розкрити, що це комерційне програмне забезпечення, що коштує 98 доларів або більше за функціональність мережі.
Рейд

Дякуємо, що вказували нам на програмне забезпечення, яке добре працювало для вас, яке люди тепер можуть розглянути та використовувати або не використовувати так, як потрібно. Не дякую двом іншим за внесок нічого нового.
Флоріан Хейгл

3

Погляньте на Zumastor Linux Storage Project, він реалізує резервну копію "знімка", використовуючи двійкову "rsync" через ddsnapінструмент.

З чоловічої сторінки:

ddsnap забезпечує реплікацію блокового пристрою з урахуванням засобу зйомки на рівні блоку, здатного ефективно робити кілька одночасних знімків. ddsnap може створити список фрагментів знімків, які відрізняються між двома знімками, а потім надіслати цю різницю по дроту. На низхідному сервері запишіть оновлені дані на блоковий пристрій знімків.


2

lvmsync робить це.

Ось стенограма використання . Він створює знімок LVM на джерелі, передає логічний розділ. Ви можете переносити поступові оновлення змін після створення знімка так часто, як вам зручно.


Я спробував це, але це не працює, і автор не готовий підтримувати
user1007727

1
@ user1007727 не бажає підтримувати або не готовий безкоштовно підтримувати?
fadedbee

Раніше я використовував lvmsync, він працював, але це не програмне забезпечення imo. :-)
Флоріан Хейгл

1

Чи може тиражування всієї файлової системи бути рішенням? DRBD? http://www.drbd.org/


Я не думаю, що drbd тут не є гарним рішенням, але ідея rsyncing - замінити цілі файли, а не диски-файли зображень - цікава. Я не впевнений, чи дозволяє rsync це - я спробую і звіту ...
fadedbee

1

Можливо, трохи дивно тут, але нещодавно я дізнався, що NFS справляється із цим штрафом.

Отже, ви експортуєте каталог на одній машині, після чого змонтуєте його на іншому, і ви просто скопіюєте файли з базовими утилітами cp. (Деякі старі / стародавні утиліти можуть мати проблеми з розрідженими файлами.)

Я вважаю rsyncособливо неефективним у передачі розріджених файлів.


1

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

bdsyncпрацював для мене, здається досить зрілим, історія помилок підбадьорює (мало питань, швидке вирішення). У моїх тестах ця швидкість була близькою до теоретичного максимуму, який ви могли отримати ** (тобто ви можете синхронізувати приблизно час, який вам потрібно прочитати файл). Нарешті, це відкритий код і нічого не коштує.

bdsyncчитає файли з обох хостів та обміняє контрольні суми, щоб порівняти їх та виявити відмінності. Все це одночасно . Нарешті створюється стислий патч-файл на вихідному хості. Потім ви переміщаєте цей файл до цільового хосту і запускаєте bdsync вдруге, щоб виправити файл призначення.

Використовуючи його через досить швидке посилання (наприклад, 100 Мбіт Ethernet) і для файлів з невеликими різницями (як це найчастіше відбувається на дисках VM), це скорочує час синхронізації до часу, який потрібно прочитати файл. За повільним посиланням вам потрібно трохи більше часу, оскільки вам доведеться скопіювати стислі зміни з одного хоста на інший (схоже, ви можете заощадити час, використовуючи приємний трюк, але не пройшли тестування).


*: rsync дуже неефективний з величезними файлами. Навіть з --inplace, він спочатку прочитає весь файл на хості призначення, AFTERWARDS починає читати файл на вихідному хості та, нарешті, переносить відмінності (просто запустіть dstat або подібне під час роботи rsync та спостерігайте). Результат полягає в тому, що навіть для файлів з невеликими різницями для читання файлу потрібно подвоїти час, який вам потрібно прочитати, щоб синхронізувати його.

**: За припущенням, що у вас немає іншого способу сказати, які частини файлів змінилися. Знімки LVM використовують растрові карти для запису змінених блоків, щоб вони були надзвичайно швидкими (у readme lvmsync є більше інформації).


0

Я не знаю про таку утиліту, лише про системні дзвінки, які можуть це впоратися, тому, якщо ви пишете таку утиліту, це може бути досить корисним.

що ви насправді можете зробити, це використовувати qemu-img converter для копіювання файлів, але це буде працювати лише в тому випадку, якщо FS призначення підтримує розріджені файли

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