Синхронізація дуже великих структур папок


14

У нашій інтрамережі є структура папок, яка містить близько 800 000 файлів, які поділяються на близько 4000 папок. Нам потрібно синхронізувати це з невеликою групою машин у наших ДМЗ. Глибина споруди дуже мала (вона ніколи не перевищує двох рівнів глибини).

Більшість файлів ніколи не змінюються, кожен день з'являється кілька тисяч оновлених файлів і 1-2 тисячі нових файлів. Дані - це дані історичної звітності, які зберігаються там, де вихідні дані були очищені (тобто це доопрацьовані звіти, для яких вихідні дані є достатньо старими, щоб ми їх архівували та видаляли). Синхронізація один раз на день є достатньою, враховуючи, що це може відбуватися у розумні часові рамки. Звіти формуються протягом ночі, і ми спочатку синхронізуємо вранці як заплановане завдання.

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

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

Хтось ще натрапив на масштабний проект синхронізації такого роду? Чи є щось, розроблене для обробки таких масивних файлових структур для синхронізації?


Ви намагалися розділити роботу на кілька примірників запуску rsync одночасно? Я не маю справжньої гарної картини структури каталогу, але ви можете розділити її за іменем каталогу або ім'ям файлу.
Зчеплення

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

Чи знайшли ви коли-небудь хороше рішення, Дейв? Я розглядаю lsyncd для dir з 65535 субдиректами, кожен з яких може мати 65 ^ 16 файлів.
Майк Дієн

1
@MikeDiehn Я ніколи не знайшов інструмент, яким я був абсолютно задоволений. Ми отримали той власний інструмент RepliWeb, щоб виправити помилку, де вони бачили файли як делетів, яких не було, це була переповнена внутрішня структура. Я покинув цю роботу років тому, я вважаю, що вони все ще використовують це. Для ваших цілей, якщо ваші каталоги достатньо розповсюджені, ви можете скористатися чимось на зразок рішення Райана. Він не помітить делетів верхнього рівня, але 65535 підкаталоги підказують мені, що ви, мабуть, їх не маєте.
Могутній

Відповіді:


9

Якщо ви можете довірити останню зміну часових позначок файлової системи, ви можете прискорити роботу, поєднавши Rsync з утилітою UNIX / Linux 'find'. 'find' може зібрати список усіх файлів, які показують останні змінені часи протягом минулої доби, а потім передавати ТІЛЬКИ, що скорочує список файлів / каталогів до Rsync. Це набагато швидше, ніж Rsync порівнювати метадані кожного окремого файлу відправника з віддаленим сервером.

Коротше кажучи, наступна команда виконає Rsync ТОЛЬКО у списку файлів та каталогів, які були змінені за останні 24 години: (Rsync НЕ буде намагатися перевіряти будь-які інші файли / каталоги.)

find /local/data/path/ -mindepth 1 -ctime -0 -print0 | xargs -0 -n 1 -I {} -- rsync -a {} remote.host:/remote/data/path/.

У випадку, якщо ви не знайомі з командою 'find', вона повторюється через певне підкаталог каталогу, шукаючи файли та / або каталоги, які відповідають усім критеріям, які ви вказали. Наприклад, ця команда:

find . -name '\.svn' -type d -ctime -0 -print

запуститься в поточному каталозі (".") і повторно пройде через всі підкаталоги, шукаючи:

  • будь-які каталоги ("-тип d"),
  • з іменем ".svn" ("-ім'я '.svn'"),
  • з метаданими, зміненими протягом останніх 24 годин ("-cime -0").

Він друкує повну назву шляху ("-принт") будь-чого, що відповідає цим критеріям на стандартному виході. Параметри '-name', '-type' та '-ctime' називаються "тестами", а параметр '-print' називається "дії". На головній сторінці "знайти" є повний перелік тестів та дій.

Якщо ви хочете бути по-справжньому розумними, ви можете використовувати тест команди 'find' '-cnewer' замість '-ctime', щоб зробити цей процес більш стійким до відмов і гнучким. '-cnewer' перевіряє, чи змінили кожен файл / каталог у дереві свої метадані нещодавно, ніж якийсь довідковий файл. Використовуйте "touch", щоб створити довідковий файл NEXT run на початку кожного запуску, безпосередньо перед "find ... |" команда rsync ... 'виконується. Ось основна реалізація:

#!/bin/sh
curr_ref_file=`ls /var/run/last_rsync_run.*`
next_ref_file="/var/run/last_rsync_run.$RANDOM"
touch $next_ref_file
find /local/data/path/ -mindepth 1 -cnewer $curr_ref_file -print0 | xargs -0 -n 1 -I {} -- rsync -a {} remote.host:/remote/data/path/.
rm -f $curr_ref_file

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


Це надзвичайно розумне рішення! Я думаю, ти маєш на увазі touch $next_ref_fileв кінці? Це не дозволяє нам впоратися із видаленими шляхами (навіть ці статичні архівні звіти зрештою старіють, що вони архівуються та видаляються). Це, можливо, не буде пробкою шоу.
Могутній

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

Щодо цього сценарію, так, я помилився. Я мав на увазі запуск "touch" на "next_ref_file" (НЕ "curr_ref_file") прямо перед запуском "знайти ... | команда rsync ... '. (Я виправлю свою відповідь.)
Райан Б. Лінч

3
Щодо повільної команди "знайти": яку файлову систему ви використовуєте? Якщо ви використовуєте Ext3, ви можете розглянути два налаштування FS: 1) Запустіть 'tune2fs -O dir_index <DEVICE_NODE>', щоб включити функцію 'dir_index' на Ext3, щоб прискорити доступ до dirs з великим числом файлів. 2) Запустіть 'mount -o remount, noatime, nodiratime', щоб вимкнути оновлення часу доступу, що, як правило, прискорює читання. 'dumpe2fs -h <DEVICE_NODE> | grep dir_index 'повідомляє вам, що "dir_index" вже ввімкнено (у деяких дистрибутивах - це за замовчуванням) та "mount | grep <DEVICE_NODE> "повідомляє про оновлення часу доступу.
Райан Б. Лінч

На жаль, це NTFS - Windows 2003 Server, що використовує Cygwin для команди find. Я запам'ятаю ті параметри настройки (відмінна порада) для ext3 у випадку, якщо ми коли-небудь натрапимо на щось подібне на одному з наших кластерів Debian.
Могутній

7

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


Я спробую Юнісон спробувати. Зараз на етапі "Шукаю зміни" він працює близько 2 годин, і на основі файлів, над якими зараз працює, схоже, що це майже наполовину зроблено (тому, можливо, 4 години, перш ніж розпочнеться передача). Схоже, це буде краще, ніж rsync, але все ще поза бажаним операційним вікном.
Могутній

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

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

Тепер, коли початковий каталог створений для сканування змін, потрібно близько 2 годин. Я дуже здивований, скільки RAM Unison використовує для цього. Для нашої колекції файлів вихідний сервер використовує 635M, а віддалений клієнт - 366M. Синхронізувати кілька машин у кластері було б досить здоровенним слідом, особливо для вихідного сервера!
Могутній

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


2

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


Ми спробували із прапором -z та без нього. Це, мабуть, не вплинуло на тривалість виконання "списку файлів будівельних файлів".
Могутній

2

Якщо команда -z вийшла з команди rsync, яка не стискає, так швидше пішов "список файлів прийому", і нам довелося передати близько 500 ГБ. Перш ніж пройшов день із перемикачем -z.

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