Realizar copias de seguridad es importante. Yo lo que tengo son varios servidores con sus datos que envían su backup a un servidor central, el cual, cuando las recibe toda pues las graba en un NAS externo, en cintas, o en lo que sea.
Esto implica que los diversos servidores (windows y linux) necesitan comunicarse con el servidor central (linux). Yo lo hago manualmente con ssh. Veamos como lo hacemos en linux (en windows con winscp va de coña):
El servidor que tiene los datos los empaqueta y los envia al servidor central. En este servidor hacemos:
ssh-keygen -t rsa
Dejamos el nombre por defecto (.ssh/id_rsa) y sin passphrase. Esto nos crea en el directorio .ssh los archivos id_rsa y id_rsa.pub
2. Copiar la llave publica al servidor de destino
Para que el servidor central de copias autentifique al servidor emisor es necesario que en su .ssh/authorized_keys tenga la llave publica del emisor. Lo podemos hacer así desde el propio servidor emisor:
$emisor> cat .ssh/id_rsa.pub | ssh copia@10.0.0.6 'cat >> .ssh/authorized_keys'
es necesario, claro, que el servidor receptor ya tenga creado el directorio .ssh en el usuario copia (en este caso).
A partir de ahora el servidor emisor ya puede acceder sin pass como usuario copia en el servidor central.
3. Ejemplo script de copia
4. Rsync
Rsync es un programilla que sincroniza directorios ya sean locales o remotos. Para mi caso es suficiente hacer lo siguiente para mantener toda una estructura de directorios copiada remotamente.
rsync -arvz --delete origen/ user@servidor-remoto:/path/
Funciona francamente bien cuando los directorios no cambian mucho, por lo que entonces lo que se ha mantenido inalterable no hace falta copiarlo y por tanto ahorramos ancho de banda y tiempo.
Ojo! con la barrita final del directorio origen
5. Copias incrementales
En el punto 3 es un script ineficiente desde el punto de vista que si algo se modifica comprime todo el directorio y lo envia al server de copias y si no se modifica nada (fines de semana) se ahorra el paso. PERO, por otro lado puede existir un script que se cargue los backups muy viejos (el espacio es limitado) cosa que como resultado puede provocar que con el paso del tiempo y un directorio no se modifique.... se pierda.
#!/bin/bash data=$(date +%F) #borrem el contingut del directori desti ssh copia@10.0.0.6 "rm -rf documents/*.tar.bz2" #copiem els privados for i in `ls /home`; do num=$(find "/home/$i" -mtime -1 | wc -l) if [ $num -gt 0 ]; then tar --bzip2 -cvf - /home/$i | ssh copia@10.0.0.6 "cat > documents/$data-$i.tar.bz2" fi done
4. Rsync
Rsync es un programilla que sincroniza directorios ya sean locales o remotos. Para mi caso es suficiente hacer lo siguiente para mantener toda una estructura de directorios copiada remotamente.
rsync -arvz --delete origen/ user@servidor-remoto:/path/
Funciona francamente bien cuando los directorios no cambian mucho, por lo que entonces lo que se ha mantenido inalterable no hace falta copiarlo y por tanto ahorramos ancho de banda y tiempo.
Ojo! con la barrita final del directorio origen
5. Copias incrementales
En el punto 3 es un script ineficiente desde el punto de vista que si algo se modifica comprime todo el directorio y lo envia al server de copias y si no se modifica nada (fines de semana) se ahorra el paso. PERO, por otro lado puede existir un script que se cargue los backups muy viejos (el espacio es limitado) cosa que como resultado puede provocar que con el paso del tiempo y un directorio no se modifique.... se pierda.
- Modificar el script de limpieza que guarde almenos 1 semana
- hacer un full backup el lunes y el resto de días una copia incremental de la copia del lunes.
#!/bin/bash SPOOL="/var/spool/copia" data=$(date +%F) dia=$(date +%u) FULLDAY=2 OK=0 MAIL="" # Existe la spool? if [ ! -d $SPOOL ]; then mkdir -p "$SPOOL" fi # si es el dia de FULL -> borramos los .snar if [ $dia -eq $FULLDAY ]; then find $SPOOL -iname "*.snar" -exec rm -f '{}' \; find $SPOOL -iname "*.1" -exec rm -f '{}' \; fi #borrem el contingut del directori desti ssh copia@10.0.0.6 "rm -rf documents/*.tar.bz2" #copiamos los privados for i in `ls /home`; do # si es el dia FULL -> FULL backup if [ $dia -eq $FULLDAY ]; then tar -g "$SPOOL/$i.snar" --bzip2 --ignore-failed-read -cf - /home/$i | ssh copia@10.0.0.6 "cat > documents/$data-$i.full.tar" OK=$? echo "FULL OK: $OK - $?" cp "$SPOOL/$i.snar" "$SPOOL/$i.snar.1" # sino -> INCREMENTAL else cp "$SPOOL/$i.snar.1" "$SPOOL/$i.snar" tar -g "$SPOOL/$i.snar" --bzip2 --ignore-failed-read -cf - /home/$i | ssh copia@10.0.0.6 "cat > documents/$data-$i.incr.tar" OK=$? echo "INCR OK: $OK - $?" fi echo "OK: $OK " if [ $OK -ne 0 ]; then MAIL=$MAIL"\n$(date +%T) $i -> NOT OK" else MAIL=$MAIL"\n$(date +%T) $i -> ok" fi done echo -e "$MAIL" | mail -r root@dataserver -s "[DATASERVER] backup" admin@example.org
Comentarios