Синхронизация данных. Просто и со вкусом






Интернет вездсущ. Так-то оно так, только всё ещё встречаются на наших широтах места, где не то что DSL, но и хоть какой-нибудь GPRS  днём с огнём не сыщешь. В частности я, иногда выбирающийся подальше от цивилизации, всё равно беру ноутбук с собой, чтобы иной раз, при случае, поработать в тени речных ив. И тут, само собой возникает определённое неудобство. Что делать, когда вдали от домашней сети наваял что-то новенькое, удалил старенькое, но всё это происходит «локально», то бишь, изменения в структуре хранимых на жёстком диске данных, никак не «отмечаются» в домашнем хранилище? Данная проблема и побудила описать этот простой и элегантный, на мой взгляд, способ синхронизации данных между двумя Linux-хостами.


Итак, задача: реализовать двухстороннюю синхронизацию между двумя Linux-хостами. Скажу сразу, я не маялся в поисках подходящих GUI-утилит (коих множество), а пошёл по пути наименьшего сопротивления, воспользовавшись присутствующим в каждом Linux-дистрибутиве инструментом — старой-доброй rsync.

В моём случае имеется следующее: рабочая станция (стационарный компьютер, работающий дома под управлением Ubuntu 10.10) и ноутбук, который я везде таскаю, работающий под управлением Debian 5.0.6.

Настройка сервера rsync

Первым делом необходимо настроить rsync-сервер на обоих компьютерах. В моих системах пакет rsync установлен по умолчанию. Если в вашей системе это не так, установите его способом, принятым в вашей системе. Для Debian-подобных систем будет достаточно команды:

sudo apt-get install rsync

После установки пакета, необходимо разрешить его автозапуск в файле /etc/default/rsync:

RSYNC_ENABLE=true

И убедиться в том, что скрипт запуска вызывается при старте системы:

sudo update-rc.d rsync defaults

Далее, необходимо открыть доступ для клиентов rsync к нужным каталогам. В моём случае понадобилось предоставить доступ лишь к домашним каталогам на ноутбуке и рабочей станции. Вот пример моего файла настроек /etc/rsyncd.conf (имейте ввиду, что по умолчанию этого файла нет в системе, даже пустого):

[ashep]
	comment = ashep
	path = /home/ashep
	use chroot = true
	uid = ashep
	gid = users
	log file = /var/log/rsyncd/ashep.log
	read only = false
	write only = false
	hosts allow = adesktop.ashep
	hosts deny = *
	transfer logging = true

Используемые параметры описаны здесь. В данном же случае хочу обратить ваше внимание на следующее:

  • параметр log file можно не указывать, если вам это не нужно. Я же предпочитаю протоколировать всё, что только можно;
  • если вы не определите параметр log file, то нет смысла в определении transfer logging;
  • transfer logging в большинстве случаев полезен лишь на стадии тестирования, поэтому его можно и не включать в целях экономии ресурсов системы;
  • обратите внимание на значение параметра hosts allow в примере и замените его на соответствующее вашему случаю имя компьютера или IP-адрес;
  • тоже самое касается и параметров uid и gid.

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

sudo /etc/init.d/rsync restart

Синхронизация

Теперь, когда rsync-серверы настроены на обоих хостах, можно выполнять синхронизацию. Сперва «зальём» копию домашнего каталога с рабочей станции на ноутбук (команда выполняется с рабочей станции):

rsync -vr /home/ashep/ rsync://alaptop.ashep/ashep

Обратите внимание на завершающий слеш при указании локального пути (/home/ashep/). Наличие этого слеша говорит rsync о том, что необходимо копировать каталоги, находящиеся внутри каталога /home/ashep/. Если не завершить локальный путь завершающим слешем, то на получателе будет создан каталог /home/ashep/ashep/, что неприемлемо в рассматриваемом случае.

