Rsync примеры. Rsync — Примеры синхронизации. Знакомимся с rsync

Распределенная файловая система DFS (Distributed File System) – это технология, обеспечивающая возможности упрощения доступа к общим файловым ресурсам и глобальной репликации данных. Благодаря DFS распределённые по различным серверам общие ресурсы (каталоги и файлы) можно объединить в единую логическую UNC структуру, которая для пользователя выглядит, как единый сетевой ресурс. Даже при изменении физического местоположения целевой папки, это не влияет на доступ пользователя к ней.

Реализация служб DFS в Windows Server 2012 отличается от предыдущих версиях Windows. В первую очередь отметим, что технологии DFS в Windows Server 2012 реализованы в виде двух отдельных, независимых друг от друга служб — DFS Namespaces и DFS Replication , включенных в роль файлового сервера (File and Storage Services ).

  • DFS Namespaces (DFSN или DFS-N) – пространство имен DFS. Позволяет объединять в единую логическую структуру общие папки, расположенные на различных серверах организации. Каждое пространство имен для пользователя выглядит как единая сетевая папка с подкаталогами. Реальная структура данного пространства имен DFS является скрытой от пользователя, и может включать в себя различные сетевые папки, расположенные на различных серверах и сайтах.
  • DFS Replication (DFSR или DFS-R) — служба DFS репликации. Позволяет организовать эффективную службу репликации каталогов (в том числе включенных в пространство имен DFS) между различными серверами и сайтами AD. Данная служба для репликации использует специальный алгоритм удаленного разностного сжатия – RDC- remote differential compression. Благодаря RDC, которая отслеживает изменения в файлах, при репликации копируются не файлы целиком (как в случае с FRS репликацией), а только их блочные изменения.

Установка служб DFS в Windows Server 2012

Установить службы DFS можно с помощью консоли Server Manager или же при помощи Windows PowerShell.

Как мы уже говорили, службы DFS являются элементами роли Files and Storage Services :

Но проще и быстрее установить все DFS службы и консоль управления DFS с помощью PowerShell:

Install-WindowsFeature FS-DFS-Namespace, FS-DFS-Replication, RSAT-DFS-Mgmt-Con

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

Где FS-DFS-Namespace – служба DFS Namespaces

FS-DFS-Replication – служба репликации DFS Replication

Настройка пространства имен DFS в Windows Server 2012

Перейдем к описанию процедуры настройки пространство имен DFS, для чего необходимо открыть панель управления DFS Management tool .

Создадим новое пространство имен (New Namespace ).

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

Затем следует указать имя создаваемого пространства имен DFS и перейти в расширенные настройки (Edit Settings).

Здесь следует указать имя пространства имен DFS и права доступа к данному каталогу. Обычно рекомендуется указать, что доступ к сетевой папке разрешен Всем (Everyone), в этом случае права доступа проверяются на уровне файловой системы NTFS.

Далее мастер предложит указать тип создаваемого пространства имен. Это может быть Domain-based namespace (доменное пространство имен) или Stand-alone namespace (отдельное пространство имен). Domain-based namespace обладает ряд преимуществ, но для его работы нужен, собственно домен Active Directory и права администратора домена (либо наличие делегированных прав на создание доменных пространств имен DFS).

После окончания работы мастера в ветке Namespaces консоли управления DFS появится созданное нами новое пространство имен DFS. Чтобы пользователи при доступе к DFS каталогам видели только те каталоги, к которым у них имеется доступ, включим для данного пространства DFSAccess-Based Enumeration (подробнее о данной технологии в статье ). Для этого откройте окно свойств созданного пространства имен.

И на вкладке Advanced включите опцию Enable access-based enumeration for this namespace .

Чтобы посмотреть содержимое нового пространства DFS, просто наберите в окне проводника UNC путь: \\имя_домена_или_сервера\DFS

Добавление дополнительного DFS сервера

В доменное пространство имен DFS можно добавить дополнительный сервер (пункт меню Add Namespace Server), который его будет поддерживать. Делается это для увеличения доступности пространства имен DFS и позволяет разместить сервер пространства имен в том же сайте, в котором находится пользователи.

Примечание . Отдельно стоящие пространства имен DFS поддерживают только один сервер.

Добавление нового каталога в существующее пространство имен DFS

Теперь нужно добавить новый сетевой каталог в иерархию созданного нами пространства имен DFS. Нажмите кнопку Add Folder Target .

Укажите наименование каталога в DFS пространстве и его реальное местоположение на существующем файловом сервере (Folder targets ).

Настройка DFS-репликации на Windows Server 2012

