Синхронизация двух разнесённых хранилищ с файлами - нетривиальная задача, особенно если... — 7 июля 2026 г. в 11:30:02.404
Синхронизация двух разнесённых хранилищ с файлами - нетривиальная задача, особенно если они состоят из десятков и сотен тысяч файлов. Сделать копию данных и регулярно синхронизировать - полдела. Нужно ещё как-то их сравнивать, чтобы убедиться в том, что данные в обоих местах идентичны. Мало того, что при передаче данные могут повредиться, так они ещё и со временем могут протухать из-за bit rot (битовое гниение на хранилищах) или silent corruption (повреждения из-за памяти, контроллеров, неисправных кабелей и т.д.) С bit rot я лично сталкивался, так что это не гипотетическая ситуация. Хотя в моём случае это не приводило к каким-то проблемам, так как протухали очень старые данные, которые по сути никому уже и не нужны, а хранятся просто так, на всякий случай. Но где-то это может быть критично. По моему опыту хранилища на несколько терабайт данных с сотнями тысяч файлов быстрее всего синхронизировать с помощью rsync. Я так обычно и делаю. У меня много заметок на этот счёт в канале. Особенность rsync в том, что он умеет быстро сравнивать хранилища и находить только изменившиеся файлы, учитывая размер файла и mtime. На основе этих данных формирует список разнящихся файлов и копирует только их. Такой подход не страхует от повреждения файлов во время передачи. Хотя сетевые протоколы содержат собственные механизмы контроля целостности, файлы могут повредиться, например, из-за неисправной памяти, контроллеров или других аппаратных сбоев. Даже если ваше хранилище защищено от bit rot, гарантировать поступление точной копии файла оно не может. Нужны дополнительные проверки. Rsync, как и некоторые другие подобные программы, могут сверять контрольные суммы файлов. Но это очень длительный процесс, если хранилище большое. В момент передачи данных делать это нецелесообразно. Процесс может растянуться на дни. Не так давно я в локальной сети сравнил два хранилища объёмом в 1ТБ, где хранятся ~100 тыс. файлов. У меня процесс длился в районе 20-ти часов. Подсчитывать контрольные суммы для сравнения логичнее локально и отдельно от передачи, разнеся эти процессы по времени. Если синхронизация выполняется раз в день, то сравнение можно делать раз в неделю/месяц. Для этого есть много различных программ. Я недавно увидел анонс одной из них - precizer, поэтому и решил написать об этой теме. Ранее мне был знаком скрипт bitrot, который делает примерно то же самое, но не так изящно. Precizer для максимального быстродействия написана на чистом Си, компилируется в одиночный бинарник, проста в использовании. Производительность в основном зависит от работы дисковой подсистемы, так как файлы приходится полностью читать. Обычно это узкое место. Результаты анализа файлов хранит в SQLite. Если её прервать, а потом запустить снова, она продолжит работу, не потеряв всё то, что сделала ранее. Это отличный инструмент для фоновой проверки хранилищ по расписанию. Работает примерно так: # precizer --progress --database=share1.db /mnt/share1 # precizer --progress --database=share2.db /mnt/share2 # precizer --compare share1.db share2.db В базах share1.db и share2.db хранится относительный путь файла, его хэш SHA512 и метаданные (размер, ctime и mtime). Последующие запуски для обновления базы выполняются с ключом --update, чтобы заново не пересчитывать хэши к неизменившимся файлам. Решений подобной задачи может быть несколько. Передача и сравнение файлов - только одно из них. Можно передавать снепшоты файловых систем, или систем хранения, если они это поддерживают. Например, снепшоты zfs или lvm и потом их сравнивать. Можно хранить данные в формате чанков, как это делает, к примеру, restic или borg и делать проверки на уровне чанков. Итоговое решение нужно выбирать по месту в зависимости от того, какая архитектура хранения и бэкапов используется. Уровень файлов имеет свои недостатки, но удобен, так как вы в случае чего сразу имеете живую копию данных, которую сможете использовать без преобразования или каких-то ещё дополнительных действий. #backup

