rsync — быстрый резерв + быстрый перенос сайтов

Июнь 16th, 2010 по Perlover Оставить ответ »

Когда-то давно, для резервирования, я использовал такие, казалось бы, незаменимые утилиты, как tar или pax. Я слышал в то время про rsync, но не представлял себе, как она в точности работает, поэтому я ощибочно полагал, что rsync — простая утилита копирования. А раз простая, то вряд ли я получу от нее много толку. Поэтому я продолжал и продолжал пользоваться tar или pax, затем копировал по scp эти архивы, там распаковывал и т.п.. Я даже использовал find затем, чтобы докопировать файлы, которые изменились за последние сутки. Эх, жаль, что я столько много истратил времени на копирование, ведь была rsync!

Итак, что же это за такая rsync? Это действительно, утилита рекурсивного копирования (копирует все файлы и поддиректории) с одного хоста на другой, или даже внутри одной машины. На этом все ее отличие от, например, утилиты cp заканчивается. И вот тут самое интересное — она при копировании каждый файл или директории, которые копируем, проходит блоками, и отслеживает только изменения блоков в сравнении с уже скопированными блоками. Грубо говоря, она копирует только «дельты» файлов и директорий! Что это значит? Это значит, что второй, третий и так далее запуски этой программы на определенную цель (куда копировать) будут занимать гораздо меньше времени, операций копирования и передачи данных по сети при повторном копировании уже изменившихся файлов. Вот несколько примеров ее использования:

1) Быстрый перенос баз данных (на примере SQL).

Имеем два сервака — один рабочий A, второй Б — куда будем резервировать свои базы данных (там где нет работающего SQL). Тогда для резервирования можно периодически запускать rsync на сервере A, не прекращая работы SQL сервера (назовем это «рабочим резервом»). Но чтобы нам иметь полностью правильные базы в резервной директории сервера Б, нам надо временами останавливать SQL на серваке А, и пока там нет работаюшего SQL, делать повторное копирование (назовем это «фиксированным резервом»). Вот тут то rsync и пригождается! Во время «рабочего резерва» многие файлы успевают устареть, ведь SQL продолжает работать. Во время «фиксированного резерва» копируются только дельты с последнего запуска «рабочего резерва». Если время между этими запусками мало, то дельты копируются очень быстро — на больших базах это может быть не более минуты, например. Для снижения времени простоя, надо просто выполнить повторный «рабочий резерв» прямо перед остановкой MySQL сервера. Плюсы такого способа — минимальный даун по времени, минимум человеческих ошибок, простота. Я не знаю другого способа на данный момент, чтобы сделать быстрый резерв больших баз данных на другую машину, и при этом свести время простоя к минимуму.

Команды (смотрите не перепутайте! Тут все как в теории относительности :-))
На стороне сервера Б (можно и на стороне А, но тогда надо поменять пути местами), куда копируем, запускаем команды копирования во время «рабочего резерва»

cd
nohup /bin/nice -n 20 ionice -c3 rsync --rsync-path='/bin/nice -n 20 ionice -c3 rsync' -avz --delete IP.ADDRESS.SERVER.A:'/path/to/source/folder/' /path/to/target/folder/

Краткие пояснения (ВАЖНО):
Некоторые утилиты могут отсутствовать, примеры даны для Linux! Здесь nohup — «оторвать» ввод/вывод от терминала. Это нам потребуется, когда мы захотим оставить запущенный «резерв» в фоновом режиме. Сразу мы не можем этого сделать (то есть не ставлю ‘&’ в конце), так как rsync при копировании использует ssh, и раз мы копируем на другой сервак, он запросит у нас пароль (если авторизация через openssh ключи + ssh-agent, то можно и поставить ‘&’, но об этом в другой раз, в другой статье). После ввода пароля уже можно будет нажать Ctrl+Z в shell и затем "%1 &" для запуска в фоновом режиме первой запущенной задачи (см. man bash). Команда nice — выставить приоритет для процессора, а ionice — приоритет для операций при работе с диском — все приоритеты ставяться на понижение, чтобы продолжалась нормальная работа сервера. Опция --delete для rsync — удалять все файлы в целевой директории (от слово «цель», target), которых нет в исходной (source). То есть, после копирования получим полностью равную директорию по содержанию.
Слеш в конце исходной директории (/path/to/source/folder/)  — важная штука! Если в конце слеш — директория рассматривается rsync-ом как комплект директорий и файлов в ней для копирования, а если слеша нет — как один объект, целая директория со своим именем — в обоих случаях копирование рекурсивное, но если из примера убрать слеш в конце первого пути (сделать /path/to/source/folder), то в /path/to/target/folder/ будет создана папка folder и туда скопируется ее содержимое! Почитайте man-ы, если хотите понять, как присутствие или отсутствие слешей в конце директории влияет на ход событий 😉

2) Перенос сайтов.

Способом, описанным выше, также можно переносить и сайты вместе с их базами. Для баз мы используем способ выше, а для переноса контента делаем все то же самое, но при работающем apache. Как и в первом способе, apache мы останавливаем только на несколько минут или секунд, быстро запускаем rsync для «фиксированного резерва», а после окончания запускаем apache снова. После остается сменить только DNS на новый IP адрес и все! Для повышения скорости переноса не забудьте за неделю до переноса выставить часовой TTL в вашем DNS для SOA записи зоны и для всех ее остальных записей. Тогда при смене IP весь трафик на сайт переместится за один час! Но это, как говориться, уже другая история. 🙂

QR-Code этой страницы:

3 комментария

  1. Васько:

    а есть ли rsync под винду?? спасибо за открытие такой чудной утилитки.

  2. Perlover:

    Нашел в Гугле два rsync под Windows.
    Оба не пробовал, но если верить Wiki (En) — оба ими являются.
    Вот ссылки:
    DeltaCopy: http://www.aboutmyip.com/AboutMyXApp/DeltaCopy.jsp
    QtdTools: http://qtdtools.doering-thomas.de/page.php?seite=0&sub=0&lang=en
    Оба с графическими интерфейсами. Я так понимаю, что разрботчики могли взять open source исходники rsync и адаптировать их под Windows, прикрутив к ним свои оболочки. Возможно, обе программы — бесплатны.

  3. Vasilich:

    очень давно использую rsync в самых различных целях. 7 лет назад сменил работу, где пришлось работать под виндузой. Сразу озадачился поиском rsync под win — без проблем нашел классический вариант под Cygwin. Искать по фразе cwRsync.
    Бинарники живут примерно здесь: https://www.itefix.no/i2/cwrsync