El post que buscas se encuentra eliminado, pero este también te puede interesar

Sincronizando archivos entre 2 Debian Servers con Rsync

Anuncios

Tras haber optado por Rsync como la solución para tener sincronizados los archivos de aplicaciones que residan en mas de un box, explicaré brevemente cómo instalar y utilizar esta herramienta. Antes de pasar abrir la terminal, veamos en qué situaciones Rsync puede ser de utilidad.

La acostumbrada Introducción

Tomemos a modo ilustrativo mi caso: una aplicación web PHP/MYSQL sobre LAMPP (Debian Squeeze) a la que  por cuestiones de alto tráfico debi agregarle un nuevo Box con una copia idéntica de la aplicación en servidor original. Es decir, todo lo que antes estaba en un dedicado se encuentra ahora en 2 dedicados y, Load Balancer con Hardware de por medio, mis visitas serán dirigidas a uno u otro servidor según la carga que estos tengan (si el Box 1 se encuentra con un Server Load alto, la aplicación será servida desde el Box 2).

Debido a que no es menester de este artículo explicar cómo se ha resuelto la sincronización de la capa de Datos, diré simplemente que opté por configurar las Bases de datos con Replicación Master-Master y los necesarios auto_increment_offsets para evitar conflictos de índices autoincrementados.  Hace algunas semanas escribi un artículo acerca de cómo Replicar Master-Slave y, tal cual prometi entonces, escribiré en breve otro en que se explique cómo configuré mis Mysql Servers.

Mi aplicación maneja un gran volumen de datos de usuarios (los usuarios pueden cargar documentos de hasta 10MB sin límite de espacio en HHDD). Dado que almacenar y servir estos archivos en mis servidores implicaría un consumo de Bandwith considerable, he elegido almacenar con Amazon S3, por lo que tampoco importa aquí sincronizar los GB de archivos de usuarios.

Desde el comienzo he intentado diseñar mi aplicación para que el día en que llegara la hora en que 1 dedicado no fuera suficiente agregar otro/s y mantenerlos sincronizados no fuera un dolor de cabeza y es en esta dirección en que almacenar archivos de usuarios en servidores estáticos o soluciones como la de AWS S3 constituyen una buena práctica: mis servidores alojan nada más que la aplicación web.

Entonces (aquí viene el problema) ambos servidores deben tener copias exactas de los archivos y llega el momento en que "hay que subir nuevos features o fixes a la aplicación". Uno podría pensar "no hay problema, me conecto al server 1 via FTP y subo los nuevos componentes, luego conecto al segundo y repito la operación y listo".  Esto funcionará pero a más compleja la aplicación la tarea será tediosa. Además -y esto es lo realmente importante- los uploads a mano vía FTP no garantizan en nada lo más importante: la sincronización absoluta de los contenidos.
Rsync nos permitirá simplificar esta tarea y garantizar contenidos idénticos con sólo correr un comando; por lo que la rústica alternativa de estar cargando vía FTP los addons en cada server se torna - en este escenario - obsoleta.

Ok, decime rápido qué hace Rsync!

Rsync toma una locación (una carpeta) y envía sus contenidos a otra locación que puede o no estar en el mismo Servidor. Si en ambas locaciones los contenidos son identicos Rsync no moverá nada, pero calquier cambio detectado en el origen respecto al destino será trasladado al destino de inmediato. El resultado: sincronización, contenidos idénticos, la posibilidad de cargar los nuevos componentes al servidor 1, correr Rsync y tener la certeza de que servimos exactamente lo mismo en los 2 (o más) servers.
Por último, aunque de fundamental importancia, Rsync mueve los archivos de un servidor a otro a gran velocidad y utilizando SSH para garantizar la protección de los ficheros enviados (que muchas veces pueden contener información sensible cómo claves de acceso, keys de web services, etc).

Instalando y configurando Rsync

Antes de comenzar describamos rapidamente nuestro escenario y recordemos que los pasos que llevaremos a cabo deben realizarse en ambos servidores. Aquí explicaremos la configuración en Server 1 y haremos referencia a discrepancias respecto a lo que debe hacerse en Server 2 sólo cuando existan diferencias.

1- Server1: 192.168.1.33 (Lampp on Debian Squeeze)
2- Server2: 192.168.1.34 (Lampp on Debian Squeeze)

carp@server1:~$ su root
ingresamos pass de root
root@server1:/# apt-get install rsync

Una vez instalados los paquetes en ambos servidores, debemos crear una serie de archivos para configurar el comportamiento de Rsync. El primero de estos se llamará rsyncd.conf y debe crearse en /etc:

root@server1:~$ pico /etc/rsyncd.conf
Pico abrirá el fichero en blanco para que ingresemos los parametros de configuración. A continuación mostraré cómo lo he configurado en mis servidores. Pueden averiguar más acerca de los parametros de este fichero visitando la man page del archivo en FreeBSD Man Pages