Технология репликации DFS-R предназначена для организации отказоустойчивости пространства имен DFS и балансировки нагрузки между серверами. DFS-R автоматически балансирует трафик между репликами в зависимости от их загрузки и в случае недоступности одного из серверов перенаправляет клиентов на другой сервер-реплику. Но прежде, чем говорить о DFS репликации и ее настройке в Windows Server 2012перечислим основные системные требования и ограничения:

  • Служба DFS Replication должна быть установлена на всех серверах, которые планируется включить в группу репликации
  • Все сервера в группе репликации должны находиться в одном лесу AD
  • Уровень леса Active Directory должен быть как минимум Windows Server 2003 R2 (при установке первого домена контроллера на Windows Server 2012 ).
  • Функциональный уровень домена — как минимум Windows Server 2008
  • Необходимо убедиться, что антивирусное обеспечение на файловых серверах совместимо с технологией репликации DFS
  • Реплицируемые каталоги должны располагаться на томах с файловой системой NTFS (файловые системы и FAT не поддерживаются). Также не поддерживается репликация данных, хранящихся на on Cluster Shared Volumes

В консоли DFS Managment выберите нужный вам DFS Namespace и щелкните ПКМ по каталогу, для которого необходимо создать реплику и выберите пункт Add Folder Target .

И укажите полный (UNC) путь к сетевому каталогу другого сервера, в котором и будет храниться реплика.

На вопрос хотите ли вы создать группу репликации отвечаем Yes.

Запускается мастер настройки репликации. Проверяем имя группы репликации и каталог.

Указываем первичный (Primary ) сервер. Именно этот сервер будет источником данных при инициальной (первичной) репликации.

Затем выбираем тип топологии (соединения) между членами группы репликации. В нашем примере выбираем Full Mesh (все со всеми).

И, наконец, указываем расписание репликации и параметры bandwidth throttling – ограничение доступной для репликации полосы пропускания.

После окончания работы мастера, запуститься первоначальная синхронизация.

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

rsync использует соглашение о длинных именах параметров GNU. Многие из параметров командной строки имеют два варианта: один - короткий, а другой - длинный. Ниже это отражено в разделении запятой двух вариантов. Некоторые параметры имеют только длинный вариант. Знак "=" для параметров с дополнительным значением необязателен и может быть заменен на пробел.

    H, --help Печатает короткую подсказку, описывающую доступные параметры rsync

    Version Печатает номер версии rsync и завершается

    V, --verbose Этот параметр увеличивает сумму подробностей, которые выводятся в течение передачи. По умолчанию, rsync работает молча. Один -v будет иметь следствием выдачу списка переданных файлов и короткий итог в конце. Два -v раскрывают детали о пропущенных файлах и выдают несколько больше информации в завершение. Большее число может понадобится только при отладке rsync.

    Q, --quiet Уменьшает сумму подробностей о передаче, преимущественно, сообщения от удаленного сервера. Этот параметр полезен при вызове из cron.

    I, --ignore-times Обычно rsync пропускает файлы, чей размер и время модификации идентичны. Этот параметр отключает такое поведение "быстрой проверки".

    Size-only Обычно rsync пропускает файлы, чей размер и время модификации идентичны. С --size-only файлы будут пропускаться, если их размер одинаков, независимо от времени модификации. Это полезно при использовании rsync сразу после работы другой зеркалирующей системы, которая не сохранила точно времена.

    Modify-window При сравнение двух меток времени rsync рассматривает эти метки равными, если они расходятся в пределах значения modify_window. Обычно это значение ноль, но Вы можете найти полезным установку его в большую величину в некоторых случаях. На практике, при передаче на файловую систему Windows FAT, которая не может представлять время с точностью до секунды, --modify_window=1 весьма полезна.

    C, --checksum Принуждает на передающей стороне подсчитывать контрольные суммы всех файлов, используя 128-битный алгоритм MD4 перед передачей. Контрольная сумма затем проверяется на приемной стороне для того, чтобы пропускать передачи уже существующих файлов с одинаковыми размером и контрольной суммой. Этот параметр может приводить к некоторому замедлению.

Однако заметьте, что -a не сохраняет жесткие ссылки, потому что поиск многосвязных файлов дорог. Вам придется отдельно указывать -H.

    R, --relative Использовать относительные пути. Это значит, что посылаются полные пути, указанные в командной строке, а не последние части имен файлов. На практике это полезно, когда Вам нужно послать несколько различных каталогов за раз. Например, если указать команду:

rsync foo/bar/foo.c remote:/tmp/

то она создаст файл foo.c в /tmp на удаленной машине. Если вместо этого указать

Rsync -R foo/bar/foo.c remote:/tmp/

то файл создастся в /tmp/foo/bar/foo.c на удаленной машине - полный путь сохранится.

Выключает параметр --relative. Это нужно только если Вы хотите использовать параметр --files-from без подразумеваемого им поведения с включенным параметром --relative.

    No-implied-dirs

