LINUX.ORG.RU
решено ФорумAdmin

Архивирование больших дирикторий (миллионы файлов) на продакшн сервере

 , , ,


2

3

В какой-то момент появилась необходимость заархивировать дириктории гигантских размеров на работающем сервере. При попытке простого использования архиватора tar выявилась проблема: безбожно грузился жёсткий диск, не давая работать важным процессам. Поэтому было принято решение написать скрипт по архивации.

Написав такой скрипт, появилось желание поделиться (чего добру пропадать). Вот ссылка на сабж:

https://gist.github.com/taroved/11269983

(Тестировалось на ubuntu 11.04 и 12.04)

Важные особенности:

1. В нем используется Pipe Viewer, который выполняет основную работу. Он ограничивает скорость чтения с диска и отображает прогресс бар, что является неоценимой пользой, поскольку процесс архивации может занимать несколько дней.

2. Скрипт кладет запакованные архивы в поддиректории вида «год» либо «год/месяц» (в зависимости от параметров скрипта).

PS: Это уже вторая версия. Предыдущая версия была освещена здесь: http://habrahabr.ru/sandbox/81541/

PPS: Если кто скажет, на каком ресурсе еще можно засветить подобный стаф, буду премного благодарен. Ну и здорово вообще услышать какой-нибудь отзыв от знающих людей



Последнее исправление: taronto (всего исправлений: 1)

Есть же ionice. Еще можно планировщик ввода-вывода переключить на deadline — в теории тоже должно помочь.

Black_Roland ★★★★
()
Ответ на: комментарий от Black_Roland

Спасибо за инфу, очень интересно

taronto
() автор топика

Я думаю проще было бы установить квоту на работу с диском, например на контейнер.

vertexua ★★★★★
()
Ответ на: комментарий от taronto

1) Т.к. /bin/bash, то тесты лучше брать в двойные квадратные скобки.

2) «echo `curtime` …» лучше сделать функцией.

3) «if !(dpkg-query -W pv)» лучше заменить [[ ! -x `which pv` ]]

4) В cat $CUR_DIR/$LIST_FILE | awk '{ print $3 }' | sed "s|^|$SUBDIR/|" много лишнего, начиная с cat.

Больше ничего особо криминального не увидел.

Gotf ★★★
()
Ответ на: комментарий от vertexua

пока не понимаю о чем идет речь, перечитаю через пол часа

taronto
() автор топика
Ответ на: комментарий от taronto

не слышал, но тема интересная, спасибо

LVM позволяет снапшоты, а это залог неизменности данных в момент копирования.

MikeDM ★★★★★
()
Ответ на: комментарий от taronto

Грамотно писать по-твоему - «всем не угодишь?»

dvrts ★★★
()
Ответ на: комментарий от Gotf

все понял, внесу исправления и сделаю зарубки. Прошу учесть в личном деле, что я на этом скрипте учился писать на баше

taronto
() автор топика
Ответ на: комментарий от taronto

LVM, не слышал, но тема интересная

каким боком она интересная, тормозными снапшотами?

Архивирование больших дирикторий (миллионы файлов)

а почему не использовать ФС со встроенным сжатием данных на лету?

vxzvxz ★★★
()
Ответ на: комментарий от MikeDM

LVM позволяет снапшоты, а это залог неизменности данных

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

taronto
() автор топика
Ответ на: комментарий от vxzvxz

каким боком она интересная, тормозными снапшотами?

интересна лично мне, не обязательно для конкретного случая

а почему не использовать ФС со встроенным сжатием данных на лету?

использование другой файловой системы мне не доступно, да я и не вижу для себя какого-то выигрыша перед tar.gz

taronto
() автор топика
Ответ на: комментарий от Gotf

[[ ! -x `which pv` ]]

не-не, зачем так? и еще сообщение об ошибке на stderr. я проверяю так: function execs { type "$1" > /dev/null 2>&1; }. компактно, надежно, без лишнего вывода.

val-amart ★★★★★
()

PPS: Если кто скажет, на каком ресурсе еще можно засветить подобный стаф, буду премного благодарен. Ну и здорово вообще услышать какой-нибудь отзыв от знающих людей

Подобный стафф, заключающийся в одной осмысленной строчке кода - не нужен. Есть масса нормальных решений на все случаи жизни, но ведь поискать их сложнее, чем наваять своё, да.

handbrake ★★★
()
Ответ на: комментарий от taronto

не вижу для себя какого-то выигрыша перед tar.gz

т.е. получение мгновенной сжатой копии ваших данных, без нагрузок на железо это не выигрыш?

vxzvxz ★★★
()
Ответ на: комментарий от xorik

