Блог Синявского
  • Разделы
  • Метки
  • Все статьи

Использование rsync для бекапирования

1

rsync консольная утилита позволяющая синхронизировать содержимое локальных или удалённых каталогов между Linux, Mac и Windows.

Введение

Название rsync образовано от remote sync (remote synchronization). При помощи этой утилиты вы можете копировать файлы по протоколу ssh. Этот протокол поддерживает шифрование, поэтому использование rsync безопасный способ копирования данных. К особенностям этой утилиты можно отнести экономию трафика, поскольку при копировании происходит сжатие, а в случае изменения файла передаётся только разница (diff). Так же в программе предусмотрена возможность рекурсивного копирования директорий.

rsync может использоваться как отдельная утилита, так же и в составе сервиса rsyncd (TCP порт 873).

Обычно я использую rsync для создания резервных копий файлов.

rsync доступна для Linux/Unix. Так же можно использовать в WSL (Windows Subsystem for Linux).

Описание rsync и основных параметров

Синхронизация локальных каталогов:

rsync [option]... [source-file [destination-file]]

по протоколу ssh:

rsync [option]... [[user@]from-host:]source-file [[user@]to-host:][destination-file]]

или по протоколу rsync:

rsync [option]... [rsync://[user@]from-host[:port]]source-file [rsync://[user@]to-host[:port]][destination-file]]

from-host - имя или IP адрес хоста, на котором находится файл (хост источник). Может быть пропущено если хостом является локальный компьютер, на котором исполняется эта команда.

user - пользователь у которого есть права для доступа к файлу и директории, которые будут скопированы с хоста-источника. Или пользователь, у которого есть права на запись на хосте-назначения.

source-file - файл или файлы, которые будут скопированы из хоста-источника на хост-назначения. Это может быть и директория, для этого нужно указать ключ -r при копировании, для копирования содержимого директории.

destination-file - имя, которое получит файл при копировании на хосте-назначения. Если параметр не указан все файлы будут скопированы с исходными именами.

rsync ключи

-v, --verbose - отображать детальную информацию отладки в процессе работы программы.

--info=FLAGS - детальные информационные сообщения.

--debug=FLAGS - детальные отладочные сообщения.

--msgs2stderr - поддержка специального вывода для дебага.

-q, --quiet - без отображения сообщений (кроме ошибок).

--no-motd - в режиме демона не отображать message of the day при подключении.

-c, --checksum - синхронизирует файлы на основе контрольной суммы, а не времени модификации и размере (сильно увеличивает время работы).

-r, --recursive - рекурсивно синхронизирует содержимое директории, если в файле-источнике указана директория

-d, --dirs - передаются только директории без копирования файлов.

-b, --backup - создаются бекапы (если изменилась версия файла)

--backup-dir=DIR - Создавать бекапы в указанную директорию.

--suffix=SUFFIX - Добавлять суффикс в название бекапируемого файла.

Примеры rsync

$ rsync /home/ivan/Desktop/data/*.txt /home/ivan/Desktop/backupdata/

скопируются все файлы с расширением .txt из одной папки в другую

$ rsync --max-size=2k /home/ivan/Desktop/data/ /home/ivan/Desktop/backupdata/

скопируются все файлы менее 2,048 KB. Буквы k, m, или g указывает размер файла, килобайт, мегабайт или гигабайт соответственно, используется множитель 1,024.

$ rsync --min-size=30m --progress /home/ivan/Desktop/data/ /home/ivan/Desktop/backupdata/

скопируются все файлы более 30 мегабайт. --progress - программа покажет прогресс копирования, удобно для больших файлов.

$ rsync --recursive /home/ivan/Desktop/data/ /home/ivan/Desktop/backupdata/

рекурсивное копирование директории с файлами с поддиректориями.

$ rsync -r --exclude="*.deb" /home/ivan/Desktop/data/ /home/ivan/Desktop/backupdata/

рекурсивное копирование директории с файлами с поддиректориями, исключая файлы с расширением *.deb

В ssh возможно три варианта копирования файлов:

С локального хоста на удаленный:

$ rsync somefile username@server:/home/username/

С удаленного хоста на локальный:

$ rsync username@server:/home/username/file_name /home/local-username/file-name

С удаленного хоста на другой хост:

$ rsync username1@server1:/home/user_name1/file_name user_name2@server2:/home/user_name2/

Трафик при этом идет напрямую между серверами.

rsync трюки

Ограничение скорости передачи

rsync --bwlimit=1024 username@server:/home/username/* .

bwlimit указывается в Кбит/с, в данном примере ограничение 1 мегабит.

Нестандартный порт ssh

rsync -e 'ssh -p 2244' username@server:/home/username/* .

Удаление файлов в удаленном каталоге при удалении в исходном

rsync --delete username@server:/home/username/* .

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

Игнорировать обновление файлов, не проверять на время изменения и изменение размера файла

rsync --ignore-existing username@server:/home/username/* .

При копировании из linux в windows не всегда корректно работает проверка времени изменения и размера файла. Может быть такое что файл не изменялся, но все равно будет копироваться каждый раз.

Создание резервной копии файлов

Данный скрипт не безопасный. В нем указан пароль. Для того, чтобы безопасно использовать такого рода скрипты необходимо сгененировать сертификаты для ssh. Поскольку данный пример использует бекапирование файлов с linux на windows server не удалось настроить сертификаты. Но пример тем не менее полностью работоспособен. Для ввода пароля используется утилита sshpass. Для установки # sudo apt-get install sshpass

В скрипте используется команда rsync

sshpass -p '12345678' /usr/bin/rsync -az -e 'ssh -p 2244' --bwlimit=1024 --ignore-existing --delete --recursive /web/project/media/ dump_user@dump_server:/cygdrive/x/project/media_dump

В этом скрипте идет подключение по ssh на нестандартный порт 2244 -e 'ssh -p 2244', чтобы rsync не спрашивал пароль используется sshpass sshpass -p '12345678'. Копирование осуществляется с ограничением скорости, чтобы не забить весь канал --bwlimit=1024. Скрипт пропускает уже существующие файлы --ignore-existing, не смотрит на изменение их размера или времени изменения. Скрипт копирует рекурсивно --recursive, с подкаталогами. При этом удаляет лишние файлы отсутствующие в исходных каталогах и присутствующие в каталогах назначения --delete

После подключения к windows серверу по openssh, скрипт переходит в каталог X:\project\media_dump

Чтобы скрипт не запускал множественное копирование реализована проверка на запущенный инстанс. При запуске проверяется наличие pid файла, в котором записан номер процесса, и проверяется этот номер процесса.

rsync_media_dump.sh
#!/bin/bash

username='dump_user'
password='12345678'
destination_host='1.2.3.4'

pidfile="/tmp/.rsync_dump_pid"
is_running=1

if [ -f $pidfile ];
then
    echo "PID file exists " $(date +"%Y-%m-%d %H:%M:%S")
    previous_pid=`cat $pidfile`
    is_running=`ps -p $previous_pid | wc -l`
    echo "Is running ="$is_running" pid "$previous_pid
fi

if [ $is_running -gt 1 ];
then
    echo "Previous process didn't quit yet"
else
    echo "RUN"
    sshpass -p $password /usr/bin/rsync -az -e 'ssh -p 2244' --bwlimit=1024 --ignore-existing --delete --recursive /web/project/media/ $username@$destination_host:/cygdrive/x/project/media_dump &>/dev/null &
    echo $! > $pidfile
fi

Так же можно создавать дампы базы данных и копировать их на сервер дампов.

pg_dump.sh
#!/bin/bash

DB="my_super_db"
USER="my_super_user"
PASSWORD="my_secret"
PREFIX="my_super_prefix"
DESTINATION="/web/my_project/sql/"

/usr/bin/find $DESTINATION -name "*.gz" -ctime +30 -delete
PGPASSWORD=$PASSWORD /usr/bin/pg_dump -h 127.0.0.1 -p 5432 -U $USER -F p $DB | gzip > $DESTINATION/$PREFIX\_`date +%Y-%m-%d`.sql.gz

Добавим всё это в cronttab -e

# m h  dom mon dow   command
0 1 * * * /home/my_super_user/pg_dump.sh
0 2 * * * /home/my_super_user/rsync_media_dump.sh


  • ← сюда
  • туда →

comments powered by Disqus

Опубликовано

02.04.2022

Обновление

05.05.2022

Категории

ubuntu

Тэги

  • bash 10
  • console 6
  • rsync 1
  • ubuntu 36

Всегда на связи

  • Блог Синявского - Ничего не переносить на завтра, это тоже проблема с прокастинацией?
  • © Алексей Синявский, по лицензии CC BY-SA если не указано иное.
  • С использованием Pelican. Тема: Elegant от Talha Mansoor