max connections = 1
log file = /var/log/rsync.log
timeout = 300
[server1]
comment = Sincronizacion de contenidos
path = /home/carp/public_html/www.misitio.com/htdocs
read only = no
list = yes
uid = nobody
gid = nogroup
auth users = server1
hosts allow 127.0.0.0/8 192.168.1.0/36
secrets file = /etc/rsyncd.secrets

El fichero a crear en Server 2 debe ser idéntico a este con la salvedad de que [server1] debería ser así como auth users (que será server2 en el segundo box). En mi caso los paths son idénticos en ambos boxes por lo que el parametro no cambia, éste valor debe reflejar la ubicación en que los contenidos a sincronizar se encuentran en ambos servers por lo que, de tener origen y destino en distintos lugares, habrá que proporcionar en cada caso el path correspondiente. Es importante, también, contemplar que hosts allow incluya en su rango al Servidor 2 y viceversa.

Los parametros del fichero hablan por si mismos y no merecen comentario aunque si una aclaración relativa a Debian: en esta distribución el grupo nobody no existe, por lo que gid debe ser nogroup.

Habiendo creado el fichero de configuración procedemos a crear el segundo fichero requerido por Rsync: rsyncd.secrets. Este fichero contendrá el usuario (server1) y la clave que elijamos para el mismo con formato user:clave. Debido a que la clave no posee ninguna clase de encriptación una vez creado el fichero lo protegeremos con chmod 600. Sin más preludios:

root@server1:/# pico /etc/rsyncd.secrets
pico abre el fichero en blanco y escribimos
server1:miclave
guardamos el fichero y lo protegemos
root@server1:/# chmod 600 /etc/rsyncd.secrets

Repetimos la operación en Server2 definiendo el user server2:otraclave y protegiendo con chmod 600.
Con esto tenemos Rsync configurado. A continuación queremos que Rsync corra en daemon mode. Para el caso de Debian debemos buscar el fichero /etc/default/rsync y editarlo. Al principio de este fichero encontraremos que RSYNC_ENABLE está seteado a false. Cambiamos ese valor a true (RSYNC_ENABLE = true) y dejamos el resto de los valores tal cual están. Guardamos cambios en ambos servers.

Por último y finalizando la configuración de Rsync, debemos agregarlo a nuestros servicios en /etc/services. En mi caso -y creo que en la mayoría- Rsync ya se encontraba listado en services: rsync 873/tcp y rsync 873/udp. Si esté no estuviera listado lo agregamos ingresando los valores en negrita uno debajo del otro en la lista.

Hecho esto resta reiniciar Rsync y ya podemos comenzar a probar su funcionamiento.

root@server1:/# /etc/init.d/rsync restart
Sincronizando

Para comprobar que hay comunicación entre los boxes 1 y 2 podemos solicitar el listado de los contenidos que hay en el destino (Server 2) y viceversa:

root@server1:/# rsync rsync://server2@192.168.1.34/server2/ 
pide la contraseña del user server2 (rsyncd.secrets) y devuelve un listado simil ls 

Por último, y para lo que leímos hasta acá -¿alguien ahí?- procedemos a sincronizar los contenidos desde Server1 a Server2:

root@server1:/# rsync -raz --progress --size-only ssh /home/carp/public_html/www.misitio.com/htdocs/* 192.168.1.34:/home/carp/public_html/www.misitio.com/htdocs/
pide la clave de root de Server2 (no la definida en rsyncd.secrets) y comienza a transferir 


Tranfiere rápido verdad? Veamos un poco los flags utilizados:
- r: recursivo
- a: archivo, preserva atributos tales como propiedad, timestamps, etc
- z: comprimir, si bien ahorra Bandwith se la cobra al CPU
- progress: muestra el progreso de la transferencia de cada archivo
- size-only: compara los archivos a patir del tamaño

Pruébenlo. Creen o modifiquen algún archivo en Server1, corran el comando y las modificaciones impactarán al instante en el Server 2.

Dada la longitud del comando y el hecho de que cuando uno carga nuevos componentes a un Server está, generalmente, ansioso por que esos componetes propaguen al resto de los Servers rapidamente, es recomendable (al igual que para toda tarea de mantenimiento que implique una rutina en consola) crear un script en Perl que se limite a hacer system del comando de modo que la sincronizacion pueda echarse a rodar sin tener que escribir el comando (ansiedad = dedos que tipean cualquier cosa).

Crear un script de esta clase sería tan sencillo como:

root@server1:/# pico /scripts/sync
se abre archivo en blanco: escribimos
#!/usr/bin/perl
system "rsync -raz --progress --size-only ssh /home/carp/public_html/www.misitio.com/htdocs/* 192.168.1.34:/home/carp/public_html/www.misitio.com/htdocs/";
guardamos el archivo y lo hacemos ejecutable
root@server1:/# chmod 0777 /scripts/sync
ahora podemos iniciar la sincronización con nuestro script
root@server1:/# ./scripts/sync


Eso es todo =)
Publicado originalmente en mi Blog: http://www.danieldemichele.com.ar/2011/11/10/sincronizando-archivos-entre-2-servidores-con-rsync/

Anuncios

0 comentarios - Sincronizando archivos entre 2 Debian Servers con Rsync