В комбинации с --relative все затрагиваемые каталоги в каждом пути явно не копируются как часть процесса передачи. Это делает передачу более оптимальной и также позволяет иметь непарные (см. пример ниже) символьные ссылки в подразумеваемых передачей путях. Например, если передается файл "/path/foo/file" с параметром -R, то по умолчанию rsync следит, чтобы "/path" и "/path/foo" в точности соответствовали каталогам/ссылкам на приемной стороне. Параметр --no-implied-dirs позволяет игнорировать несоответствие, когда "/path" - реальный каталог на одной стороне и символьная ссылка на другой. rsync не пытается с этим параметром что-либо менять в этом случае.

    B, --backup С этим параметром существовавшие до передачи файлы на приемной стороне переименовываются, как только соответствующий файл передан или удален. Вы можете контролировать, куда перемещаются файлы и какой суффикс (если нужно) добавляется к имени, используя параметры --backup-dir и --suffix.

    Backup-dir=DIR В комбинации с --backup указывает каталог, куда сохранять резервные копии. Это весьма полезно для инкрементального резервирования. Вы можете дополнительно указать суффикс с помощью --suffix (иначе резервные копии файлов будут сохранять свои исходные имена).

    Suffix=SUFFIX Этот параметр позволяет указать суффикс, отличный от суффикса по умолчанию, для резервных копий файлов при установленном --backup (-b). По умолчанию этот суффикс установлен в ~ без установки --backup-dir, установка которого сбрасывает этот суффикс в пустую строку.

    U, --update Указывает пропускать любые файлы, уже существующие на приемной стороне с более поздней датой, чем у исходных файлов.

    L, --copy-links Если обнаружена символьная ссылка, то на приемную сторону копируется файл, на который она указывает, а не такая же символьная ссылка.

    Copy-unsafe-links Копирует все объекты за пределами исходного дерева каталогов, на которые ссылаются символьные ссылки. Абсолютные символьные ссылки, а также, при выставленном --relative, любые символьные ссылки в пределах исходного дерева каталогов, рассматриваются как обычные файлы.

    Safe-links Указывает игнорировать любую символьную ссылку, которая относится к объекту за пределами конечного дерева каталогов. Все абсолютные ссылки также пропускаются. Использование этого параметра в комбинации с --relative может дать неожиданные результаты.

    H, --hard-links Указывает пересоздать жесткие ссылки на конечной стороне в соответствии с тем, что имеется на исходной. Без этого параметра жесткие ссылки обрабатываются как обычные файлы.

Обратите внимание, что rsync может обнаруживать жесткие ссылки, только если обе части ссылки попадают в список предназначенных к передаче файлов. С этим параметром передача может быть довольно-таки медленной, так что пользуйтесь им только при необходимости.

    W, --whole-file Этот параметр отключает дифференциальный алгоритм rsync"а и с ним весь файл передается как есть, целиком. Передача может происходить быстрее с этим параметром, если полоса пропускания между исходной и конечной машинами шире, чем полоса пропускания доступа к диску (особенно, если "диск" в действительности сетевая файловая система). Этот параметр включен по умолчанию, если и исходная, и конечная цели находятся локально.

    No-whole-file Выключает действие параметра --whole-file, если последний включен по умолчанию.

    P, --perms Копирует все права на приемную сторону точь в точь с оригиналом.

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

    O, --owner Копирует атрибуты владельца на приемную сторону в точности с оригиналом. На большинстве систем только супер-пользователь имеет право устанавливать владельца файла. Нужно заметить, что если удаленный демон действует в chroot-окружении, то подразумевается наличие параметра --numeric-ids, потому что на удаленной стороне в этом случае нет доступа к именам пользователей в /etc/passwd.

    G, --group Копирует атрибуты группы на приемную сторону в точности с оригиналом. Если удаленная сторона не действует из-под супер-пользователя, то сохранятся только те значения групп, членом которых является пользователь приемной стороны (имеет значение имя группы, а не ее id).

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

    T, --times Указывает передавать время модификации файлов и обновлять им соответствующий атрибут на приемной стороне. Обратите внимание, что если этот параметр не установлен, то становится неэффективной оптимизация передачи по исключению не изменявшихся по времени файлов; другими словами, пропуск -t или -a будет означать, что следующая передача будет осуществляться с параметром -I, для всех файлов будут сравниваться контрольные суммы, а в журнале появятся соответствующие сообщения о них, даже если они не изменялись.

    N, --dry-run Указывает не осуществлять никаких передач, а только сообщать о тех действиях, которые могли бы произойти.

    S, --sparse Пытаться эффективнее обработать фрагментацию файлов, чтобы сэкономить пространство на приемной стороне.

ЗАМЕЧАНИЕ: Не используйте этот параметр, если в точке назначения имеется файловая система "tmpfs" Solaris. Не представляется возможным правильно управлять поиском среди "дырок" (null regions), что заканчивается повреждением файлов.

    Existing Указывает не создавать никаких новых файлов - только обновить те, которые уже существуют на приемной стороне.

    Ignore-existing Указывает не обновлять файлы, которые уже существуют на приемной стороне.

    Max-delete=NUM Не удалять больше, чем NUM файлов и каталогов. Это полезно при зеркалировании очень массивных деревьев каталогов для предохранения от неприятностей.

    Delete Удалять любые файлы на приемной стороне, которых нет на передающей. Файлы, исключенные из передачи, исключаются также и из процесса удаления, если не указана --delete-excluded.

