Просмотр полной версии : Синхронизация файлов по FTP
Извиняюсь, возможно запостил вопрос не в тот раздел.
Стоит задача - настроить автоматическую синхронизацию файлов и папок между двумя серверами. На одном сервере стоит Ubuntu Linux, на втором FreeBSD. Хотелось бы реализовать это напрямую между двумя серверами.
Кто что может посоветовать? Какие есть для этого решения?
можно очень просто это сделать
crond + rsync
Их нужно запускать только с одной стороны? Если изменения будут призводиться только на одном сервере?
php_master
19.03.2009, 21:45
Да, там откуда надо сливать.
Или надо синхронизировать в обе стороны?
не помню за опцию, но думаю в мане все это есть. Если не может в обе стороны синхрить(в чем я сомневаюсь), то можно два скрипта один в одну, другой в другую )))
Rsync - современный способ синхронизации файлов
Итак, для чего нужен RSync?
RSync — был разработан как замена старой команды rcp. С помощью которой производилось копирование файлов между машинами UNIX-систем. RSync очень удобен, так как его алгоритм построен так, что он отслеживает как изменился файл и копирует только необходимые части. Причём для выявления изменений, ему не надо сравнивать два файла. И работает это очень быстро.
Кроме того, очень полезным будет его способность работать через ssh. Что обеспечивает шифрование канала, что очень важно, если вы синхранизируете два сервера в сети интернет. Для уменьшение трафика, rsync так-же умеет сжимать данные, при передаче по сети. Это очень мощная утилита, и надо быть с ней осторожным, с её помощью можно испортить данные.
Мы будем рассматривать rsync как средство синхронизации файлов между серверами, а не как систему раздачи файлов. В первом случае мы используем ssh, а во втором нам необходимо запускать сервер rsync.
Разберём на примере:
rsync -e ssh --progress -lzuogthvr --compress-level=9 \
--delete-after root@:/home/ /home/
или
rsync -e ssh --progress -lzuogthvr --compress-level=9 \
--delete-after /home/ root@:/home/
зависит от того, в какую сторону синхронизируем файлы
Обратите внимание на последний слеш, так как он имеет значение для rsync. Если на конце исходной директории стоит «/», то это означает копирование содержимого директории; отсутствие слеша означает копирование директории и ее содержимого.
Ключи:
* e — заменяет протокол с rsh на ssh
* progress — вывод хода процесса работы на терминал
* l — пересоздание symlinks, это значит, что символические ссылки будут так же переноситься
* z — использовать сжатие
* u — update. Обновление, он будет пропускать файлы которые новей, чем на удалённом сервере
* o — установить владельца конечного файла таким же, как и у исходного
* g — установить группу конечного файла таким же, как и у исходного
* t — передача времени модификации и его обновление на удаленной системе. Этот ключ должен быть установлен для точной синхронизации
* h — вывод информации на терминал в удобном для чтения (human-readable) виде
* v — verbose. Вывод сообщений в терминал.
* r — рекурсивный режим
* n — отладочный режим
* compress-level — уровень сжатия
* delete-after — удалять файлы, которые не были найдены на удалённом сервере, “-after” означает, что удалить их нужно, только после окончания синхранизации. Так-же есть delete-before, delete-during, delete-excluded и просто delete
отладочный режим
Перед тем как запустить скрипт на рабочей машине, опробуйте всё в отладочном режиме, для этого используется ключь “-n”. В этом случае, rsync
не будет менять или удалять файлы, но покажет, весь ход работы.
исключение файлов
RSync может как исключать, так и включать файлы, по заданному шаблону. Например —exclude *.run исключит все файлы с расширением run.
Всё красиво... Но есть одно большое НО. Если файл используется, то каковы вы будут ваши действия? Тоесть если надо синхронизировать два файловых хранилища, которые постоянно используться, и есть открытые файлы. Если файл как минимум не заблокируется, то при одновременно открытом файле у 2- пользователей в итоге получим тот, кто последний сохранит.
Это не вариант. Продолжу свою мысль. При rsync по сети мы имеем фактически два хранилища. Блокировками файла управляет ОС на каждом своем хранилище. Тоесть что бы такая система работала необходимо что бы, когда открыт файл в 1 хранилище, во втором хранилище этот файл был заблокирован, и доступен только для чтения!
Novi4ok написал(а):
Всё красиво... Но есть одно большое НО. Если файл используется, то каковы вы будут ваши действия? Тоесть если надо синхронизировать два файловых хранилища, которые постоянно используться, и есть открытые файлы. Если файл как минимум не заблокируется, то при одновременно открытом файле у 2- пользователей в итоге получим тот, кто последний сохранит.
Это не вариант. Продолжу свою мысль. При rsync по сети мы имеем фактически два хранилища. Блокировками файла управляет ОС на каждом своем хранилище. Тоесть что бы такая система работала необходимо что бы, когда открыт файл в 1 хранилище, во втором хранилище этот файл был заблокирован, и доступен только для чтения!
все будет шоколадно )
в данный момент rsync заберет файл как есть, при сл синхре забере уже новый. Даже если в этот файл постоянно что-то будет писаться. ему все равно. только что сам проверял, чтобы убедиться. Еще могу даже больше сказать, что есть решения которые используют rsync как бекап данных. Что в принцыпе похоже на синхронизацию. Есть еще один момент. К примеру в папке, Которую надо синхронизировать есть три файла, но после первой синхронизации кто-то удалил один файл и уже там два файла. В rsynct есть опция, котороя может при синхронизации удалять файлы и приводить оба каталога к одинаковому состоянию ПРоще всего прочитать ман и побаловаться с натсройками.
т.е. при синхронизации всегда есть потеря информации, т.к. это не репликация данных.
AccessForbidden
20.03.2009, 12:14
Небольшой готовый скрипт для backup. Юзается rsync и cron.
#!/bin/sh
DATE=`date "+%Y-%m-%d"`
LOCAL_PATH="/Users/jimmy/Documents/"
REMOTE_HOST="jimmy@localhost"
REMOTE_PATH="/Users/jimmy/backup/"
EXCLUDE="--exclude=OpenTTD/ --exclude=.DS_Store"
rsync -e "ssh -p 22" -av --delete-after ${EXCLUDE} --backup
--backup-dir="${REMOTE_PATH}/${DATE}/" ${LOCAL_PATH}
${REMOTE_HOST}:${REMOTE_PATH}/current/
ssh работает на ключах - пароля не требуется.
EugeneVC
20.03.2009, 12:47
Народ предложивший rsync - название темы читаем? С каких пор rsync стал работать по ftp. В инете я не разу ни видел. Вы предлагаете обертку над ssh.
Есть только специальные программы для синхронизации по ftp - под Linux к сожалению не видел (.
PHP_Master написал(а):
Да, там откуда надо сливать.
Или надо синхронизировать в обе стороны?
Мне достаточно синхронизировать только в одну сторону.
EugeneVC написал(а):
Есть только специальные программы для синхронизации по ftp - под Linux к сожалению не видел (.
В принципе меня устроит и ssh, но если кто-нибудь подскажет решения для FTP буду благодарен. Я видел много софта для синхронизации по FTP который делает это через третью машину. Но хотелось бы что бы оно само, по расписанию синхронизировалось.
EugeneVC написал(а):
Народ предложивший rsync - название темы читаем? С каких пор rsync стал работать по ftp. В инете я не разу ни видел. Вы предлагаете обертку над ssh.
Есть только специальные программы для синхронизации по ftp - под Linux к сожалению не видел (.
сорри за rsync, но есть другое решение, которое может синхронизировать файлы по ftp, сам не пробовал, но можно потестировать
в кроне прописать
0 15 * * 0-5 lftp -f ///list.x
потом создаем этот файл ///list.x с содержанием
open sftp://:@
mirror -c / /
exit
У меня стоит подобная задача: есть два сайта, на двух разных серверах, к примеру, мойдомен.ком и мойдомен.орг . Принципиально надо сделать их зеркальными, для чего необходимо настроить синхронизацию нескольких папок.Как это будет выглядеть - через фтп, ssh скриптом или прогой под виндовс или линукс- не так важно. Хотелось бы конечно, настроить синхронизацию по расписанию, но, если это сопряжено с большими сложностями можно и вручную. Доступ по ssh есть только к одному сайту, ко второму нет, а мне бы хотелось, чтобы синхронизировалось в обе стороны. Так же есть это все на локальном компе, хотелось бы и туда настроить синхронизацию,все равно, на виндовс,линукс или FreeBSD, хотя это уже второстепенно..Главное, чтобы между серверами работало..
И другой момент, каждый из сайтов имеет свою базу, к одной доступ только через туннель, ко второй напрямую..Хотелось бы и базы синхронизировать, если возможно.
В общем, направьте, в каком направлении двигаться.
Снкс
typus написал(а):
У меня стоит подобная задача: есть два сайта, на двух разных серверах, к примеру, мойдомен.ком и мойдомен.орг . Принципиально надо сделать их зеркальными, для чего необходимо настроить синхронизацию нескольких папок.Как это будет выглядеть - через фтп, ssh скриптом или прогой под виндовс или линукс- не так важно. Хотелось бы конечно, настроить синхронизацию по расписанию, но, если это сопряжено с большими сложностями можно и вручную. Доступ по ssh есть только к одному сайту, ко второму нет, а мне бы хотелось, чтобы синхронизировалось в обе стороны. Так же есть это все на локальном компе, хотелось бы и туда настроить синхронизацию,все равно, на виндовс,линукс или FreeBSD, хотя это уже второстепенно..Главное, чтобы между серверами работало..
И другой момент, каждый из сайтов имеет свою базу, к одной доступ только через туннель, ко второй напрямую..Хотелось бы и базы синхронизировать, если возможно.
В общем, направьте, в каком направлении двигаться.
Снкс
вот посмотри, возможно решит этот вопрос. По описанию делает все, что тебе нужно.
Для просмотра скрытого содержимого необходимо иметь 1 сообщение, у вас 0 сообщений.
symbolz
Спасибо, прога действительно стОящая. Кстати, на руборде есть ссылки на вылеченные версии.
Для просмотра скрытого содержимого необходимо иметь 5 сообщений, у вас 0 сообщений.
Так что успел потестировать. Все в принципе нормально. Я понял, что в данном варианте синхронизация в обе стороны будет проходить через мою локальную машину, на которой будет стоять эта программа. В общем-то, это не проблема, тем более что я бы в принципе хотел, что бы на локальном хосте тож зеркалилось все.Погоняв все это дело практически весь вечер, узнал все, что мне надо, настроил расписание, вижу, что, в принципе,все работает в фоновом режиме и работе не мешает...
Но...Синхронизация между рабочими серверами через машину под виндой таит в себе как минимум одну замеченную неприятность: атрибуты файлов не сохраняются.
Т.е. у меня будут синхрониться в основном рисунки - фотографии, как правило, из папок, где они находятся, файлы должны быть с 777...
Но в любом случае спасибо еще раз, прога класс, если не найду еще более изящного и корректного решения, возьму на вооружение..
typus написал(а):
Но...Синхронизация между рабочими серверами через машину под виндой таит в себе как минимум одну замеченную неприятность: атрибуты файлов не сохраняются.
согласен что не сильно приятно.
Вот хотел еще уточнить файловая система на рабочей станции NTFS?
да, ntfs.
Щас хочу разобраться, возможен ли в принципе ssh доступ ко второму серверу.
Если да, то тогда буду буду пытаться курить предложенный тобой выше RSync - по всему видать, в принципе для синзронизации между юникс-серверами лучшего решения и искать не надо. А свою локальную копию как раз буду время от времени с помощью batchsync править, и никаких забот...
Вот если не дадут на этом втором сервере ssh доступ, то тогда чуть сложнее..Ну да ладно, будем думать.
typus написал(а):
да, ntfs.
Щас хочу разобраться, возможен ли в принципе ssh доступ ко второму серверу.
Если да, то тогда буду буду пытаться курить предложенный тобой выше RSync - по всему видать, в принципе для синзронизации между юникс-серверами лучшего решения и искать не надо. А свою локальную копию как раз буду время от времени с помощью batchsync править, и никаких забот...
Вот если не дадут на этом втором сервере ssh доступ, то тогда чуть сложнее..Ну да ладно, будем думать.
задача очень интересная
Можно еще примонтировать ftp как каталог и уже с ним делать синхронизацию rsync, но для этого таки нужен ssh доступ. Но нужен только на одном сервере, где будешь монтировать ftp.
curlftps в помощь )
если есть рутовые права на одном сервер, то проблем больше не будет )
только что сам проверял и прекрасно работает
symbolz написал(а):
задача очень интересная
Можно еще примонтировать ftp как каталог и уже с ним делать синхронизацию rsync, но для этого таки нужен ssh доступ. Но нужен только на одном сервере, где будешь монтировать ftp.
curlftps в помощь )
если есть рутовые права на одном сервер, то проблем больше не будет )
только что сам проверял и прекрасно работает
На одном сервере как раз есть ssh-доступ, вот только прав рутовых там быть не может - это ж хостинг чужой, кто мне их даст? Я б не отказался
Рутовые права могу только сам себе на одной из своих машин под линуксом дать: если я правильно понял, в этом случае я могу в принципе настроить синзронизацию, но тут тоже она будет выполняться через посредника.
Хотя и есть большой плюс - потренироваться с участием локальной машины, дабы научиться в будущем решать подобные задачи уже абсолютно без всякого гемороя.
AccessForbidden
27.03.2009, 14:20
Необязателен рут.
Есть такая штука sshfs. Монтируй на одном сервере в папку файловую систему другого сервера. И работай с файлами "тупо" - То есть копируй и вставляй.
Написать надо 2 скрипта - 1ый который будет при загрузке ОС монтировать фс, 2ой - будет выполнять действия по синхронизации раз в какое то время.
AccessForbidden написал(а):
Необязателен рут.
Есть такая штука sshfs. Монтируй на одном сервере в папку файловую систему другого сервера. И работай с файлами "тупо" - То есть копируй и вставляй.
Написать надо 2 скрипта - 1ый который будет при загрузке ОС монтировать фс, 2ой - будет выполнять действия по синхронизации раз в какое то время.
И все таки еще раз:
сейчас только нашел время для изучения ssh в целом и sshfs в частности- если я правильно все понял, то для этого все равно нужно два ssh - на обеих серверах, ну или живой доступ к файловой системе одного сервера и ssh - доступ на другом - щас тренировался, монтировал удаленные каталоги в своей локальной машине...в принципе, все просто, ничего сложного, но ко второму то серваку ssh нет у меня...только фтп...спросил у хостера - ответ однозначный, "кайне шанс, ни в одном из наших тарифов"...
Продолжу тему.
Решил я потренироваться на юних-системах делать синхронизацию, а поскольку ответа на свои вопросы пока не получил, поставил у себя на VMWare FreeBSD, а там уже стоит зеркало нужного мне сайта. Настроил доступ из внешки,привязал DynDNS, все нормально, сайт виден извне...Таким образом, хочу делать синхронизацию - вначале между сервером с ssh-доступом и моей локальной фряхой, а затем между последней и сервером без ssh-доступа, ну и также в обратном порядке..Понимаю, что это не совсем красиво, ну да заради опыта...
Вот столкнулся с такой проблемой:
установил sshfs и curlftpfs- но примонтировать ничего не могу, после ввода пароля пишет:
fuse: failed to open fuse deuice: no such file or directory
хотя с папками все нормально. И если я точно с такими же путями монтирую это все в убунту, все идет без проблем.А тут - хоть ты тресни...Что то связано с fuse? fuse установлен, монтирую под рутом - что еще нужно сделать
С fuse вопрос решил, модуль был не загружен.
Я думал, что для запуска fuse достаточно выполнить /usr/local/etc/rc.d/fusefs start
поскольку после этого сообщений об ошибке не было.
Я как то совсем упустил, что
необходимо разрешить запуск fuse, добавив в /etc/rc.conf, такую строку:
fusefs_enable="YES"
Теперь все идет без проблем...добавил модуль в автостарт..
Остальные вопросы пока остаются..
Но зато теперь все дороги открыты, начинаем осваивать Rsync
Появились вопросы по rsync, поэтому продолжу, с вашего позволения.
Хотел я было всю эту свою систему связать воедино, таким образом:
итак, на одном сайте есть ssh, на втором только ftp...как выяснилось, и rsync-а там нет. Ну ладно, на локальной своей машине установил rsync, изучил кучу инфы и начал тестить. думал, свяжусь с одним сайтом по ssh, либо примонтирую с помощью sshfs, с другим - примонтировав с помощью curlftpfs..таким образом, все что мне нужно будет у меня как бы в одной системе, ну и буду их синхронизировать постепенно..
Но не все так просто оказалось.
В любом случае, синхронизация при таком способе подключения к удаленным серверам выполняется с ошибками, как с sshfs, так и с curlftpfs
Ошибки в основном говорят о запрете доступа, не тех правах, а иногда и о разрыве коннекта. Например:
rsync: rename "/media/sshfs/data/111/222/.Codir_1251.txt.qZUHFn" -> "Codir_1251.txt": Operation not permitted (1)
sent 293 bytes received 31 bytes 72.00 bytes/sec
total size is 542280 speedup is 1673.70
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1040) [sender=3.0.5]
или
rsync: chown "/media/sshfs/data/111/222/." failed: Permission denied (13)
rsync: chown "/media/sshfs/data/111/222/10f89rp.jpg" failed: Permission denied (13)
rsync: chown "/media/sshfs/data/111/222/2nltymt.jpg" failed: Permission denied (13)
rsync: chown "/media/sshfs/data/111/222/3467580103_e25a8a1016_o.jpg" failed: Permission denied (13)
rsync: chown "/media/sshfs/data/111/222/8mart.gif" failed: Permission denied (13)
rsync: chown "/media/sshfs/data/111/222/Addons.JPG" failed: Permission denied (13)
и еще
rsync: recv_generator: failed to stat "/media/ftp/data/111/222/8mart.gif": Socket is not connected (57)
rsync: recv_generator: failed to stat "/media/ftp/data/111/222/Addons.JPG": Socket is not connected (57)
rsync: recv_generator: failed to stat "/media/ftp/data/111/222/Codir_1251.txt": Socket is not connected (57)
Ну вот, самое интересное, что если это все делать напрямую, без предварительного монтирования с sshfs или curlftpfs все выполняется без ошибок..Думал, может какие аргументы нужны хитрые, но я в случае как прямом так и через костыль прописываю одинаковые опции...
Собственно, меня бы устроило прямое копирование через ssh, если бы на втором сервере была бы такая возможность.. да и потом, мне показалась возможность сделать все через curlftpfs уж очень заманчивым: можно монтировать автоматом без ввода пароля - в случае с ssh как я понял, такое возможно только после авторизации ключей, а авторизировать их мне надо на удаленном сервере...а у меня там прав нету..
В общем,чешу репу, может вы что подскажете...
Antiment
17.05.2009, 03:31
ОМГ )) Зачем столько хлопот ????
Ставь пакет ssl на одном и на втором,в нем уже есть встроенный sftp сервер и клиент и пользуйся.
Принцип работы(обмен файлами и редактирование) будет как на тотале.
Antiment написал(а):
ОМГ )) Зачем столько хлопот ????
Ставь пакет ssl на одном и на втором,в нем уже есть встроенный sftp сервер и клиент и пользуйся.
Принцип работы(обмен файлами и редактирование) будет как на тотале.
хорошо бы как на тотале , но в никсах что то достойного аналога не видел , но ты имеешь в виду наверное в плане хотяб основной функциональности тотала?, а скорей миднайта и то, только в рамках текущей темы(в большие удобства и схожесть что то не верится )
Antiment
20.05.2009, 00:24
Akme написал(а):
хорошо бы как на тотале , но в никсах что то достойного аналога не видел , но ты имеешь в виду наверное в плане хотяб основной функциональности тотала?, а скорей миднайта и то, только в рамках текущей темы(в большие удобства и схожесть что то не верится )
Я сам лично пользуюсь им.Но правда я работаю в режиме win - *nix ,использую для этого winscp (для винды).
php_master
20.05.2009, 00:28
Если есть на удалённой машине SSH, то как уже писали самый удобный способ это sshfs и работай с ней как угодно.
PHP_Master написал(а):
Если есть на удалённой машине SSH, то как уже писали самый удобный способ это sshfs и работай с ней как угодно.
Ну я тоже уже много раз рассказывал, что на одном сервере есть ssh, а на втором только ftp - в принципе, я было думал, что связка sshfs+ curlftpfs на моей локальной машине как раз решит мои проблемы - но не тут то было.
При копировании таким способом с одной подмонтированной машины на другую вечно какие нибудь ошибки...Причем,я уже не знаю, из -за чего они, эти ошибки - я грешу щас на того хостера, где нет ssh, поскольку ошибки всегда при копировании ТУДА -с sshfs на curlftpfs.И причем разные: раньше были ошибки, о которых писал выше, а сейчас вот такие:
rsync: failed:......... Operation not supported (95)
При этом ОТТУДА - с curlftpfs на sshfs все копируется..
Так что я пока страхуюсь другими методами, поскольку уже мозги вывихнул, переворачивая интернет в поисках решения подобным моим ошибкам...
Просьба к тем, у кого есть возможность потестить такую связку, как у меня - sshfs+ curlftpfs, и у кого все работает, подскажите, какие агрументы используете, может в этом дело, а то я уже запарился...
Если кому то интересно, нашел одно решение, может быть полезно в случаях, подобным моему - когда необходимо синхронизировать файлы между серверами, и при этом к одному из серверов есть доступ только по FTP.
FTPSync.pl (https://href.li/?http://ftpsync.sourceforge.net/) - на перле,
очень простой скрипт с точки зрения установки и запуска - просто распаковать куда то и запустить из текущей директории ftpsync.pl.
Например,копирование с локального на удаленный хост -
PHP:
perl ftpsync
.
pl
-
n
/
path
/
tolocal
/
folder
/
ftp
:
//ftp_user:ftp_pass@ftp_host/path/toremote/folder/
-n - не удалять файлы на приемнике, если их нет в источнике
Остальные опции можно посмотреть в сети или вызвать perl ftpsync.pl без агрументов, получим помощь..
Удобно лично для меня то, что я залил папку со скриптом на тот свой хостинг, на котором у меня есть ssh, написал там короткий шелл-скрипт, поставил его в крон и забыл про проблему синхронизации файлов с тем моим хостингом, на котором нет ssh...
зы: конечно работает значительно медленнее, нежели rsync, но покуда мне не нужно синхронить ежеминутно, все меня устраивает.
Veditos написал(а):
Мне достаточно синхронизировать только в одну сторону.
В принципе меня устроит и ssh, но если кто-нибудь подскажет решения для FTP буду благодарен. Я видел много софта для синхронизации по FTP который делает это через третью машину. Но хотелось бы что бы оно само, по расписанию синхронизировалось.
А если просто через wget в кроне? Единственное, так это на зеркале добавятся файлы .listing для каждой директории...
Выглядит это примерно так:
Код:
.sh файл на зеркале, который вызывается из крона
cd /целевая папка
wget -m -c -o /var/log/ftpsyncronize.log -nH ftp://login:pass@myhost.com
Ключи для вгета по вкусу и по потребностям...
у меня вроде работает:bn:
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot