Моя шпаргалка :)

Мануалы и настройки => Настройки *nix (почта, web, система etc) => Тема начата: George от Апр. 24, 2026, 08:55

Название: rsync в screen и daemon. Копирование большого объема данных
Отправлено: George от Апр. 24, 2026, 08:55
Для переноса 6 ТБ данных, которые активно меняются, лучше всего использовать двухэтапный подход. rsync сам по себе не умеет «мониторить» файлы в реальном времени как сервис, но он идеально подходит для синхронизации изменений.
Вот пошаговая стратегия:
1. Этап «Прогрев» (Первичная копия)
Сначала запустите основной процесс копирования. На 6 ТБ уйдет много времени, и это нормально. Используйте этот набор флагов:
bash

rsync -avzP --human-readable /откуда/ /куда/


    -a — архивный режим (сохраняет права, владельцев, даты).
    -v — подробный вывод.
    -z — сжатие (полезно, если копируете по сети).
    -P — показывает прогресс и позволяет докачивать файл при обрыве.

2. Этап «Догонка» (Повторные запуски)
Когда первая копия снимется, данные на источнике уже изменятся. Запустите rsync еще раз. Он сравнит файлы и докопирует только то, что изменилось.
Чтобы автоматизировать это, добавьте флаг --delete, если нужно удалять на приемнике то, что удалили на источнике:
bash

rsync -avz --delete /откуда/ /куда/

3. Как сделать работу «постоянной»?
Вариант А: Простой цикл (Bash-скрипт)
Если вам нужно, чтобы процесс шел непрерывно один за другим:
bash

while true; do
  rsync -avz --delete /откуда/ /куда/
  sleep 60  # пауза 1 минута между проверками
done

Запустите это внутри screen или tmux, чтобы процесс не прервался при закрытии терминала.
Вариант Б: Lsyncd (Профессиональный метод)
Если изменений очень много и вы хотите, чтобы rsync срабатывал мгновенно, как только файл изменился, используйте утилиту lsyncd.

    Она следит за файловой системой через inotify.
    Как только пользователь сохраняет файл, lsyncd тут же отправляет его через rsync.
    Минус: При 6 ТБ данных может потребоваться увеличить лимиты inotify в системе.

Вариант В: Финальная синхронизация
Когда придет время окончательно переключить пользователей на новый сервер:

    Отключите пользователей от старого сервера (Read-only).
    Запустите rsync в последний раз.
    Проверьте объемы и количество файлов.

Важные советы для 6 ТБ:

    Сжатие (-z): Если копируете внутри одной локальной сети 1Гбит+, флаг -z может только замедлить процесс, так как процессор будет тратить время на упаковку. Попробуйте без него.
    Проверка контрольных сумм (-c): Не используйте его на таких объемах без крайней нужды. rsync по умолчанию сравнивает размер и дату изменения — это очень быстро. Проверка по хэшам (checksum) заставит систему перечитывать все 6 ТБ при каждом запуске.

Вы копируете данные внутри одного сервера на другой диск или по сети на другую машину?

Если внутри сервера с диска на диск.

Раз раз вы копируете внутри сервера с диска на диск, то флаг -z (сжатие) вам точно не нужен. Он только нагрузит процессор и замедлит копирование, так как диски работают быстрее, чем процессор успевает упаковывать и распаковывать данные.
Про флаг --human-readable (или -h)
Этот флаг делает вывод цифр понятным для человека.

    Без него: rsync будет показывать размер в байтах (например, 125829120 bytes). Вам придется в уме делить на 1024, чтобы понять, сколько это.
    С ним: rsync напишет 120M или 1.2G.

В сочетании с флагом -P (прогресс) это позволит вам видеть в реальном времени:

    Скорость копирования (например, 150 MB/s).
    Оставшееся время до конца текущего файла.
    Процент выполнения.


Так как это локальное копирование 6 ТБ, используйте:
bash

rsync -aPh /source/path/ /destination/path/

Почему именно так:

    -a (archive): сохранит все права доступа, даты и вложенные папки.
    -P: позволит продолжить с того же места, если процесс прервется (например, выключится свет или вы случайно нажмете Ctrl+C).
    -h: для удобного отображения Гб/Мб.

