Назад | Перейти на главную страницу

rsync с --hard-links зависает

У меня есть большой каталог под названием servers, который содержит множество жестких ссылок, сделанных rsnapshot. Это означает, что структура более или менее похожа на:

./servers
./servers/daily.0
./servers/daily.0/file1
./servers/daily.0/file2
./servers/daily.0/file3
./servers/daily.1
./servers/daily.1/file1
./servers/daily.1/file2
./servers/daily.1/file3
...

Снимки были созданы с помощью rsnapshot компактным способом: если /servers/daily.0/file1 такой же как /servers/daily.1/file1, они оба указывают на один и тот же индексный дескриптор, используя жесткую ссылку, вместо того, чтобы просто копировать полный снимок каждый цикл ./servers/daily.0/file1/servers/daily.0/file1

Я попытался скопировать его со структурой жестких ссылок, чтобы сэкономить место на целевом диске, используя:

nohup time rsync -avr --remove-source-files --hard-links servers /old_backups

Через некоторое время rsync зависает - новые строки в файл не добавляются. nohup.out файл, и кажется, что файлы не перемещаются с одного диска на другой. Удаление nohup не решил проблему.

Есть идеи, что случилось?

Адам

Мой ответ, который я даю на основании с трудом заработанного опыта: не делайте этого. Не пытайтесь скопировать иерархию каталогов, в которой интенсивно используются жесткие ссылки, например, созданная с помощью rsnapshot или rsync --link-dest или похожие. Он не будет работать ни с чем, кроме небольших наборов данных. По крайней мере, не достоверно. (Ваш опыт, конечно, может отличаться; возможно, ваши наборы данных резервных копий намного меньше моих.)

Проблема с использованием rsync --hard-links для воссоздания жестко связанной структуры файлов на стороне назначения заключается в том, что обнаружение жестких ссылок на стороне источника жесткий. rsync должен построить карту inodes в памяти, чтобы найти жесткие ссылки, и если ваш источник не имеет относительно небольшого количества файлов, это может и будет взорваться. В моем случае, когда я узнал об этой проблеме и искал альтернативные решения, я попробовал cp -a, который также должен сохранять жесткую структуру файлов в месте назначения. Он долго сбивался и наконец умер (с ошибкой или чем-то в этом роде).

Я рекомендую выделить целый раздел для вашего rsnapshot резервное копирование. Когда он заполнится, подключите другой раздел. Гораздо проще перемещать наборы данных с жесткими связями как целые разделы, а не как отдельные файлы.

В этот момент кажется, что rsync завис, завис или просто занят? Проверьте активность процессора с помощью top и дисковая активность с iotop -o.

Возможно, он был занят копированием большого файла. Вы бы увидели это в iotop или аналогичный, или на дисплее rsync, если вы запускали его с --progress вариант.

Он также может быть занят сканированием списков inodes для проверки связанных файлов. Если используется инкрементная рекурсия, которая используется по умолчанию для рекурсивных передач, в большинстве случаев, если и клиент, и сервер имеют rsync v3.0.0 или новее, он мог просто попасть в каталог со многими файлами и запустить проверку связи между всеми файлами. в нем и все найденные ранее. В --hard-links вариант может быть очень Процессор интенсивно загружает большие наборы файлов (поэтому он не включен в список опций, подразумеваемых общим --archive вариант). Это будет проявляться в высокой загрузке ЦП в то время, когда rsync кажется приостановленным / зависшим.

У меня такая же проблема. Моя проблема была решена добавлением --no-inc-recursive вариант.

Из https://download.samba.org/pub/rsync/rsync.html:

Если инкрементная рекурсия активна (см. --recursive), rsync может передать отсутствующий жестко связанный файл до того, как обнаружит, что другая ссылка для этого содержимого существует где-то в другом месте иерархии.

Это не влияет на точность передачи (то есть какие файлы жестко связаны друг с другом), а только на ее эффективность (т.е. копирование данных для новой, ранней копии файла с жесткой связью, которая могла быть найдена позже при передаче в другой член жестко связанного набора файлов).

Один из способов избежать этой неэффективности - отключить инкрементную рекурсию с помощью --no-inc-recursive вариант.