Этот параметр не оказывает никакого влияния, если не включено рекурсивное копирование каталогов. Этот параметр может быть опасным при неправильном использовании! Очень хорошим правилом может стать использование сначала холостого выполнения rsync (-n) для просмотра того, что за файлы могут удалиться и нет ли среди них важных. При возникновении каких-либо ошибок ввода-вывода на передающей стороне удаление любых файлов на приемной автоматически отключается. Это предотвращает от массивного удаления файлов на приемной стороне из-за временных ошибок файловой системы (например, NFS) на передающей. Это поведение можно отключить параметром --ignore-errors.

    Delete-excluded В дополнение к файлам, удаляемым на приемной стороне из-за отсутствия их на передающей, указывает удалять также любые исключенные параметром --exclude файлы на приемной стороне. Подразумевается наличие параметра --delete.

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

    Ignore-errors При удалении (--delete) форсирует процесс и игнорирует любые ошибки, даже ошибки ввода-вывода.

    Force Удалять каталоги при замене их не-каталогами, даже если они не пусты. Уместен только без

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

    B, --block-size=BLOCKSIZE Регулирует размер блока, используемый rsync-алгоритмом. См. техническое описание на предмет деталей.

    E, --rsh=COMMAND Позволяет выбрать альтернативную программу удаленной оболочки для осуществления соединения между удаленной и локальной копиями rsync. Обычно rsync сконфигурирован для использования ssh по умолчанию, но Вы можете предпочесть использовать rsh в локальной сети.

Если этот параметр используется с указанием пути вида host::module/path, то программа удаленной оболочки COMMAND будет использована для запуска rsync-сервера на удаленной стороне, а все данные будут передаваться через соединение удаленной оболочки, а не напрямую через соединение с rsync-сервером на "том" конце. См. раздел "ПОДКЛЮЧЕНИЕ К RSYNC-СЕРВЕРУ ЧЕРЕЗ УДАЛЕННУЮ ОБОЛОЧКУ". Аргументы командной строки для COMMAND разрешено указывать в форме, при которой COMMAND представляется для rsync в виде одного аргумента. Например:

    E "ssh -p 2234" (Заметьте, что ssh-пользователи могут альтернативно настраивать специфичные для своего окружения параметры подключения в своих.ssh/config файлах.)

Вы также можете выбирать программу удаленной оболочки через переменную окружения RSYNC_RSH, которая принимает тот же диапазон значений, что и -e. См. также --blocking-io, на которую влияет установка параметра -e.

    C, --cvs-exclude Этим параметром Вы исключаете широкий диапазон файлов, которые Вы не хотите передавать между системами. При этом используется тот же алгоритм, что использует CVS для определения игнорируемых файлов.

Список исключений изначально включает в себя:

RCS/ SCCS/ CVS/ .svn/ CVS.adm RCSLOG cvslog.* tags TAGS .make.state .nse_depinfo *~ #* .#* ,* *.old *.bak *.BAK *.orig *.rej .del-* *.a *.o *.obj *.so *.Z *.elc *.ln core затем файлы, перечисленные в $HOME/.cvsignore , добавляются к первоначальному списку, а также любые, перечисленные в переменной окружения CVSIGNORE (разделенные пробелами). В заключение, любой файл пропускается, если в том же каталоге есть файл.cvsignore, в котором есть соответствующий файлу шаблон. См. руководство по cvs(1) для дальнейшей информации. * --exclude=PATTERN Позволяет выборочно исключать определенные файлы из процесса передачи. Это наиболее полезно при рекурсивной передаче.

Вы можете использовать так много --exclude, как Вам заблагорассудится для построения произвольного списка исключаемых файлов. См. секцию "ШАБЛОНЫ ИСКЛЮЧЕНИЯ" за информацией о синтаксисе для этого параметра.

    Exclude-file=FILE Подобен параметру --exclude, но в отличие от него использует шаблоны исключаемых фалов, перечисленные в файле FILE. Пустые строки вместе со строками, начинающимися с ";" или "#", игнорируются. Если FILE указан как -, то список шаблонов читается со стандартного ввода.

    Include=PATTERN Указывает шаблоны для имен тех файлов, которые нельзя исключать из процесса. Полезен тем, что позволяет Вам строить довольно сложные правила включения/исключения.

См. секцию "ШАБЛОНЫ ИСКЛЮЧЕНИЯ" за информацией о синтаксисе для этого параметра.

    Include-from=FILE Указывает брать список обязательно включаемых в передачу файлов из файла FILE. Если FILE указан как -, то список шаблонов читается со стандартного ввода.

    Files-from=FILE Позволяет задать точный список файлов для передачи (который будет прочитан из указанного FILE или из стандартного ввода, если указан -). Это также меняет поведение rsync по умолчанию в целях облегчения процесса передачи заданных файлов и каталогов. Например, по умолчанию включается использование опции --relative (для отключения этого используйте --no-relative), на принимающей стороне создаются все указанные в списке каталоги (а не пропускаются безгласно, как если бы не использовалась опция -r), а поведение -a (--archive) не подразумевает наличие -r (--recursive) - его, при необходимости, нужно указывать явно.

Все имена файлов, прочитанные из FILE, считаются относительными к исходному каталогу -- первые слэши убираются и не допускаются ссылки "..", указывающие выше по дереву исходного каталога. Для примера рассмотрим:

    rsync -a --files-from=/tmp/foo /usr remote:/backup

