У меня есть файловая система, которая изменяется на двух серверах и также должна копироваться в Amazon S3.
До недавнего времени синхронизация файловой системы между этими двумя серверами с помощью Унисона, и затем копируя в S3 с s3sync.rb была прекрасным решением.
Теперь, когда файловая система составляет почти 50 ГБ, s3sync.rb стал узким местом, поскольку это должно проверить каждый файл на свежесть (мы используем - никакой-md5 флаг).
Таким образом, у меня теперь есть сценарий, который ожидает список файлов, и он обновил бы их и только их с помощью s3cmd.rb
Я ожидал, что мог использовать файл unison.log, чтобы заставить канонический список файлов передавать, но формат его варьируется в зависимости от операции, которая произошла с файлом (новый файл, копия с локальной альтернативы, переименуйте и т.д.).
Может унисон для генерации журнала или списка файлов, которые были изменены кроме оставленного в unison.log?
В данный момент это - то, как я извлекаю список файла из unison.log (я сознательно игнорирую, удаляет),
# Ignore deletes and get the list of new & changed files
grep -v '\[END\] Deleting ' /tmp/unison.log | grep '\[END\]' $unisonlog | sed -re 's/\[END\] (Copying|Updating file) //' > /tmp/changed-files.log
# Files that unison lists as shortcuts are harder as it doesn't always prefix them with their full path
# so before adding them to the log, find the files in the relevant directory
grep 'Shortcut: copying ' /tmp/unison.log | sed -re 's/Shortcut: copying (.*)+ from local file.*/\1/' | while read file
do
echo "Having to look for $file in source directory"
find /ebs/src -wholename "*$file" >> /tmp/changed-files.log
done
Одна из идей - использовать stdout
, сгенерированный Unison во время его работы. В stdout
есть мусор, который Unison использует для создания динамического эффекта в терминале, пока он «ищет изменения». Этот мусор можно довольно легко удалить, удалив каждую строку, содержащую символ возврата каретки (CR) (в vim это будет что-то вроде :% s /^.*^ M. * $ \ N // g
где ^ M
вводится нажатием Crtl + V , затем Crtl + M ). Результат выглядит примерно так:
<---- new dir bar/foo/newdir
deleted ----> bar/user/oldfile1
deleted ----> bar/user/oldfile2
<---- new file foobar/test/quiz.txt
<---- changed foobar/test/quiz.txt
Это намного легче проанализировать, чем журнал Unison по умолчанию.
Лучше всего вообще забыть о синтаксическом анализе вывода Unison и вместо этого использовать inotifywait
. Вы можете настроить inotifywait
, чтобы отслеживать определенный каталог и сообщать обо всех файлах, которые были изменены, перемещены, созданы и т. Д.
inotifywait --event modify,attrib,move,create,delete \
--daemon \
--outfile /path/to/output.log \
--recursive \
--quiet \
--format %w%f \
'/watch/directory/'
Это запустит inotifywait
как демон и выдаст очень хорошо, постоянно обновляемый список ( output.log
) абсолютных путей всех файлов в / watch / directory /
, в которых произошло одно из указанных событий. Возможно, вам потребуется изменить данные события и / или использовать опцию - exclude
, чтобы получить именно список файлов, которые вы хотите синхронизировать с S3.