Нюанс с завершающим слешем /:
Это очень важно в rsync:

    Если вы укажете /source/ (со слешем в конце) — скопируется содержимое папки внутрь папки назначения.
    Если укажете /source (без слеша) — в папке назначения создастся папка source.

Как думаете, дисковая подсистема справится с нагрузкой? При копировании 6 ТБ диск, с которого читаете, и диск, на который пишете, будут сильно заняты, что может замедлить работу пользователей в 1С. Можно ограничить скорость через --bwlimit=KBPS, если сервер начнет «тормозить».
это не 1с, а битрикс24. Но, поскольку это виртуальная машина, сам портал и бд лежит на других дисках, которые не будут затронуты копированием. это перемещение папки /uploads/ с пользовательскими файлами на другой физический диск. Сам диск vm не переместился vmotion, т.к. ему плохо, у него latency подсткакивает перидоически до 150мс (диск ssd)
Понял ситуацию. Перенос /uploads/ в Битрикс24 — это как раз тот случай, когда файлов очень много (сотни тысяч или миллионы мелких картинок и документов), и именно на таких задачах rsync может «задумываться» при каждом запуске.
Раз у исходного диска проблемы с latency (150мс), вот несколько советов, как не «добить» его окончательно во время копирования:
1. Ограничение нагрузки на диск
Чтобы Битрикс не начал тормозить еще сильнее из-за очереди чтения (I/O Wait), можно ограничить скорость копирования. Например, до 50 МБ/с (параметр в КБ/с):
bash

rsync -aPh --bwlimit=50000 /var/www/html/upload/ /mnt/new_disk/upload/
Используйте код с осторожностью.
Это позволит диску «дышать» и обрабатывать запросы пользователей портала между тактами чтения rsync.
2. Маленькая хитрость: --size-only
Когда файлов миллионы, rsync тратит очень много времени на сравнение даты изменения каждого файла. Если вы знаете, что файлы в /upload/ после загрузки обычно не редактируются, а только добавляются новые, используйте флаг --size-only.

    rsync будет сравнивать только размер. Это на порядки ускорит процесс «догонки» (повторных запусков), когда большая часть данных уже скопирована.

3. Финальный перенос (Switchover)
Когда разница между дисками станет минимальной, нужно будет сделать «переключение»:

    Выключите Apache/Nginx (чтобы пользователи перестали писать в папку).
    Запустите rsync в последний раз с флагом --delete, чтобы удалить из копии то, что пользователи успели удалить на оригинале:
    bash

    rsync -aPh --delete /var/www/html/upload/ /mnt/new_disk/upload/
    Используйте код с осторожностью.
    Размонтируйте старый диск и примонтируйте новый в ту же точку /upload/, либо поправьте fstab и пути.
    Включите веб-сервер.

4. Почему SSD дает 150мс?
Если это виртуализация (VMware/Proxmox), проверьте:

    Не перегревается ли контроллер.
    Нет ли «соседей» по хранилищу, которые забивают канал (I/O noisy neighbors).
    Важно: Если диск начал сыпаться (bad blocks), rsync может зависнуть на чтении конкретного файла. Если заметите, что процесс «встал», посмотрите dmesg | tail на предмет ошибок ввода-вывода.

Сколько примерно файлов (в штуках) в папке upload? Если их больше миллиона, стандартный запуск rsync может занимать 10-20 минут только на составление списка файлов перед началом копирования.
спросил коллегу, запускаю так rsync -aPh --bwlimit=50000 /var/www/html/upload/ /mnt/new_disk/upload/
ответ: запускайте, но лучше в screen если не через демона - что это значит
Ваш коллега дал очень дельный совет. Если кратко: он переживает, что если у вас разорвется интернет-соединение или вы просто закроете окно терминала, процесс копирования тут же прервется.
Для 6 ТБ данных, которые будут копироваться долго, это критично. Вот расшифровка его слов:
1. Что такое screen?
Это «виртуальный терминал». Он позволяет запустить процесс так, чтобы он жил внутри сервера, а не внутри вашего текущего подключения.

    Как это работает: Вы создаете сессию, запускаете там rsync и можете спокойно выключать свой компьютер. Процесс на сервере не остановится.
    Как пользоваться:
        Установите (если нет): sudo apt install screen (или yum install screen).
        Запустите сессию: screen -S copy_upload (вы сразу окажетесь в обычном терминале, но это уже «внутри» сессии).
        Вставьте свою команду: rsync -aPh --bwlimit=50000 /var/www/html/upload/ /mnt/new_disk/upload/ и нажмите Enter.
        Отключитесь (Detach): Нажмите комбинацию клавиш Ctrl + A, а затем сразу клавишу D. Терминал напишет [detached]. Теперь можно закрывать окно.
        Как вернуться: Когда захотите проверить прогресс, введите screen -r copy_upload.