+1 за cgroups как ограничивалку. Нормальная ограничивалка ставит приоритет, а не жестко лимитит MB/sec. По скрипту - можно же и скорость листинга тоже ограничить. Кроме того, ls жуткий тормоз по сравнению с find, который, кстати, сам умеет сравнивать даты файлов.

Но чем это все лучше dump-а файловой системы? Dump и инкременты поддерживает, и сжатие. man dump.

Bers666 ★★★★★
()
Ответ на: комментарий от handbrake

Подобный стафф, заключающийся в одной осмысленной строчке кода - не нужен

точка зрения засчитана

Есть масса нормальных решений на все случаи жизни, но ведь поискать их сложнее, чем наваять своё, да.

не может быть, мы наверно считаете, что я не искал. Теперь, да, я вижу, что кое о чем я не подумал при поиске.

И навоять свое иногда полезно, не так уж много я и навоял) Кстати говоря, в скрипте есть кое-какой интерактив, одной строчкой такое не сделать

taronto
() автор топика
Ответ на: комментарий от Bers666

Нормальная ограничивалка ставит приоритет, а не жестко лимитит MB/sec

да, приоритет здесь лучше подходит, если будет третья версия, то лимит уберу. Правда нужность версии такой под вопросом пока, впрочем как и ненужность)

По скрипту - можно же и скорость листинга тоже ограничить.

знать бы как ее ограницивать еще

Кроме того, ls жуткий тормоз по сравнению с find, который, кстати, сам умеет сравнивать даты файлов.

ls -U работает достаточно быстро, правда процесс получает статус D и не откликается. c find-ом я не доэкспериментировал, он не сортирует файлы перед выводом?

Но чем это все лучше dump-а файловой системы?

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

taronto
() автор топика

для таких задач тебе уже посоветовали взять специальную ФС.

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

мне тебя жаль...

emulek
()
Ответ на: комментарий от taronto

Кстати говоря, в скрипте есть кое-какой интерактив, одной строчкой такое не сделать

при создании бекапа может быть только один «интерактив»: уведомление администратора об аварии.

emulek
()
Ответ на: комментарий от vxzvxz

получение мгновенной сжатой копии ваших данных, без нагрузок на железо это не выигрыш?

скажу сразу, что я мало знаю про сжатые файловые системы, но какой алгоритм сжатия информации в этой файловой системе, про которую вы говорите?

taronto
() автор топика

taronto скрипт не читал, но имею вопрос - твой волшебний скрипт использует lock файл для предотвращения двойного запуска?

MikeDM ★★★★★
()
Ответ на: комментарий от MikeDM

скрипт не читал, но имею вопрос - твой волшебний скрипт использует lock файл для предотвращения двойного запуска?

никак нет, но там есть проверка на существование целевого файла-архива, достаточно ж я думаю

taronto
() автор топика
Ответ на: комментарий от MikeDM

66 if !(dpkg-query -W pv)

епрст! а как же CentOS openSUSE ну и Gentoo вконце концов?

уже предложены альтернативы для этой строчки, будет исправлено

taronto
() автор топика
Ответ на: комментарий от taronto

достаточно ж я думаю

Этого не достаточно. вот пример - у меня почтовый сервак делает срез почты используя LVM 22 часа. И может возникнуть ошибка копирования. И что бы исключить повторный запуск резервирования автоматизированного используется lock файл. который сигнализирует о запущенном или аварийно остановленном предидущем запуске.

MikeDM ★★★★★
()
Ответ на: комментарий от MikeDM

lock файл

да, о неудачных попытках скрипт не сигнализирует таким образом, может и стоит сделать. Поизучаю вопрос

taronto
() автор топика
Ответ на: комментарий от Deleted

Директории же.

да, к моему сожалению

taronto
() автор топика
Ответ на: комментарий от taronto

ну да, планируется по крону использоваться

тогда всячески рекомендую задуматься о файле блокировок и реакции на него.

у меня сервера месяцами работают сами и их анализом я занимаюсь через систему мониторинга ибо много серверов. и скрипт резервирования должен уметь общаться с системой мониторинга. Например делать пометку в лог о удачном завершении резервирования. или о неудачном =) А вот уже агент мониторинга обрабатывая логи за сутки принимает решение - удачно все или нет. А запрет повторного запуска после ошибки позволит исключить еще больше фейлов. Как и два одновременно запущенных скрипта резервирования могу делов наделать =)

MikeDM ★★★★★
()
Ответ на: комментарий от MikeDM

всячески рекомендую задуматься о файле блокировок

да, отличная техника походу, и я скорее всего воспользуюсь вашим советом. Только сделаю эту функцию отключаемой, а то вдруг кто захочет запустить несколько экземпляров.

taronto
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.