Если /tmp/foo содержит строку bin (или даже "/bin"), каталог /usr/bin будет создан как /backup/bin на удаленной машине (но содержимое /usr/bin не должно передаваться, кроме тех случаев, когда объекты явно указаны в /tmp/foo, или в случае указания параметра -r). Также учитывайте, что эффект от --relative (включенный по умолчанию) касается копирования путей, прочитанных из файла, -- он не принуждает копировать полностью указанный исходный путь (/usr в примере). В дополнение, --files-from файл может быть прочитан с удаленной машины, а не локально, если указать перед именем файла "host:" (это должно соответствовать одному из концов передачи). Для краткости, можно указывать только префикс ":" для обозначения удаленного участника копирования. Например: rsync -a --files-from=:/path/file-list src:/ /tmp/copy эта команда должна скопировать все файлы указанные в файле /path/file-list, который расположен на удаленной машине "src".

    0, --from0 Говорит rsync, что имена файлов, читаемые извне, заканчиваются символом "\0", не NL, CR или CR+LF. Это касается параметров --exclude-from, --include-from, and --files-from.

    T, --temp-dir=DIR

Инструктирует использовать DIR как каталог временных копий передаваемых файлов на принимающей стороне. По умолчанию временные файлы создаются в каталоге назначения.

    Compare-dest=DIR Инструктирует использовать DIR на машине назначения как каталог, относительно содержимого которого осуществляется сравнение во время процесса передачи при условии отсутствия файлов в каталоге назначения. Это полезно для осуществления передачи в новое место, оставляя существующие файлы неприкосновенными, а затем перенося и очищая, когда все файлы были переданы (например, при перемещении каталогов в новое место и удалении старого, хотя при этом пропускаются не изменявшиеся файлы; см. также --link-dest).

Прим. переводчика: Существование этого параметра обусловлено необходимостью обновлять, например, дерево с взаимозависимыми файлами. В этом случае нежелательно осуществлять копирование на пофайловой основе. Параметр --compare-dest позволяет указывать временный каталог назначения, куда и копируются передаваемые файлы. По окончании процесса передачи rsync переименовывает оригинальное дерево назначения, затем переименовывает временный каталог DIR в оригинальный и, наконец, удаляет переименованный на первом шаге оригинальный каталог со "старыми" файлами. Этот параметр повышает полезность --partial, потому что частично переданные файлы будут оставаться в новом временном каталоге до тех пор, пока не окажутся целиком на месте. Если DIR задан как относительный путь, то он соотносится к каталогу назначения.

    Link-dest=DIR Ведет себя также, как и --compare-dest, но также создает жесткие ссылки в DIR на не изменявшиеся файлы в каталоге назначения. Файлы с измененными правами и владением не подвергаются этому. Как и в случае --compare-dest, если DIR задается относительным именем, то и действия осуществляются относительно каталога назначения.

    Z, --compress С этим параметром rsync сжимает все передаваемые данные файлов. Это полезно на медленных линиях. Метод сжатия, используемый при этом, тот же, что реализует gzip.

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

    Numeric-ids Вместо имен групп и пользователей посылаются их числовые id и ставятся в соответствие друг другу на обоих концах.

