Zero downtime Subversion

Subversion consente di rendere disponibile un repository a un indirizzo utilizzabile da tutti gli utenti. Ma come si sa le cose si rompono…

Nel caso in cui il server che mette a disposizione il repository subisca un hardware failure come possiamo da un lato avere un backup allineato all’ultima commit e dall’altro rendere disponibile immediatamente il repository agli utenti evitando lunghi periodi di downtime?

Con un semplice hack e un hook di post commit possiamo ottenere un repository clone da sostituire immediatamente a quello sulla macchina danneggiata.

Per prima cosa prepariamo due server: primary.mycompany.com e slave.mycompany.com, e poniamo che primary sia il repository principale, su slave prepariamo un nuovo repository vuoto e lo rendiamo disponibile tramite protocollo http.

Ecco una possibile configurazione del repository:

<Location>
   DAV svn
   SVNPath /var/lib/svn/repo
   AuthType Basic
   AuthName "Subversion Repository"
   AuthUserFile /var/lib/svn/passwd
   AuthzSVNAccessFile /var/lib/svn/access
   require valid-user
   satisfy all
</Location>

Tale configurazione è valida sia per primary che per slave.

Sulla macchina slave creiamo il repository clone con il comando svnadmin come di consueto. Una volta creato il repository clone dobbiamo cambiargli l’uuid. L’uuid di un repository è una stringa che contiene l’identificativo univoco di un repository generata al momento della creazione. Il client Subversion controlla che l’uuid del repository che si sta conttatando sia quello da cui la working copy è stata creata, per questo motivo bisogna sostituirlo con quello del repository master.

Per ottenere l’uid del repository master possiamo utilizzare il comado svn info http://primary.mycompany.com/repo, il risultato sarà simile a questo:

# svn info http://primary.mycompany.com/repo
Path: repo
URL: http://primary.mycompany.com
Repository Root: http://primary.mycompany.com/repo
Repository UUID: 41c2915e-32ce-4739-91e1-966d5c2fcc64
Revision: 58056
Node Kind: directory
Last Changed Author: admin
Last Changed Rev: 58056
Last Changed Date: 2009-04-30 15:35:52 +0200 (Gio, 30 Apr 2009)

L’UUID di un repository è salvato in [REPO_PATH]/db/uuid e possiamo aggiornarlo con 1 comando

# svn info http://primary.mycompany.com | grep UUID | awk '{ print $3 }' > /var/lib/svn/repo/db/uuid

Assumendo di avere i privilegi necessari e di aver creato il repository in /var/lib/svn/repo

A questo punto abilitiamo su primary l’hook di post commit e ci inseriamo l’esecuzione di svnsync, questo post parla di svnsync e di come utilizzarlo.

Leave a Reply

  

  

  

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>