Теперь, представим, что мы какое-то время находились с ноутбуком в деревне у бабушки, плодотворно поработали и хотим синхронизировать изменённые файлы на рабочую станцию. Сделать это можно как с рабочей станции:

rsync -vr -del rsync://alaptop.ashep/ashep /home/ashep

так и с ноутбука:

rsync -vr -del /home/ashep/ rsync://adesktop.ashep

Обратите внимание на ключ -del, который приводит к тому, что файлы, отсутствующие в источнике, будут удалены на получателе, если они там окажутся. И не забывайте о завершающих слешах при указании локального пути источника!




Синхронизация данных. Просто и со вкусом: 12 комментариев

  1. Сама идея здравая, хотя ИМХО реализация не совсем корректная. ;) Я тоже пользуюсь во всю rsync-ом. Но поднимать для этого сервер особого смысла не вижу. Вполне проходит нормально что-то вроде:

    rsync -av --delete /home/me/ host:/home/me/

    Но это конечно же дело вкуса. :) Оба решения вполне нормальны и работоспособны.

    А вот по поводу самих данных... Не знаю как у вас, но у меня на ноуте и на дескотопе окружение настроено по разному. В первую очередь из за размеров экрана. И если синкать полностью весь хоум — будет полная лажа. :( Поэтому я держу все документы и рабочие файлы в отдельной папке, у меня это work и синкаю только ее:

    rsync -av --delete /home/me/work/ host:/home/me/work/

    Ну это так, в качестве мелких поправок к статье. ;)

  2. OllyCat, во всём с вами согласен на все сто! Просто я описал способ, которым пользуюсь сам, а уж вариантов решения этой задачи — тьма. Само-собой, как и всё в UNIX :)

    Спасибо за замечания! Побольше бы таких.

  3. можно синкать весь /home а в rsync задавать исключения для файлов и директорий, котоые не надо синкать

  4. А в Windows достаточно настроить birefcase :)

    С Rsync есть бальшая проблема — он умеет синкать только в одну сторону. Что Вы будете делать, если поменяете что-то на ноуте, сразу по приезду не засинкаете, а когда вспомните, выяснится, что Вы УЖЕ что-то поменяли на desktop.

    Я бы делал так:

    rsync -au /local/path/ rsync://server/remote/path/

    rsync -au rsync://server/remote/path/ /local/path/

    Так Вы перезапишете все, кроме измененных файлов, которые на таргете обновлялись позже. А вот с удаленными файлами, и измененными на обоих машинах файлах ничего не попишешь, только руками резолвить конфликты. Если у вас в основном plain text, можно SVN прикрутить.

    А вообще-то, rsync для поставленной задачи не предназначен (собсна из абзаца выше видно). Конечно для себя любимого, с железной памятью и данными, которые не жалко потерять — пойдет. А вот экспедитору, катающемуся по городам и весям и ведущему учет товара/денег такое решение не пройдет. Далек он от компутеров, приехать бы, да пивка дерябнуть и домой, какой там нафиг синк. Для решения именно такой задачи есть специально разработанная codafs и ее форк afs. Попробуйте.

  5. Rsync можно использовать также для синхронизации библиотек и исполнимых файлов, а еще есть Windows-версия rsync. Правда для использования под виндой есть один большой недостаток — регистрозависимость имен файлов, поэтому rsync считает foo.dll и FOO.DLL разными файлами

  6. maysoft, если я не ошибаюсь, в cygwin можно смонтировать виндовые диски в режиме регистронезависимости. Ну, а дальше — запускать rsync под cygwin. У меня так бэкап виндового десктопа работает. Для удобства насочинял маленький скриптец: dev.ashep.org/scribbles/rsyncb Работает и под Юниксами и под Виндами.

  7. unison удобнее для двуxсторонней синхронизации чем rsync. под Win есть нативные версии unison.exe и нет нужды в cygwin. Понимает unicode в именах файлов. Для передачи использует протокол rsync,

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

Комментарии запрещены.