По умолчанию rsync использует имена групп и пользователей для определения владельца файлов. Специальные uid 0 и gid 0 никогда не отображаются через имена пользователей/групп, даже если не указана --numeric-ids. Если исходная система работает в ограниченном chroot-окружении или если пользователь или группа не существуют на приемной стороне, то используются исходные числовые id.

    Timeout=TIMEOUT Позволяет устанавливать максимальное время ожидания ввода-вывода в секундах. Если за указанный период ничего не передано, то работа rsync завершается. По умолчанию 0, что означает без ожидания.

    Daemon Запускает rsync как демон. Демон доступен для клиентов через синтаксис host::module или rsync:/\/host/module. Если стандартным вводом является сокет, то rsync полагает условием запуск от inetd, иначе он отключается от текущего терминала и становится фоновым процессом-демоном. Демон читает конфигурационный файл (rsyncd.conf) на каждое соединение от клиентов и соответственно отвечает на их запросы.

    No-detach При запуске демоном этот параметр инструктирует rsync не отключаться от терминала и стать фоновым процессом. Он требуется при запуске службой под Cygwin, и также может быть полезен, если rsync находится под наблюдением таких программ как daemontools или AIX"s System Resource Controller. --no-detach также рекомендуется к применению при запуске rsync под отладчиком. Этот параметр не имеет никакого эффекта при запуске от inetd или sshd.

    Address По умолчанию rsync использует групповой адрес 0.0.0.0, когда запускается как демон с --daemon или при подключениях к rsync-серверу. --address позволяет Вам указать точный IP-адрес (или хост-имя) для этого. Это делает возможным виртуальный хостинг в сочетании с --config.

    Config=FILE Указывает альтернативный файл конфигурации. Это имеет значение только если указан --daemon. По умолчанию /etc/rsyncd.conf за исключением случая, когда демон запускается поверх удаленной оболочки и удаленный пользователь не root. В последнем случае rsyncd.conf по умолчанию располагается в текущем каталоге (обычно $HOME).

    Port=PORT Указывает альтернативный номер TCP порта для работы, а не 873 по умолчанию.

    Blocking-io Указывает использовать блокирующий ввод-вывод при запуске поверх программы-транспорта удаленной оболочки. Если этой программой являются либо rsh, либо remsh, то rsync использует блокирующий ввод-вывод по умолчанию, иначе по умолчанию используется неблокирующий ввод-вывод. (Заметьте, что ssh предпочитает неблокирующий.)

    No-blocking-io Отключает действие --blocking-io, когда оно активировано по умолчанию.

    Log-format=FORMAT Позволяет Вам точно указывать, что rsync сообщает (журналирует) на стандартный вывод на по-файловой основе. Формат сообщений определяется тем же соглашением, что и для параметра журналирования в файле rsyncd.conf.

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

    Partial По умолчанию rsync будет удалять все частично-переданные файлы в случае прерывания передачи. В некоторых случаях более желательно сохранять такие файлы. Используя параметр --partial, можно указать rsync сохранять частично-переданный файл, что может ускорить передачу всего файла при последовательном повторении таких передач.

    Progress Указывает выводить rsync информацию о ходе передачи. Скучающему пользователю будет на что посмотреть. Подразумевает наличие --verbose без увеличения подробностей.

    P Эквивалент для --partial --progress . Автор нашел для себя частым использование этой комбинации, поэтому для облегчения ввел отдельный параметр.

    Password-file Позволяет Вам предоставить пароль для доступа к rsync-серверу, сохранив его в файле. Заметьте, что этот параметр полезен только при использовании для доступа к rsync-серверу встроенного rsync-транспорта, при использовании программы удаленной оболочки он бесполезен. Файл не должен быть всем доступен на чтение. Он должен содержать только пароль, в одну строчку.

    Bwlimit=KBPS Позволяет указать максимальную скорость передачи, килобайт в секунду. Этот параметр наиболее эффективен при использовании rsync для передачи больших файлов (несколько мегабайт и выше). В соответствии с природой rsync-передач передается обычный блок данных, затем если rsync определяет, что скорость выше установленного, то он вводит задержку перед посылкой следующего блока. В результате средняя скорость передачи равна указанному пределу. Нулевое значение означает отсутствие этого ограничения.

    Write-batch=PREFIX Генерирует набор файлов, которые могут быть переданы в пакетном обновлении. Каждое имя файла в наборе начинается с PREFIX. См. раздел "ПАКЕТНЫЙ РЕЖИМ" за деталями.

    Read-batch=PREFIX Применяет ранее сгенерированный пакет изменений, используя тот набор файлов, чьи имена начинаются с PREFIX. См. раздел "ПАКЕТНЫЙ РЕЖИМ" за деталями.

Опции rsync

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

    V - подробный вывод информации о происходящем. Можно указывать несколько раз. Позволяет развлечься разглядыванием кучи внутренней информации о пересылки данных в процессе обновления.

    Inplace - обновление образа производится без создания временного файла. Полезно при недостатке места, а также в случае нестабильной связи: --inplace позволяет продолжить обновление образа с того места, на котором обновление прекратилось из-за обрыва связи. Использование этой опции слегка снижает эффективность работы алгоритма расчёта разницы между файлами.

    H, --human-readable - показывать размеры переданных/обработанных данных в удобном виде (вместо байт), например 234K или 1,35G

    Z, --compress - включить сжатие передаваемых данных.

    Progress - показывать индикацию процесса обработки файла.

    Partial - не удалять локальный файл перед синхронизацией

    P - тоже что и --partial вместе с --progress

    Stats - выводить статистику - показывает сколько было принято/передано, сколько удалось сэкономить и т.п.

Есть несколько идентичных серверов (4 ноды) на Amazon EC2 с Ubuntu. Каждый генерирует и хранит у себя на диске кэш, который хотелось бы синхронизировать. Но простой rsync тут не подойдет - файлов несколько миллиардов, nfs - слишком медлителен, и т. д. Полный список рассмотренных вариантов с пояснениями ниже.

К тому же, время от времени нужно удалять устаревшие файлы сразу на всех серверах, что пока делается вручную и занимает несколько суток. Вопрос наиболее быстрой для такого Use Case файловой системы планирую описать позже. Оговорюсь только, что по нескольким причинам была выбрана XFS.

После теста нескольких кластерных технологий и файловых систем, по совету старшего товарища, решили использовать тот же rsync, но в связке с inotify. Немного поискав в интернете готовое такое решение, дабы не изобретать велосипед, наткнулся на csyncd, inosync и lsyncd. На хабре уже была , но он тут не подходит, т.к. хранит список файлов в базе SQLite, которая вряд-ли сможет сносно работать даже с миллионом записей. Да и лишнее звено при таких объемах ни к чему. А вот lsyncd оказался именно тем, что нам и было нужно.

4. Стартуем демон на всех нодах:

/etc/init.d/lsyncd start

Если Вы оставили «nodaemon = true» в конфиге, то сможете видеть что происходит.

