Una (pero no la principal) de las ventajas de utilizar subversion es que sirve como una herramienta de respaldo de código. Cuando uno mantiene respaldos, es importante que dichos respaldos sean almacenados en instalaciones diferentes a la fuente de información original, esto permite afrontar situaciones extremas como incendios o terremotos.
Esta condición básica de seguridad no se da en mi caso ya que en mi empresa nuestro servidor subversion está en las mismas instalaciones donde trabajamos, por lo tanto nos vimos enfrentados al problema de respaldar en servidores remotos para lo cual implementé un mecanismo de mirroring de subversion mediante el comando
svnsync
.Modelo de operación
El mecanismo que escogí para respaldar subversion es un mirroring que se actualiza cada vez que se hace COMMIT en el repositorio maestro, replicando los cambios en el servidor de respaldo. Este modelo de respaldo tiene las siguientes características:
- El mirror está siempre al día.
- El mirror es actualizado sólo con los deltas enviados en el COMMIT por lo que la transferencia de datos es mínima.
- En caso de pérdida del servidor principal, basta con sacar una copia del mirror para poder restaurar el servidor principal.
- El mirror presta las mismas funcionalidades del servidor principal con la excepción que es de sólo lectura.
En términos resumidos la implementación del mirroring se realiza sacando una copia del repositorio, instalarla en un servidor de respaldo y finalmente se configura el servidor principal para que luego de cada COMMIT se ejecute el comando
svnsync
que replicará todos los cambios en el servidor de respaldo (mirror).Prerrequisitos
Se asume que tienes conocimientos básicos de LINUX y de cómo administrar un servidor subversion, en caso que no seas muy experimentado puedes consultar el manual de subversion.
IMPORTANTE: El procedimiento aquí descrito se enfoca en el proceso de creación y configuración del mirror. Debes asegurarte de realizar las configuraciones de control de acceso y seguridad necesarias.
Debemos contar con dos servidores (principal y respaldo) que tengan instalado subversion 1.4 o superior, es deseable que ambos servidores tengan la misma versión.
El repositorio a respaldar lo vamos a denominar
proyecto
. En los ejemplos, el servidor de mirror usará el nombre de dominio mirror.com
.Procedimiento de configuración
El primer paso es crear el repositorio principal (si ya tienes un repositorio que quieres respaldar, puedes omitir este paso).
svnadmin create proyectoLuego, hacemos una copia del repositorio recién creado, lo comprimimos y eliminamos la copia temporal. (Utilizamos hotcopy para evitar eventuales errores si justo al momento de hacer la copia alguien realizó un COMMIT en el repositorio):
svnadmin hotcopy proyecto proyectobackupA continuación transferimos el archivo comprimido al servidor de respaldo, donde lo descomprimimos y restauramos el nombre del repositorio a
tar cfz proyectobackup.tgz proyectobackup
rm -rf proyectobackup
proyecto
:tar xfz proyectobackup.tgzAhora configuramos el repositorio mirror para no permitir que los usuarios hagan COMMIT, solamente se permitirá que haga COMMIT una cuenta de usuario especial que llamaremos
mv proyectobackup proyecto
cd proyecto
syncuser
, con contraseña secret
(debes definir escoger otra contraseña) y le damos permisos de escritura completos:echo "syncuser = secret" >> conf/passwd(las ultimas 2 lineas son un solo comando)
echo "[/]
syncuser = rw" >> conf/authz
Para evitar que el resto de usuarios pueda hacer COMMIT creamos el archivo (con permisos de ejecución)
hooks/start-commit
dentro del repositorio con el siguiente contenido:#!/bin/shLuego debemos crear el script (con permisos de ejecución)
USER="$2"
if [ "$USER" = "syncuser" ]; then exit 0; fi
echo "No se permite hacer commit en el repositorio de respaldo" >&2
exit 1
hooks/pre-revprop-change
el cual es requerido por el comando svnsync
:#!/bin/shCon estos pasos hemos creado una copia del repositorio
USER="$3"
if [ "$USER" = "syncuser" ]; then exit 0; fi
echo "No se permite hacer commit en el repositorio de respaldo" >&2
exit 1
proyecto
, hemos creado el usuario syncuser
y configuramos el repositorio para que nadie más pueda hacer COMMIT. A continuación volvemos al servidor principal.En el servidor principal vamos a configurar el repositorio para indicarle que tiene un mirror (referenciado en el siguiente ejemplo con el nombre de dominio
mirror.com
):svnsync init svn://mirror.com/proyecto svn://localhost/proyecto --username syncuser --password secretFinalmente ejecutamos el proceso de sincronización, el cual copiará los datos hacia el servidor de respaldo:
svnsync sync svn://mirror.com/proyecto --username syncuser --password secretCon estos pasos hemos configurado el servidor principal para que apunte al mirror previamente creado. El paso final es automatizar el proceso de respaldo.
Hay dos estrategias para sincronizar el mirror. La primera es realizar la sincronización en un proceso aparte, por ejemplo todas las noches. La segunda estrategia es que la sincronización se realice inmediatamente después de cada COMMIT.
Alternativa 1: Respaldo asincrónico
Esta estrategia es útil cuando la velocidad del enlace entre el servidor principal y el mirror es muy lenta o cuando los COMMITs que se realizan son muy pesados.
Basta con agregar una linea al cron, a continuación se muestra un ejemplo que realiza la sincronización todas las noches a las 04:15 hrs.:
15 04 * * * svnsync sync svn://mirror.com/proyecto --username syncuser --password secret
Alternativa 2: Respaldo en tiempo real
Esta estrategia tiene la ventaja que el mirror permanecerá siempre actualizado cada vez que hagamos un COMMIT.
Implica editar (o crear) el script ejecutable
hooks/post-commit
y agregarle el siguiente código:
# Determino el nombre del repositorio
NOMBREREPO=$(echo $REPOS | cut -d"/" -f4)
svnsync sync svn://mirror.com/$NOMBREREPO --username syncuser --password secret
Luego de esto tendremos nuestro mirror de subversion configurado.