У меня есть огромный репозиторий Subversion, и я хочу создать подчиненный репозиторий для резервного копирования в реальном времени.
Однако я не хочу воспроизводить историю ревизий на ведомом устройстве, потому что это буквально займет несколько дней из-за размера моего репозитория. У меня уже есть обычная инфраструктура, такая как сценарии ловушек и два веб-сервера, которые обслуживают главный репозиторий и репозиторий, который скоро станет подчиненным.
Как мне это сделать?
Subversion имеет возможность поддерживать один или несколько подчиненных репозиториев, которые вы можете синхронизировать с помощью сценариев ловушек или использовать задание cron, которое запускает svnsync за вас. Когда вы создаете подчиненный репозиторий, процедура включает, среди прочего, создание репозитория только с ревизией 0, а затем вы воспроизводите все коммиты от главного к этому подчиненному. В зависимости от вашей пропускной способности и размера репозитория это может занять очень много времени.
Есть более быстрый способ сделать это. Он включает в себя копирование текущего мастера в новое место, а затем выполнение некоторых трюков, чтобы превратить его в подчиненное устройство. Я оставлю фактическую реализацию автоматической или прямой синхронизации на ваше усмотрение.
В этом ответе мы предполагаем:
Я много раз использовал этот метод с репозиторием Subversion объемом 20+ ГБ, я также несколько раз успешно восстанавливал сломанный мастер, копируя созданный таким образом подчиненный сервер обратно в мастер.
Мы скопируем мастер и передадим его на удаленный сервер, в каталог, где находится ваш репозиторий:
svnadmin hotcopy repo repo_bak
tar -cjf repo_bak.tar.bz repo_bak
scp repo_bak.tar.bz user@slave.example.org:/path/
Команда hotcopy позволяет безопасно скопировать репозиторий, который используется в настоящее время, и поддерживать его согласованность.
Распаковать тарбол на подчиненном сервере и все такое ...
Мы предполагаем, что на подчиненном сервере вы запускаете веб-сервер, который настроен для обслуживания репозитория обычным образом. Кроме того, ему нужны сценарии перехватчиков, которые предотвращают фиксацию любой учетной записи, кроме учетной записи синхронизации, по очевидным причинам мы хотим, чтобы репозитории были точно такими же. Опять же, как это сделать, выходит за рамки этого ответа.
Мы запускаем все следующие команды в главном репозитории.
Привяжите главный репозиторий к подчиненному репозиторию:
svn propset svn:sync-from-url --revprop -r 0 file:///example/path/repo https://slave.example.org/repo
Узнайте версию подчиненного репозитория, это также даст вам UUID, который вам понадобится ниже:
svn info https://slave.example.org/repo
Используйте ревизию, которую вы нашли выше, в следующей команде:
svn propset svn:sync-last-merged-rev --revprop -r 0 REVISION_OF_SLAVE https://slave.example.org/repo
Нам нужно использовать UUID, который мы нашли выше, чтобы добавить в главный репозиторий:
svn propset svn:sync-from-uuid --revprop -r 0 UUID_OF_SLAVE https://slave.example.com/repo
Если все прошло хорошо, вы можете успешно синхронизировать ведомое устройство:
svnsync sync https://slave.example.org/repo
Правильные места чтобы прочитать о запуске репликации репозитория Subversion через svnsync:
PS - ты должен иметь полное зеркало мастер-репо на рабе, но можешь попробовать начать не с пустого репо, а клонировать заново svnadmin dump
в какой-то момент (не горячая копия!)