Скорость передачи данных достигает 300 Мбит/с и на загрузку сервера это мало влияет (по сравнению с тем же GlusterFS, например), да и задержка в данном случае сглаживает пики. Многое еще зависит от используемой ФС. Тут тоже пришлось провести маленькое исследование, с цифрами и графиками, так как ситуация довольно специфическая и результаты существующих опубликованных тестов не отражают того, что требуется в задаче.

Что еще было рассмотрено и почему не подходит в данном случае

Все исследование было нацелено на работу с Amazon EC2, с учетом ее ограничений и особенностей, поэтому полученные выводы в основном касаются только ее.
  • DRBD – репликация идет на блочном уровне. В случае деградации одного носителя убиваются оба. Ограничение в 2 ноды. (Больше можно, но 3 и 4-й можно подключить только как слейвы.)
  • Ocfs2 – используется либо поверх DRBD (о чем есть хорошая на хабре), либо нужно иметь возможность монтировать один раздел с нескольких нод. Невозможно на ec2.
  • Gfs2 – аналог ocfs2. Не пробовал, т. к. согласно тестам эта ФС медленней ocfs2, в остальном - ее аналог.
  • GlusterFS – вот тут все заработало практически сразу и как надо! Проста и логична в администрировании. Можно сделать кластер до 255 нод с произвольным значением реплик. Создал кластерный раздел из пары серверов и примонтировал его на них же но в другую директорию (то есть сервера были одновременно и клиентами). К сожалению на клиенте этот кластер монтируется через FUSE, и скорость записи оказалась ниже 3 МБ/сек. А так, впечатления от использования очень хорошие.
  • Lustre - чтобы запустить сие дело в krenel mode нужно патчить ядро. Как ни странно, в репозитории Ubuntu есть пакет с этими патчами, но вот самих патчей под нее или хотя-бы под Debian я не нашел. И судя по отзывам, понял, что завести это в deb-системе - шаманство.
  • Hadoop w/ HDFS, Cloudera - не пробовал, поскольку было найдено другое решение (см. ниже). Но первое что бросается в глаза - написано на Java, следовательно ресурсов кушать будет много, да и масштабы не как у Фесбука или Яху, всего 4 ноды пока.

UPD: Данное решение отлично себя показало на тестах (после чего и была написана статья), но в боевых условиях все оказалось совсем по другому. Минимальная продакшн-конфигурация - 584 тысячи вложенных директорий. А lsyncd навешивает inotify"и на каждую директорию. Сделать это сразу для всего дерева невозможно. Памяти, 584 тысячи нотифаев, съедают относительно немного, около 200 Мб (из 16 ГБ имеющихся), но вот процесс этот занимает 22 минуты. В принципе, не страшно: раз запустил и забыл. Но после этого, при стандартной конфигурации, lsyncd запускает синхронизацию всех файлов, которая в наших условиях либо глючила, либо занимала дни. В общем - не вариант. 100%-ная консистентность не требуется и без начальной синхронизации можно обойтись. Оставалось ее «выключить». Благо, демон написан так, что можно изменить практически все его функции прямо из конфига. Также, для увеличения производительности default.rsync был заменен на default.rsyncssh, а ядро натюнино на предмет лимитов inotify"а. То есть, для большинства задач подойдет конфиг выше, но в нашей конкретной ситуации работает следующее:

Settings = { logfile = "/var/log/lsyncd/lsyncd.log", statusFile = "/var/log/lsyncd/lsyncd.status", statusInterval = 5, --<== чтобы видеть что происходит без включения подробного лога } sync { default.rsyncssh, source = "/raid", host = "node02", targetdir = "/raid", rsyncOps = {"-ausS", "--temp-dir=/tmp"}, --<== описано выше delay = 3, --<== ставим по-меньше, чтобы очередь не забивать init = function(event) --<== перезагрузка функции инициализации. как она выглядела в оригинале можно посмотреть в документации или в исходниках log("Normal","Skipping startup synchronization...") --<== чтобы знать, что мы этот код вообще запускали и когда end } sync { default.rsyncssh, source = "/raid", host = "node03", targetdir = "/raid", rsyncOps = {"-ausS", "--temp-dir=/tmp"}, delay = 3, init = function(event) log("Normal","Skipping startup synchronization...") end }

Настройки ядра

У inotify есть три параметра (см. ls /proc/sys/fs/inotify/):
max_queued_events - максимальное число событий в очереди; default = 16384;
max_user_instances - сколько инстансов inotify может запустить один пользоваетль; default = 128;
max_user_watches - сколько файлов может отслеживать один пользоваль; default = 8192.

Рабочие значения:
echo " fs.inotify.max_user_watches = 16777216 # fs.inotify.max_queued_events = 65536 " >> /etc/sysctl.conf echo 16777216 > /proc/sys/fs/inotify/max_user_watches echo 65536 > /proc/sys/fs/inotify/max_queued_events

Так все заработало уже в продакшине.

Спасибо за внимание!

тащит всю команду 24 октября 2011 в 00:52

Rsync: мощная утилита для быстрого, гибкого удаленного и локального копирования файлов

  • Чулан *