2. Что значит «не через демона»?
«Демон» (daemon) в данном контексте — это запуск rsync как системной фоновой службы, которая работает сама по себе без участия пользователя. Ваш коллега имеет в виду, что раз вы запускаете команду вручную (интерактивно), то её нужно «спрятать» в screen, чтобы она не зависела от вашего сеанса связи.
Почему это важно для вашего случая:
6 ТБ со скоростью 50 МБ/с будут копироваться около 33-35 часов. Вероятность того, что за это время у вас моргнет интернет или компьютер уйдет в спящий режим, почти 100%. Без screen вам придется начинать или перезапускать процесс вручную каждый раз.
Резюме:
Заходите на сервер, пишите screen -S rsync_task, запускайте свою команду и «детачтесь» (Ctrl+A, D).
Вы уже проверили, сколько места занято на новом диске? (команда df -h поможет убедиться, что 6 ТБ точно влезут).
«Демон» (daemon) в данном контексте — это запуск rsync как системной фоновой службы - как это сделать?
Запуск rsync как системной службы (через systemd) — это самый надежный способ для долгого копирования. Если сервер перезагрузится, служба сама продолжит работу с того же места.
Вот пошаговая инструкция, как это настроить:
1. Создайте файл службы
Создайте файл конфигурации для вашей задачи:
bash

sudo nano /etc/systemd/system/rsync-upload.service

Используйте код с осторожностью.
2. Вставьте туда следующий текст:
(Замените пути на ваши реальные)
ini

[Unit]
Description=Rsync 6TB Upload Data
After=network.target

[Service]
Type=simple
# Если процесс прервется, система подождет 30 секунд и запустит его снова
Restart=always
RestartSec=30
# Сама команда копирования
ExecStart=/usr/bin/rsync -aPh --bwlimit=50000 /var/www/html/upload/ /mnt/new_disk/upload/

[Install]
WantedBy=multi-user.target

Используйте код с осторожностью.
3. Запустите службу
После сохранения файла (Ctrl+O, Enter, Ctrl+X) выполните команды:

    Перезагрузите конфигурацию, чтобы система увидела новый файл:
    bash

    sudo systemctl daemon-reload

    Используйте код с осторожностью.
    Запустите процесс:
    bash

    sudo systemctl start rsync-upload

    Используйте код с осторожностью.
    Добавьте в автозагрузку (на случай перезагрузки сервера):
    bash

    sudo systemctl enable rsync-upload

    Используйте код с осторожностью.

4. Как следить за процессом?
Поскольку это фоновая служба, она не выводит данные в консоль. Чтобы увидеть прогресс (те самые логи, которые вы видели бы в screen), используйте команду:
bash

journalctl -u rsync-upload -f

Используйте код с осторожностью.
Флаг -f (follow) заставляет команду показывать новые строки в реальном времени.
Плюсы этого метода перед screen:

    Автономность: Если сервер случайно перезагрузится (например, из-за latency диска или по питанию), rsync запустится сам сразу после старта системы.
    Логирование: Все отчеты о скопированных файлах сохраняются в системном журнале.
    Управление: Вы можете в любой момент остановить копирование (systemctl stop rsync-upload) или проверить, работает ли оно (systemctl status rsync-upload).

Кстати, когда 6 ТБ скопируются, служба закончит работу и перейдет в статус "Inactive". После этого вам останется только сделать финальную «догонку» перед переключением.
В