Replikacja repozytorium pozwala nam automatyczne tworzenie kopii zapasowej lub szybkie uruchomienie serwera do którego można wysyłać zmiany, gdy serwer główny ulegnie awarii.
Postanowiłem umieścić repozytoria pod adresem „/svn”, więc dodaję lokalizację do Apache’a:
<Location /svn> DAV svn SVNParentPath /path/to/repos SVNMasterURI https://url.to.repos/svn AuthType Basic AuthName "Subversion Repositories" AuthUserFile /path/to/passwd/file AuthzSVNAccessFile /path/to/authz/file Require valid-user </Location>
To wystarczy, aby przeglądać repozytoria przez WWW, ale nie wystarczy do poprawnego działania serwera slave. Wszelkie próby modyfikacji danych będą przesyłane na serwer główny, ale pobieranie danych zawsze będzie odbywać się ze slave’a. Z racji tego, że korzystamy z protokołu HTTPS, musimy włączyć SSLProxyEngine dla domeny, którą będziemy wykorzystywali do komunikacji z repozytoriami.
<VirtualHost *.443> DocumentRoot /path/to/websvn ServerName url.to.svn SSLEngine on SSLCertificateFile /etc/apache2/ssl/key.pem SSLProxyEngine On <Directory /path/to/websvn> Allow from all Options -Indexes </Directory> </VirtualHost>
ppp
svnsync --source-username=masterusername --source-password=masterpassword --sync-username=slaveusername --sync-password=slavepassword init file:///path/to/repository https://url.to.svn/repository
Polecenie zakończy się komunikatem:
Copied properties for revision 0.
Dodatkowo, możemy zweryfikować czy synchronizacja została skonfigurowana prawidłowo przy pomocy polecenia:
svn propget svn:sync-from-url --revprop -r 0 file:///path/to/repository
Polecenie zwróci adres głównego repozytorium. W naszym przypadku to:
https://url.to.svn/repository
Synchronizujemy repozytorium:
svnsync sync file:///path/to/repository
W moim repozytorium była tylko jedna rewizja, więc synchronizacja zakończyła się komunikatem:
Committed revision 1. Copied properties for revision 1.
Zanim zaczniemy testować zatwierdzanie zmian, upewniamy się, że Apache posiada zainstalowany i aktywny moduł proxy i proxy_http:
a2enmod proxy
a2enmod proxy_http
/etc/init.d/apache2 restart
Tworzymy kopie robocze repozytorium z serwera master oraz slave. Modyfikujemy kopię roboczą pobraną z serwera slave i zatwierdzamy zmiany. Zatwierdzanie zmian powinno wykonać się poprawnie. Teraz możemy uaktualnić kopię z serwera master, ta operacja również wykona się poprawnie, ale odświeżenie kopii z serwera slave zakończ się błędem:
Error: REPORT of '/svn/test/!svn/vcc/default': Could not read chunk size: Secure Error: connection truncated (https://url.to.repository)
Sprawdzenie dziennika błędów Apache’a da nam wskazówkę co poszło nie tak:
tail /var/log/apache2/error.log
A failure occurred while driving the update report editor [500, #160006] No such revision 4 [500, #160006]
Automatyczną synchronizację możemy wykonywać przy pomocy hooków w głównych repozytoriach.
Aby uniknąć pytań o zapisywanie haseł:
----------------------------------------------------------------------- ATTENTION! Your password for authentication realm: Subversion Repositories can only be stored to disk unencrypted! You are advised to configure your system so that Subversion can store passwords encrypted, if possible. See the documentation for details. You can avoid future appearances of this warning by setting the value of the 'store-plaintext-passwords' option to either 'yes' or 'no' in '/root/.subversion/servers'. ----------------------------------------------------------------------- Store password unencrypted (yes/no)?
w pliku /root/.subversion/servers należy odszukać linię „# store-plaintext-passwords = no” i usunąć komentarz (znak #) z początku linii.
Błąd związany z wersją
Rozwiązaniem poniższego problemu:
svnsync: warning: W200007: Target server does not support atomic revision property edits; consider upgrading it to 1.7 or using an external locking program svnsync: E000022: Couldn't get lock on destination repos after 10 attempts
Jest skasowanie blokady:
svn propdel --revprop -r0 svn:sync-lock file:///path/to/repository
Linki
http://www.slideshare.net/normanmaurer/apacheconeusvnreplication
http://stackoverflow.com/questions/4077601/svnsync-couldnt-get-lock-on-destination-repos