Rsync разработан для замены rcp – древней программы для удаленного копирования под Unix. Благодаря широким возможностям синхронизации и передачи файлов, rsync часто применяется для создания зеркал.
Использование хитроумного алгоритма, позволяет rsync передавать только изменения в файлах, причем для выявления изменений ему не надо сравнивать два файла. Кроме того, rsync производит сжатие на лету, позволяя тем самым передавать файлы с максимальной эффективностью.
Кроме вышеописанных вкусностей, rsync обладает также и несколькими полезными возможностями обеспечения безопасности. Он поддерживает ssh – рекомендованный протокол для безопасной передачи данных; перед обработкой информации производит ее запись во временный файл, чтобы ничего не случилось с оригиналом, наконец, он поддерживает специальный режим безопасной отладки команд.
Rsync прост в использовании, но не является программой «click-and-play». Это -мощный инструмент, который может быть очень полезным, но не стоит забывать об осторожности, так как его с помощью легко что-нибудь испортить.

Синтаксис утилиты
Синтаксис утилиты простой и довольно обыденный.
rsync [опции] источник [приемник]
Указав только источник, мы увидим список файлов без операции копирования.

Опции и примеры
Для простоты понимания, операции синхронизации привожу сперва локально.
Быстрый способ синхронизировать два каталога, это использовать опцию -a :
rsync -a foobar_src/ foobar_dst/
В данном случае файлы и директории из источника скопируются в приемник, при этом, если там были файлы, то совпавшие по имени будут перезаписаны, а остальные не тронуты.

Опция -a задает архивный режим работы утилиты, и является эквивалентом набора опций:
-r, --recursive - рекурсивный режим;
-l, --links - пересоздание symlinks , это значит, что символические ссылки будут так же переноситься;
-p, --perms - перенос прав;
-t, --times - передача времени модификации и его обновление на удаленной системе. Этот ключ должен быть установлен для точной синхронизации;
-g, --group - установить группу конечного файла таким же, как и у исходного;
-o, --owner - установить владельца конечного файла таким же, как и у исходного;
-D, - same as --devices --specials - установить тип файла устройства и файла специального типа таким же, как у исходного.
В итоге получаем копию директории источника. Кстати, это можно использовать при переносе ОС на другой винчестер, подправив /etc/fstab, установив/переустановив grub на новом винте - получаем рабочую систему, но это уже другая тема.

Для вывода информации о работе утилиты, существует опция -v, --verbose . Чем больше опций -v , тем боле информативным будет вывод утилиты. Максимальная информативность достигается при четырех опциях -v, --verbose .

Если у нас содержится в директории источника актуальная информация, то чтобы не засорять приемник информацией, которая в процессе работы была удалена или перемещена в источнике, нужно старые файлы и директории удалить. Для этого есть несколько опций удаления, каждая из которых предоставляет свой алгоритм удаления. Их аж шесть!
--del - сокращенная форма --delete-during ;
--delete - просто удалить посторонние файлы из приемника;
--delete-before - приемник удаляет перед передачей;
--delete-during - приемник удаляет в процессе передачи, но не перед;
--delete-delay - отложенное удаление/найти файлы для удаления в процессе передачи, но удалить после передачи;
--delete-after - приемник удаляет после передачи, но не перед ней;
--delete-excluded - так же удалить исключенные файлы в приемнике, для этого задается шаблон (--exclude=PATTERN).

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

Порой файлы могут повредится или быть модифицырованы, но совпадать и датой и размером. То можно использовать проверку контрольной суммы, опция -c, --checksum .

Моей задачей было разобраться, как сделать резервную копию коллекций фотографий, музыки, наработок по университету и работе. При этом в источнике информация всегда актуальная, а то что удалено - мусор. Пример для решения моей задачи:
rsync -auvv --delete-during foobar_src/ foobar_dst/
Это обновит мой приемник, если он был уже чем то заполнен - вычистит то, чего нет в источнике, но не затронет файлы которые поновее, выведет статистику и состояние по каждому файлу.

Удаленная работа
Кроме того, очень полезным будет его способность работать через ssh. Что обеспечивает шифрование канала, что очень важно, если вы синхронизируете два сервера в сети интернет. Для уменьшение трафика, rsync так-же умеет сжимать данные, при передаче по сети.
Необходимы следующие опции:
-e - задать удаленный шелл для использования;
-z - сжимать передаваемые данные, либо задать:
-compress-level=9 - сжатие с установкой уровня компрессии.

Пример копирования с удаленного хоста по протоколу ssh:
rsync -avv --delete-during -compress-level=9 -e "ssh -p remote_ssh_port" user@host:/dir/to/foobar_src foobar_dst/
При этом, на стороне источника нужно иметь установленную утилиту rsync.

Надеюсь эта информация будет полезна многим. Больше информации про утилиту rsync вы сможете найти в ее же документации, благо она хорошо описана.
Там же вы можете найти информацию о том, как поднять дэмон rSync для непосредственного подключения без использования удаленного ssh шелла, а так же описание множества других опций на любой вкус и цвет.

Теги: rsync, копирование, резервирование файлов, синхронизация файлов