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