У меня есть папка с примерно 1,5 миллионами файлов, и мне нужно, чтобы их как можно чаще копировали на вторичный сервер. Что бы вы порекомендовали, потому что стандартные команды rsync этого не делают, потому что просто отправка инкрементного списка файлов (при использовании параметров rsync -Pcr) занимает около 30 минут ... а передача файла около 10 секунд. Как бы вы решили эту проблему, товарищи сисадмины?
В настоящее время я использую следующую команду с 30-минутным интервалом:
rsync -Pcr /var/primary/storage /var/secondary/ --log-file=/tmp/rsync.log
Примечание. / Var / primary / storage - это папка, подключенная к вторичному серверу через NFS.
ОБНОВИТЬ:
Я также пробовал следующую команду:
cp -aur /var/primary/storage /var/secondary/
Но для меня странно, что команда спрашивает меня, разрешаю ли я перезапись конечного файла, который имеет ту же дату изменения, что и исходный файл. Разве опция обновления не предназначена для просмотра и копирования по умолчанию, если исходный файл новее (или изменен), чем файл назначения?
Я нашел решение, но оно немного сложное и требует некоторого размышления. Если вы не хотите это читать, тогда TL; DR: нет NFS, нет проблем, лучше отдать, чем получить
Итак, я попытался синхронизировать файлы с FileServer-1 на FileServer-2. Чтобы снизить нагрузку на FileServer-1, я подумал, что могу выполнить команду rsync на FileServer-2 и скопировать файлы с FileServer-1. Я отменил это и выполнил команду rsync с FileServer-1, чтобы скопировать добавочный список файлов папок в FileServer-2. Произошла магия, это было быстрее. Все еще недопустимо, но быстрее.
Через некоторое время мне пришлось отключить папку NFS с обоих файловых серверов. Случайно я запустил команду rsync из FileServer-1, чтобы скопировать файлы с локального компьютера на FileServer-2. Теперь произошло настоящее чудо, потому что это было сделано примерно за 2 минуты.
Я удалил около 600 МБ данных из FileServer-2 и снова запустил rsync, чтобы посмотреть, сколько времени нужно rsync для копирования всех файлов (то есть около 10 000 файлов). Прошло не более 5 минут !!!!
С тех пор, как у меня размонтированы папки (которые не имеют ничего общего с файлами, которые я пытаюсь использовать rsync), rsync начал работать как зверь.
У кого-нибудь есть объяснение, почему Rsync и NFS нагревают друг друга вот так? Или это просто уникальное явление в моей системе? Используя CentOS 7, я забыл об этом сказать.
Я думаю, что лучше всего отслеживать или регистрировать, какие файлы были изменены. Хотя это можно решить с помощью SDS, поскольку вы используете rsync, я предлагаю вам использовать обычную файловую систему.
Поэтому думаю бегом inotifywait
как деамон - лучший выбор для вас:
sudo inotifywait --daemon --outfile /tmp/fschanges --recursive /path/to/watch \
--event modify --event move --event create --event delete --event close_write
При встраивании этого в простой сценарий bash, который 1) читает файл, 2) подталкивает изменения и 3) очищает содержимое по завершении, вы должны получить довольно «мгновенное» решение:
#!/bin/bash
logfile="/tmp/fschanges"
path="/home/roy/Downloads"
# Stop deamon upon exit
trap "killall inotifywait" EXIT
# Init deamon
inotifywait --daemon --outfile $logfile --recursive $path \
--event modify --event move --event create --event delete --event close_write &
while true; do
# Loop trough file
while read change; do
srcpath=$(echo "$change" | cut -d' ' -f1)
action=$(echo "$change" | cut -d' ' -f2)
file=$(echo "$change" | cut -d' ' -f3)
if [[ $action == *"DELETE"* ]]; then
echo "DELETE: rsync $srcpath$file"
elif [[ $action == *"CREATE"* ]]; then
echo "CREATE: rsync $srcpath$file"
elif [[ $action == *"WRITE"* ]]; then
echo "WRITE: rsync $srcptah$file"
fi
done < $logfile
# Clear the log
> $logfile
# Allow for cooldown
sleep 1
done
Конечно, приведенный выше сценарий должен быть правильно завершен, но вы поняли общую идею.