miércoles, 20 de octubre de 2010

Centos 5: Respaldos con Bacula + MySQL 5.1.

Esta vez le toca el turno a el tema de los respaldos. Yo siempre he tratado de usar codigo libre para hacer lo que sea posible en un departamento de sistemas. Y como toda area de informatica, necesitamos respaldos.

Me vi un dia a la tarea de buscar que software podriamos usar para respaldas los servidores, encontre varias opciones:
  • amanda
  • rsync
  • tar
  • bacula
De todas ellas la que mas me lleno el ojo fue bacula, ya que existen clientes para una gama de sistemas operativos:
  • Windows
  • Linux
  • Mac
  • Unix
Lo cual lo hizo un contendiente vs symantec backup.

Utilizabamos veritas(que ya lo compro symantec creo yo) pero como todo software hecho para windows no tiene clientes para Linux/Unix y ademas que en el servidor de respaldos tenia que mapear todos los compartidos que ocupaba respaldar.

No es nada amigable, buscar otra alternativa era invertir una gran cantidad de dinero, licencias, etc. Con bacula me olvide de todo eso.

Otra cosa que los demas no tienen hablando del mundo de open source es no poder
hacer uso de una virtud que aparecio en windows 2000 en adelante llamada "Shadow Copy".

Esta funcion lo que hace es crear un respaldo de windows incluyendo los archivos abiertos, bacula puede hacer que las versiones que tienen esta utileria lo hagan y cuando terminan le envian el achivo a bacula, que gran cualidad de bacula.

En Linux/Unix no tenemos ese problema que ataca Redmont con esta funcion.

Otra gran caracteristica de Bacula es la gran gama de medios de almacenamiento que soporta, como todo inicia con Linux, pues ellos le dejaron la tarea a Linux y no se amarraron a tener que crear los latosos "Drivers" si no que le dejaron la tarea a Linux/Unix, a que me refieron con esto, cualquier medio de almacenamiento que soporte Linux/Unix sera bien recibido por Bacula como pueden ser:
  • Disco Duro- Externo e Interno, USB/Ata/Sata/Solido etc etc.
  • Quemadores de CD/DVD
  • Memorias USB
  • Unidades de Cinta - Internas/Externas
  • Floppies
En fin, si pueden almacenar informacion en Linux/Unix bacula la podra usar.

Y ademas que el demonio de almacenamiento(luego hablo de el) de bacula no necesita estar donde esta el director(luego hablo de el) podemos tener un servidor de bacula y otro de almacenamiento solamente, asi de flexible.

Modulos de Bacula

Bacula esta disenado inteligentemente, existen los siguientes modulos y cada uno tiene su funcion:

Director: El director es el administrador de todo llamado bacula-dir, medios de almacenamiento que son administrados por el demonio de almacenamiento llamado bacula-sd, comunicacion con los clientes, administrar la agenda de tareas, informarnos de errores, tareas hechas, o sea toda la operacion el la controla por ello el nombre de director.

Almacenamiento: Este modulo llamado tecnicamente bacula-sd se encarga de administrar todos los medios de almacenamiento, cuando el director necesita sacar o meter informacion se comunica con este modulo y el hace la tarea. Puede o no residir donde esta el director, depende totalmente del hosts donde esta para hacer uso de los medios de almacenamiento.

Consola: Llamado tecnicamente bconsole, este modulo es la interface que tenemos los administradores de bacula para poder interactuar con el director, los clientes, bacula-sd.

Clientes: Llamado bacula-fd, es el modulo que cada cliente debe tener instalado para poder ser respaldado, cuando el Director necesita respaldar o restaurar algun directorio o archivo se comunica con este modulo.

Lo anterior son los actores que nos vamos a encontrar a la hora de trabajar con bacula, algo que me gustaria notar es que cada modulo tiene su archivo de configuracion, estos son:
  • Director ---> bacula-dir.conf
  • Almacenamiento --> bacula-sd.conf
  • Clientes --> bacula-fd.conf
  • Consola --> bconsole.conf
Para entender un poco mas como opera bacula, vamos a hablar un poco de que son los pools y volumenes, porque mas adelante se los van a encontrar, ya cuando lleguen a donde los tienen que usar tendrar un mejor panorama de como configurarlos.

Pools y Volumenes

Bacula como mencione, almacena todo en una BD, de ahi siguen los pool, que vienen siendo
contenedores de volumenes, los volumenes son ya los medios donde se almacenan los archivos a respaldar. Entonces tenemos que:

1 Pool puede contener N numero de volumenes, un volumen fisicamente es ya el medio de almacenamiento, si estamos usando el mismo disco duro, y tengo un volumen llamado "FullFile-0001", en mi directorio donde guardo mis backups, tendre esto:

-rw-r----- 1 bacula bacula 20781361 Nov 3 18:51 FullFile-0001

Un archivo con ese nombre, si fuera una cinta, entonces tendria una cinta etiquetada con ese nombre, etc, etc. Espero les haya quedado claro eso.

Ahora bien, uno puede tener cuantos Pools desea, yo por ejemplo tengo 2 en este ejemplo, 1 para mis Full Backups y otro para mis Difrenciales(luego vamos a llegar a esto), y cada uno de ellos tienen sus volumenes, cuantos tengo, depende de como los configuren y la capacidad de sus medio de almacenamiento.

Aqui estan mis Pools:

*list pools
+--------+---------------+---------+---------+----------+-------------+
| PoolId | Name | NumVols | MaxVols | PoolType | LabelFormat |
+--------+---------------+---------+---------+----------+-------------+
| 1 | BajaOFullFile | 1 | 0 | Backup | FullFile- |
| 2 | BajaODiffFile | 1 | 0 | Backup | FileDiff- |
| 3 | Scratch | 0 | 0 | Backup | * |
+--------+---------------+---------+---------+----------+-------------+

El Scratch aun no he tenido la necesidad de usarlo.

Un punto importante, si observan la columna de nombre "Label Format", cuando bacula inicia un respaldo, y no tiene ningun "Volumen" disponible, hay una opcion de la configuracion que le indicamos que si no tiene de donde agarrar, el tiene la autoridad de crear uno nuevo, entonces cuando el lo crea, le agrega a este campo un numero consecutivo, vean:
  • FullFile-0001
  • FileDiff-0002
Si fuera necesario agregar otro volumen a mis "Full" backups, el agregaria:

FullFile-0002

Asi sucesivamente, interesante no.

Con esto dejo lo referente a Pools, y Volumenes

Tipo de Respaldos "Level"

Cuando respaldamos, tenemos otra seccion donde tenemos que decirle a el director cual sera nuestra forma de respaldar, aqui tenemos:
  • Full
  • Diferencial
  • Incremental
Full: Aqui no tenemos pierde, bacula agarra todos directorios y archivos indicados y los respalda.

Diferencial: Segun mis entedimientos, cualquier tipo de respaldo excepto Full, debe de existir un respaldo Full antes de llevarse a cabo, aqui entran todos los demas, como el diferencial, incremental, verificador. Ahora el diferencial, lo que hace es solo respaldar los archivos que han cambiado(fecha de apertura mas nueva) en base a el ultimo Full, por ejemplo, si mi Full de ayer tiene un archivo de nombre "Test.txt, y hoy cuando mi diferencial se ejecute ese archivo tiene la fecha de hoy, bacula lo respaldara. Si mi Full fue la semana pasada, bacula compara los archivos que han cambiado en base a el ultimo Full. Asi cuando restauremos un sistema completo, solo necesitaremos el ultimo Full + ultimo diferencial.

Incremental: Aqui a diferencia del diferencial, este respalda los archivos que han cambiado en base a el ultimo respaldo, sease Full o incremental, asi que si necesitaramos restaurar un sistema completo, necesitaremos el ultimo Full+ todos los incrementales despues de ese Full, con esto ya podran darse cuentad de la diferencia entre un Diferencial e Incremental.

Configuracion

Ahora viene la parte mas compleja, la configuracion.

Pero antes de entrar a esta parte que a la mayoria siempre le interesa, vamos a especificar los sistemas que vamos a respaldar:

A; Centos 5.5 192.168.50.130 --->Aqui se ejecuta el bacula server.
B; Centos 5.5 192.168.50.103 ---> Aqui ejecuto el servidor mysql.
C; Centos 5.5 192.168.50.4
D; Windows XP Pro 192.168.50.122
E; Windows 7 Ultimate Edition Cliente 192.168.50.121

Como podran ver les voy a mostrar una confiracion que se usa comumente en produccion.

El servidor sera Centos, asi que tambien tiene que respaldarse por ello lo incluyo. Como nota Centos por default no tiene a Bacula en sus paquetes, necesitamos compilarlo desde las fuentes.

La base de datos esta otro servidor.

Para ello tenemos este link, ya lo hice y funciona:

Compilar Bacula 5.0.2 en Centos 5.5

Yo lo hice con la ultima verion 5.0.3.

Algo que me gustaria marcar es que el link habla hacerca de wxconsole, php, esto va enfocado a un sistema con GUI, lo cual conmigo no aplica, ya que un servidor que yo levante raramente tendra un modo grafico al menos que sea Windows, pero no es mi caso.

Por ello yo no agregue paquetes que se estan enfocados a GUI:
  • php
  • qt
Mientras menos paquetes, menor probabilidad de ser atacado por bugs.

Otra cosa, Centos viene con MySQL 5.0 el cual ya hace tiempo dejo de ser actualizado al menos que sea por bugs, por ello yo baje el RPM directamente de Mysql:

Community Edition 5.1

Por seguridad cuando se instala bacula en Centos, el se encarga de configurar la BD en MySQL, en FreeBSD uno tiene que hacerlo, pero ninguno de los 2 sistemas le ponen password a el usuario bacula de la BD, por ello les recomiendo que lo hagan.

Ya tenemos un mejor panorama de lo que necesitamos, no voy a pasar por la instalacion de los paquetes o compilacion ya que los links son muy claros, si tienen dudas claro que les podre ayudar.

Todo lo que sigue es referente a la configuracion del servidor, a el final vamos a ver los clientes.

Director

Es el archivo mas complejo ya que aqui se juntan todos los modulos, clientes, base de datos, etc. No se asusten, voy a tratar de explicar cada una de las entradas hasta donde mi entendimiento me deje.

Este archivo esta divido en secciones, cuando instalan bacula la configuracion nos da por default un archivo de nombre bacula-dir.conf.sample, todos los archivos de bacula deben terminar en .conf.

Esta es la 1ra seccion:

NOTA: Aqui ya voy a mostrar la configuracion tal cual la tengo en uno de los servidores que respaldo.

Director { # define myself
Name = bacula-dir
DIRport = 9101 # where we listen for UA connections
QueryFile = "/usr/lib/bacula/query.sql"
WorkingDirectory = "/var/lib/bacula"
PidDirectory = "/var/run"
Maximum Concurrent Jobs = 20
Password = "mi-password" # Console password
Messages = Daemon
}

Detalles:
  • Name: una cadena de texto abierta, cada quien le pone como guste, asi lo van a conocer todos los clientes.
  • DIRport = Por default el director usa el puerto 9101, no lo cambien al menos que tengan alguna razon.
  • QueryFile = Ya esta hecho no cambiarlo.
  • WorkingDirectory = Directorio que bacula usa para sacar la chamba, logs, bsr, etc, usar el default.
  • PidDirectory = Los unixeros saben que esto, asi dejenlo.
  • Maximum Concurrent Jobs = Cuantos jobs al mismo tiempo, prueba y error les dira, cuando quieran respaldar mas de un cliente a la vez tiene que jugar con este valor hasta conseguir su objetivo.
  • Password = Cuando quieran comunicarse con el director este password necesitaran, cambienlo a su gusto.
  • Messages = A donde mandar los mensajes, por default a el mismo demonio.
Jobs de Respaldo

Los jobs es lo que bacula usa para configurar las parametros escenciales de cada cliente, ya muchos campos que aparecen los he mencionado, seguimos.

Tenemos 2 tipos aqui, un JobsDefs y Jobs, el 1ro es como una plantilla, la uso por que todos mis clientes tienen muchas opciones en comun, el 2do es ya la configuracion de cada uno de mis clientes, y si se dan cuenta en esta opcion hago un llamado a "JobsDefs".

JobDefs {
Name = "DefaultJob"
Type = Backup
Level = Full
Storage = File
Messages = Standard
Pool = FullFile
}

Definicion.

Name = Entre comillas, nombre de mi plantilla.
Type = Tipo de jobs puede ser, Backup, Restore, Verify, Admin.
NOTA: Cuando vamos a respaldar:Backup, cuando vamos a recuperar datos:Restore, cuando deseamos comparar el contenido de nuestro respaldo vs los archivos reales:Verify, el otro nunca lo he usado.
Level = Ya hable de este.
Storage = Nuestro medio de almacenamiento.
Messages = Tipo de mensaje que enviara cuando termine el jobs ya sea bueno o malo, a correo o archivo. Dejar el que viene por default.
Pool = Ya hable de el.
Priority = Cada job tiene una prioridad, asi que a cada uno le asignamos uno, aqui nunca he tenido problemas, ya que yo ejecuto un cliente a la vez.

Ya tenemos nuestra platilla, ahora sigue definir los jobs, aqui es donde uso mi JobsDefs o mi platilla.

Jobs Para Cliente A
Job {
Name = "BackupXen"
JobDefs = "DefaultJob"
Write Bootstrap = "/var/lib/bacula/xenserver.bsr"
Client = XENSERVER-FD
FileSet = "XENSERVER-FS"
Schedule = "XENSERVER-SCH"
Priority = 11
}

NOTA: Asi es estoy respaldando un linux donde tengo corriendo a Xen para virtualizar.

Definicion:
Name = "" enter comillas, ya saben libre el nombre, consejo que sea el nombre referente a el cliente que van a respaldar, el mio dice BackupXen , entonces eso me dice quien es rapidamente.
JobDefs = "" entre comillas, le hablo a mi plantilla, ya hable de esto anteriormente.
Write Bootstrap = "" entre comillas, es archivo que usa bacula para cada cliente, cuando va a restaurar.
Client = Ahora si, el nombre de mi cliente, existe una configuracion con este nombre, bacula la va a buscar, mas abajo la van a ver.
FileSet = "" entre comillas, igual que la anterior, es donde defininimos lo que vamos a respaldar.
Schedule = "" entre comillas, igual que la anterior, es donde indicamos la agenda a seguir automaticamente.
Priority = Ya le explique.

Jobs de Recuperacion

Asi como existen Jobs para los backups, tenemos que generar los contrarios o sea para recuperar nuestros datos, y aplica lo mismo, podemos tener una plantilla o mas plantillas segun sus gustos.

Tenemos esto:

JobDefs {
Name = "RestoreFiles"
Type = Restore
Storage = File
Pool = FullFile
Messages = Standard
}

Name = un nombre caracteristico.
Type = Restore, no hay de otra aqui.
Storage = Nuestro medio de almacenimiento de donde vamos a sacar los datos.
Pool = Ya se la saben.
Messages = Ya se la saben.

Job Restore Para Cliente A

Job {
Name = "RestoreXENSERVER"
JobDefs = "RestoreFiles"
Client = XENSERVER-FD
FileSet = "XENSERVER-FS"
Where = "/opt/restore"
}

El parametro "Where" lo que dice es para este cliente donde queremos que mande los archivos cuando se restauren. Asi que debe exister ese directorio en el cliente. Yo lo hago para cuando obtengo los datos no sobre escribir los datos actuales.

Hasta aqui ya hemos visto parte de la configuracion, espero ya tengan una idea mas clara de como opera bacula.

File Set

Ahora sigue la seccion donde vamos a indicarle que archivos y directorios deseamos respaldar para cada cliente, van encontrarse con nuevos parametros, algunos ya seran conocidos.

FileSet {
Name = "XENSERVER-FS"
Enable VSS = No
Include {
Options {
signature = MD5
compression = GZIP
}
File = "/etc"
File = "/opt/data"
}
}

NOTA: Poner mucho cuidado en los corchetes {} cuando abrirlos y cerrarlos.

Name = "", arriba en los Jobs definen uno para cada cliente, debe ser el mismo nombre que haya definieron, aqui ya es la configuracion de cada uno de los File Set's.
Include {
Options {
signature = dejar la entrada por default, MD5 es buen algoritmo.
compression = si es en disco, CD,DVD,USB usenla siempre, si es en cinta ponerla en No, ya que la cinta ya tiene compresion por HW, seria innecesario este parametro.
}
File = "" ahora si aqui definimos cada uno de los directorios o archivos a respaldar, no se pueden juntar, ejemplo, tengo un directorio en /var/db y otro en /usr/videos, no puedo hacer esto:
File = "/var/db" "/usr/videos", por cada uno una entrada.
}
}

Hasta aqui hemos trabajado sobre un cliente Linux, voy a mostrar el File Set de un cliente para explicar una funcion que tiene bacula para los clientes Windows, que aparecio apartir de Windows 2000.

Ya posteriormente mostrare todo el archivo completo.

FileSet {
Name = "WINDOWSXP-FS"
Enable VSS = Yes
Include {
Options {
signature = MD5
compression = GZIP
}
File = "C:/Documents and Settings/Administrator/My Documents/"
}
Exclude {
File = "C:/Documents and Settings/Administrator/My Documents/My Music"
}
}

El parametro es:

Enable VSS = yes

Este parametro lo que hace es que antes de empezar a enviar los respaldos, ejecute un "Shadow Copy" de ellos, una vez terminado que los envie.

Otra parte que agregue es:

Exclude, todo lo que aqui se agrege sera ignorado por bacula cuando respalde este cliente. O sea que cuando mande el cliente todos los datos de "My Documents" no mandara todo lo que este dentro de "My Music".

Definicion:
Name = "" Ya sabes el significado.
Enable VSS = Solo para clientes windows Yes / No
Include {
Options {
Aqui van las opciones que deseamos agregar, el manual tiene muchas.
signature = Este parametro no lo toquen nucan he tenido problemas con el.
compression = Deseamos compresion Si o No, Si no estan respaldando en cinta siempre usenlo, ya que cuando se respalda en disco duro, interno, externo, CD, DVD, memorias USB se comprime todo, ahorra espacio. Hacerlo en cinta no es recomendable ya que ya traen compresion por HW, no es recomendable.
}
File = "" Para cada folder o archivo que vayamos a respaldar aqui debemos ponerlo, por cada directorio debe a ver una entrada de estas, no podemos juntarlas asi:
File = /var /usr /etc

Si no que debemos darle a cada uno su entrada asi:
File = /var
File = /usr
File = /etc
}
Exclude {
File = "" aqui ponemos lo que no deseamos respaldar de lo incluido en "Include".
}

Schedule

Aqui vamos a configurar la agenda de bacula, ya que una vez que bacula empiece operaciones, si no existen problemas, el trabajara automaticamente, nomas que necesitamos decirle los horarios para ejecutar cada respaldo, y hay parametros que podemos cambiar si asi lo deseamos.

Schedule {
Name = "XENSERVER-SCH"
Run = mon-fri at 19:00
Run = Level = Differential Storage = File Pool = DiffFile tue-sat at 19:00
}

Definicion:
Name = "", ya saben debe llamarse tal cual lo declararon en el Jobs.
Run = Aque horas lo vamos a ejecutar.

Como podran ver tengo 2 Run, por que? No podemos mezclar, uno para los Full y otro para los diferenciales. Cuando solo pongo la hora, bacula considera los parametros del Job definido, ahora como en mi caso uso un Pool distinto para los diferenciales aqui lo defino como podran ver.

Otro paremetro que puede cambiar es "Storage", en otro servidor tengo una cinta y espacio en disco, tengo 3 Run's asi:

Name = "CATALOG-SCH"
Run = sun at 20:00
Run = Storage = File Pool = FullFile mon at 23:40
Run = Level = Differential Storage = File Pool = DiffFile tue-thu at 21:00

El parametro de la hora nos permite hacer muchas cosas, indicarle un solo dia, varios, cierto dia del mes, de la semana, etc, ejemplo:

tue-thu, que lo ejecute de martes a jueves a las 21:00.
sun, solo el domingo a las 20:00
mon,solo el lunes a las 23:40

Para mas detalles ver el manual.

Clientes

Ahora si viene la configuracion de cada cliente, esta es la informacion que usa el Director para comunicarse con cada cliente.

Client {
Name = XENSERVER-FD
Address = 192.168.50.104
FDPort = 9102
Catalog = MyCatalog
Password = "mi password" # password for FileDaemon
File Retention = 30 days # 30 days
Job Retention = 6 months # six months
AutoPrune = yes # Prune expired Jobs/Files
Maximum Concurrent Jobs = 3
}

Definicion:
Name = Tal cual lo definieron en el Jobs.
Address = Ip o nombre si tienen un hosts o dns funcional.
FDPort = Puerto, los clientes usan el 9102, si quieren otro lo pueden hacer.
Catalog = Nombre de la BD de bacula, yo no he tenido razon de cambiarlo.
Password = "", entre comillas ustedes lo deciden.
File Retention = Cuanto tiempo desean mantener la info en la BD de los archivos para este cliente. Pasando este tiempo bacula los purga para que la BD no crezca demasiado, si tenemos los datos en cinta, aunque los borre aun los podemos recuperar. Este parametro ustedes deben calcularlo bien.
Job Retention = Lo mismo, pero para este jobs, son cosas distintas.
AutoPrune = yes/no, indicarle si deseamos que el purge automaticamente o no para nosotros hacerlo, esto es basado en los parametros anteriores.
Maximum Concurrent Jobs = Ya tendremos la razon de este parametro en la seccion extra.

Storage

Le toca el turno a el medio de almacenamiento, como bacula esta secciona por modulos, aqui solo le indicamos a el Director como comunicarse con el programa que administra los medios de almacenamiento, la configuracion real esta en otro archivo, mas adelante los vamos a ver.

Storage {
Name = File
Address = 192.168.50.130 # N.B. Use a fully qualified name here
SDPort = 9103
Password = "password del sd daemon"
Device = FileStorage
Media Type = File
Maximum Concurrent Jobs = 10
}

Name = File
Address = IP o nombre.
SDPort = Usen el default, al menos que gusten cambiarlo.
Password = "", entre comillas, el que gusten.
Device = Nombre configurado en el archivo bacula-sd-conf
Media Type = Tipo de Medio de almacenamiento.
Maximum Concurrent Jobs = Ya lo mencione anteriormente.

Me gustaria comentar que no hay limite para los servicios de respaldo, podemos tener tantos queramos, por ejemplo si tuvieramos otro servidor donde desearamos enviar datos, solo le indicamos el IP y el password, ese servidor solo debera tener operando el bacula-sd que es nombre del demonio que se encarga delos medios de almacenamiento.

Catalogo

Catalog {
Name = MyCatalog
dbname = "bacula"; dbuser = "bacula"; dbpassword = "mipassword"
}

Sencillo, aqui configuramos los datos para que el director pueda meter o sacar informacion de la BD, muy simple no.

Lo mismo, no necesariamente tenemos que tener nuestro servidor de respaldo donde esta el director, podemos tenerlo en otro equipo, por ejemplo en un sistema de producion, mysql se ejecuta en otro servidor distinto a el de bacula-dir, y mi definicion del Catalogo es asi:

dbname = "bacula"; DB Address =192.168.50.3; dbuser = "bacula"; dbpassword = "passworddelusuario"

Mensajes
Messages {
Name = Standard
mailcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: %t %e of %c %l\" %r"
operatorcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: Intervention needed for %j\" %r"
mail = root@localhost = all, !skipped
operator = root@localhost = mount
console = all, !skipped, !saved
append = "/var/lib/bacula/log" = all, !skipped
catalog = all
}

Messages {
Name = Daemon
mailcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula daemon message\" %r"
mail = root@localhost = all, !skipped
console = all, !skipped, !saved
append = "/var/lib/bacula/log" = all, !skipped
}

Esta seccion no la cambien, bacula manda informacion de todo lo que hace via correo local y aparte en un archivo log.

En mi caso, yo hago uso de mi correo interno, para ello utlilizo el programa llamado "SSMTP", a sendmail lo desinstalo ya que es mucho para lo que necesito. Asi me llega todo a mi cuenta de correo, aqui tengo un ejemplo:

Messages {
Name = Standard
mailcommand = "/usr/sbin/bsmtp -h 192.168.50.7:25 -f \"\(Bacula\) %r\" -s \"Bacula BajaO: %t %e of %c %l\" %r"
operatorcommand = "/usr/sbin/bsmtp -h 192.168.50.7:25 -f \"\(Bacula\) %r\" -s \"Bacula BajaO: Necesito un Favor Para %j\" %r"
mail = root@localhost = all, !skipped
operator = root@localhost = mount
console = all, !skipped, !saved
append = "/var/lib/bacula/log" = all, !skipped
}

Messages {
Name = Daemon
mailcommand = "/usr/sbin/bsmtp -h 192.168.50.7:25 -f \"\(Bacula\) %r\" -s \"Bacula Mensaje Demonial\" %r"
mail = root@localhost = all, !skipped
console = all, !skipped, !saved
append = "/var/lib/bacula/log" = all, !skipped
}

Asi de simple.

Aunque no tengamos un servidor de correo, bacula envia los datos a el servicio local de Linux, ademas que todos los mensajes los escribe en /var/lib/bacula/log en distribuciones RedHat y derivados, en FreeBSD van en /var/db/bacula/log, si algun mensaje se les va de la consola, tenemos este archivito "log".

Pools

Ahora viene la definicion de los Pools, que ya hable de ellos anteriormente, asi los tengo declarados:

Pool {
Name = FullFile
Maximum Volumes = 0
Pool Type = Backup
Use Volume Once = no
Maximum Volume Jobs = 8
Maximum Volume Files = 0
Maximum Volume Bytes = 0
Volume Use Duration = 0
Catalog Files = yes
AutoPrune = yes
Volume Retention = 120 days
Recycle Current Volume = no
Recycle = yes
Label Format = FullFile-
}

Definicion:
Name = Ya saben, algo que ustedes conozcan.
Pool Type = Yo solo uso "Backups"
Recycle = yes/no, aqui le indicamos a el director si nuestros volumenes podran reciclarse, asi podremos tener una rotacion, no tenemos cintas para toda la vida!!!
AutoPrune = yes/no, para que el director recicle informacion de la BD.
Volume Retention = Cuanto tiempo un Volumen podran mantenerse intacto, despues de este tiempo se podra reciclar.
Maximum Volume Bytes = Podremos especificar cuantos bytes por cada volumen, yo no lo necesito.
Maximum Volume Jobs = Cuantos Jobs por cada volumen, una vez llegando a esta cantidad el volumen se cierra.
Maximum Volume Files = Cuantos archivos por volumen, no lo utilizo.
Volume Use Duration = Tiempo que deseamos usar cada volumen.
Catalog Files = yes/no, si deseamos que bacula genere un listado de todos los archivos a respaldar, asi cuando recuperemos sea mas rapido, siempre usenlo, le agrega mas info a la BD pero vale la pena.
Recycle Current Volume = yes/no, nunca me he visto en la necesidad de ponerlo en "Yes".
Label Format = Ya hable al respecto, un parametro para todos nuestros volumenes a la hora de crearlos.

Como mencione por cada uno de mis tipo de respaldo tengo un Pool, o sea que uso 2, Full y Diferencial.

Ustedes pueden ya saber como configurar el otro.

Consola

Es la ultima parte de la configuracion, para monitorear el estatus del director los clientes tienen que configurarse en base a estos parametros.

Console {
Name = bacula-mon
Password = "monitor"
CommandACL = status, .status
}

Muy simple.

Definicion:

Name = Nombre que ustedes gusten.
Password = "", clave.
CommandACL = No modificarlo, al menos que sepan que hacen.

Como podran ver, bacula nos permite configurarlo de muchas maneras, aqui ya es cuestion de gustos y necesidades. Vamos a ver un archivo completo:

bacula-dir.conf Completo

###########################################################
### Director Definitions ###
###########################################################

Director { # define myself
Name = bacula-dir
DIRport = 9101 # where we listen for UA connections
QueryFile = "/usr/lib/bacula/query.sql"
WorkingDirectory = "/var/lib/bacula"
PidDirectory = "/var/run"
Maximum Concurrent Jobs = 20
Password = "mipassword" # Console password
Messages = Daemon
}

###########################################################
### Backup JobsDef##
###########################################################

JobDefs {
Name = "DefaultJob"
Type = Backup
Level = Full
Storage = File
Messages = Standard
Pool = FullFile
}

###########################################################
### Backup Job's Definitions ###
###########################################################

Job {
Name = "BackupXen"
JobDefs = "DefaultJob"
Write Bootstrap = "/var/lib/bacula/xenserver.bsr"
Client = XENSERVER-FD
FileSet = "XENSERVER-FS"
Schedule = "XENSERVER-SCH"
Maximum Concurrent Jobs = 3
Priority = 11
}

Job {
Name = "BackupXP"
JobDefs = "DefaultJob"
Write Bootstrap = "/var/lib/bacula/xp.bsr"
Client = WINDOWSXP-FD
FileSet = "WINDOWSXP-FS"
Schedule = "WINDOWSXP-SCH"
Maximum Concurrent Jobs = 3
Priority = 12
}

Job {
Name = "BackupWin7"
JobDefs = "DefaultJob"
Write Bootstrap = "/var/lib/bacula/win7.bsr"
Client = WIN7-FD
FileSet = "WIN7-FS"
Schedule = "WIN7-SCH"
Priority = 13
}

# Backup the catalog database (after the nightly save)
Job {
Name = "BackupCatalog"
JobDefs = "DefaultJob"
Write Bootstrap = "/var/lib/bacula/catalog.bsr"
Client = CATALOG-FD
FileSet="CATALOG-FS"
Schedule = "CATALOG-SCH"
# This creates an ASCII copy of the catalog
# Arguments to make_catalog_backup.pl are:
# make_catalog_backup.pl
#RunBeforeJob = "/usr/lib/bacula/make_catalog_backup.pl MyCatalog"
# This deletes the copy of the catalog
#RunAfterJob = "/usr/lib/bacula/delete_catalog_backup"
Maximum Concurrent Jobs = 3
Priority = 14
}

Job {
Name = "BackupMySQL"
JobDefs = "DefaultJob"
RunScript {
RunsWhen = Before
FailJobOnError = No
Command = "/etc/bacula/backupdb.sh"
}
RunScript {
RunsWhen = After
FailJobOnError = No
Command = "/etc/bacula/deletedb.sh"
}

Write Bootstrap = "/var/lib/bacula/mysqlserver.bsr"
Client = MYSQLSERVER-FD
FileSet = "MYSQLSERVER-FS"
Schedule = "MYSQLSERVER-SCH"
Priority = 15
}

###########################################################
### Restore Jobs ###
###########################################################

### Template ###
JobDefs {
Name = "RestoreFiles"
Type = Restore
Storage = File
Pool = FullFile
Messages = Standard
}

Job {
Name = "RestoreXENSERVER"
JobDefs = "RestoreFiles"
Client = XENSERVER-FD
FileSet = "XENSERVER-FS"
Where = "/opt/restore"
}

Job {
Name = "RestoreWINXP"
JobDefs = "RestoreFiles"
Client = WINDOWSXP-FD
FileSet = "WINDOWSXP-FS"
Where = "C:/restore"
}

Job {
Name = "RestoreWIN7"
JobDefs = "RestoreFiles"
Client = WIN7-FD
FileSet = "WIN7-FS"
Where = "C:/restore"
}

Job {
Name = "RestoreCATALOG"
JobDefs = "RestoreFiles"
Client = CATALOG-FD
FileSet = "CATALOG-FS"
Where = "/opt/restore"
}

Job {
Name = "RestoreMYSQLSERVER"
JobDefs = "RestoreFiles"
Client = MYSQLSERVER-FD
FileSet = "MYSQLSERVER-FS"
Where = "/opt/restore"
}


###########################################################
### File Set Definitions ###
###########################################################

FileSet {
Name = "XENSERVER-FS"
Enable VSS = No
Include {
Options {
signature = MD5
compression = GZIP
}
File = "/etc"
File = "/opt/data"
}
}

### VM-DOS ###
FileSet {
Name = "WINDOWSXP-FS"
Enable VSS = Yes
Include {
Options {
signature = MD5
compression = GZIP
}
File = "C:/Documents and Settings/Administrator/My Documents/"
}
Exclude {
File = "C:/Documents and Settings/Administrator/My Documents/My Music"
}
}

### VM-TRES ###
FileSet {
Name = "WIN7-FS"
Enable VSS = Yes
Include {
Options {
signature = MD5
compression = GZIP
}
File = "C:/Users/Administrator/Pictures"
}
Exclude{

}
}

FileSet {
Name = "CATALOG-FS"
Enable VSS = No
Include {
Options {
signature = MD5
compression = GZIP
}
File = "/etc"
File = "/var/lib/bacula"
File = "/var/log"
File = "/opt/data"
}
}

### MySQL Server ###
FileSet {
Name = "MYSQLSERVER-FS"
Enable VSS = No
Include {
Options {
signature = MD5
compression = GZIP
}
File = "/etc"
File = "/opt/db"
File = "/opt/rpm"
File = "/opt/data"
}
}

###########################################################
### Schedule Definitions ###
###########################################################

Schedule {
Name = "XENSERVER-SCH"
Run = mon at 19:00
Run = Level = Differential Pool = DiffFile tue-sat at 19:00
}

schedule {
Name = "WINDOWSXP-SCH"
Run = mon at 19:30
Run = Differential Pool = DiffFile tue-sat at 19:15
}

Schedule {
Name = "WIN7-SCH"
Run = mon at 20:00
Run = Differential Pool = DiffFile tue-sat at 19:30
}

Schedule {
Name = "CATALOG-SCH"
Run = mon at 20:30
Run = Differential Pool = DiffFile tue-sat at 19:45
}

Schedule {
Name = "MYSQLSERVER-SCH"
Run = mon at 21:00
Run = Differential Pool = DiffFile tue-sat at 20:00
}

###########################################################
### Clients Definitions ###
###########################################################

Client {
Name = XENSERVER-FD
Address = 192.168.50.104
FDPort = 9102
Catalog = MyCatalog
Password = "mipassword"
File Retention = 30 days # 30 days
Job Retention = 6 months # six months
AutoPrune = yes # Prune expired Jobs/Files
Maximum Concurrent Jobs = 3
}

### WINDOWS XP ###
Client {
Name = WINDOWSXP-FD
Address = 192.168.50.122
FDPort = 9102
Catalog = MyCatalog
Password = "mipassword" # password for FileDaemon
File Retention = 30 days # 30 days
Job Retention = 6 months # six months
AutoPrune = yes # Prune expired Jobs/Files
Maximum Concurrent Jobs = 3
}

### WINDOWS 7 ###
Client {
Name = WIN7-FD
Address = 192.168.50.121
FDPort = 9102
Catalog = MyCatalog
Password = "mipassword" # password for FileDaemon
File Retention = 30 days # 30 days
Job Retention = 6 months # six months
AutoPrune = yes # Prune expired Jobs/Files
}

Client {
Name = CATALOG-FD
Address = 192.168.50.130
FDPort = 9102
Catalog = MyCatalog
Password = "mipassword" # password for FileDaemon
File Retention = 30 days # 30 days
Job Retention = 6 months # six months
AutoPrune = yes # Prune expired Jobs/Files
Maximum Concurrent Jobs = 3
}

Client {
Name = MYSQLSERVER-FD
Address = 192.168.50.3
FDPort = 9102
Catalog = MyCatalog
Password = "mipassword" # password for FileDaemon
File Retention = 30 days # 30 days
Job Retention = 6 months # six months
AutoPrune = yes # Prune expired Jobs/Files
Maximum Concurrent Jobs = 3
}

###########################################################
### Storage Definitions ###
###########################################################

Storage {
Name = File
Address = 192.168.50.130 # N.B. Use a fully qualified name here
SDPort = 9103
Password = "mipassword"
Device = FileStorage
Media Type = File
Maximum Concurrent Jobs = 10
}

###########################################################
### Catalog ###
###########################################################

Catalog {
Name = MyCatalog
# Uncomment the following line if you want the dbi driver
# dbdriver = "dbi:mysql"; dbaddress = 127.0.0.1; dbport =
# dbname = "bacula"; dbuser = "bacula"; dbpassword = "bacula"
dbname = "bacula"; DB Address =192.168.50.3; dbuser = "bacula"; dbpassword = "userpassword"
}

###########################################################
### Message Definitions ###
###########################################################

Messages {
Name = Standard

mailcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: %t %e of %c %l\" %r"
operatorcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: Intervention needed for %j\" %r"
mail = root@localhost = all, !skipped
operator = root@localhost = mount
console = all, !skipped, !saved

append = "/var/lib/bacula/log" = all, !skipped
catalog = all
}

Messages {
Name = Daemon
mailcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula daemon message\" %r"
mail = root@localhost = all, !skipped
console = all, !skipped, !saved
append = "/var/lib/bacula/log" = all, !skipped
}

###########################################################
### Pools ###
###########################################################

### Full Files ###
Pool {
Name = FullFile
Maximum Volumes = 0
Pool Type = Backup
Use Volume Once = no
Maximum Volume Jobs = 8
Maximum Volume Files = 0
Maximum Volume Bytes = 0
Volume Use Duration = 0
Catalog Files = yes
AutoPrune = yes
Volume Retention = 120 days
Recycle Current Volume = no
Recycle = yes
Label Format = FullFile-
}

Pool {
Name = DiffFile
Pool Type = Backup
Use Volume Once = no
Maximum Volume Jobs = 24
Maximum Volume Files = 0
Maximum Volume Bytes = 0
Volume Use Duration = 0
Catalog Files = yes
Recycle = yes
AutoPrune = yes
Volume Retention = 120 days
Label Format = FileDiff-
}

# Scratch pool definition
Pool {
Name = Scratch
Pool Type = Backup
}

#
# Restricted console used by tray-monitor to get the status of the director
#
Console {
Name = bacula-mon
Password = "Monitor"
CommandACL = status, .status
}

Muy bien, ya tenemos el archivo de configuracion del director, ahora sigue configurar el
encargado de los medios de almacenamiento.

Bacula Storage Daemon

Storage { # definition of myself
Name = bacula-sd
SDPort = 9103 # Director's port
WorkingDirectory = "/var/lib/bacula"
Pid Directory = "/var/run"
Maximum Concurrent Jobs = 20
}

Name = Nombre deseado.
SDPort = Puerto Especifico.
WorkingDirectory = Directorio temporal, no modificar.
Pid Directory = No modificar.
Maximum Concurrent Jobs = Nunca he sobre pasado este limite, asi que dejenlo como esta.

Director {
Name = bacula-dir
Password = "password-deseado"
}

Directores que tienen permitido accesar esta demonio.

Name = Nombre del director.
Password = Password que tiene usar el director si desea contactar a este demonio.

Director {
Name = bacula-mon
Password = "monitor-password"
Monitor = yes
}

Name = Nombre de la consola de bacula para estatus.
Password = Password para contactar el monitor.
Monitor = No cambiar si desean ser contactados por monitores.

Device {
Name = FileStorage
Media Type = File
Archive Device = /opt/backups
LabelMedia = yes; # lets Bacula label unlabeled media
Random Access = Yes;
AutomaticMount = yes; # when device opened, read it
RemovableMedia = no;
AlwaysOpen = no;
}

Name = Nombre de este medio de almacenamiento, el director asi lo conoce.
Media Type = Tipo de medio de almacenamiento.
Archive Device = Ubicacion fisica de este recurso, debe existir este directorio.
LabelMedia = Se permite etiquetar o no este medio, default si.
Random Access = No modificar.
AutomaticMount = No modificar.
RemovableMedia = Para almacenamiento en disco duro "No" para otros cambia.
AlwaysOpen = No modificar para disco duro.

Messages {
Name = Standard
director = bacula-dir = all
}

No modificar estos parametros.

Tiene mas datos el archivo de configuracion, pero es solo para manejar cintas, dvd's, etc. Aqui solo hemos manejado disco duro, asi que todo lo que necesitamos esta en la configuracion anterior.

Ya hay muchos parametros estan por demas explicitos, pero de todos modos los tratamos de explicarlos.

Ahora vamos a ver la configuracion total.

bacula-sd.conf

Storage { # definition of myself
Name = bacula-sd
SDPort = 9103 # Director's port
WorkingDirectory = "/var/lib/bacula"
Pid Directory = "/var/run"
Maximum Concurrent Jobs = 20
}

Director {
Name = bacula-dir
Password = "mi-password"
}

Director {
Name = bacula-mon
Password = "monitor-password"
Monitor = yes
}

Device {
Name = FileStorage
Media Type = File
Archive Device = /opt/backups
LabelMedia = yes; # lets Bacula label unlabeled media
Random Access = Yes;
AutomaticMount = yes; # when device opened, read it
RemovableMedia = no;
AlwaysOpen = no;
}

Messages {
Name = Standard
director = bacula-dir = all
}

Demonio FD

Este tambie es un archivo muy simple, asi es bacula. Vamos a seguir el mismo formato, vamos a mostrar la configuracion y tratar de explicar cada parametro mostrado, hay muchos que nunca se van a cambiar por ello los indico.

Director {
Name = bacula-dir
Password = "password-de-este-cliente"
}

Name = Nombre del director que tiene permitido accesar a este cliente.
Password = Clave que se solicita a el director que desea contactar este cliente.

Director {
Name = bacula-mon
Password = "monitor-password"
Monitor = yes
}

Name = Ya saben la razon de estos parametros.
Password = Clave del monitor.
Monitor = no modificar.

FileDaemon {
Name = uno-fd
FDport = 9102
WorkingDirectory = /var/lib/bacula
Pid Directory = /var/run
Maximum Concurrent Jobs = 20
}

Name = Nombre de este cliente, asi lo conocen los directores.
FDport = No modificarlo.
WorkingDirectory = No modificarlo.
Pid Directory = No modificarlo.
Maximum Concurrent Jobs = No modificarlo.

Messages {
Name = Standard
director = bacula-dir = all, !skipped, !restored
}

Ya saben este ultimo parametro. Ahora vamos a ver el archivo completo.

bacula-fd.conf
Director {
Name = bacula-dir
Password = "password-cliente"
}

Director {
Name = bacula-mon
Password = "password-monitor"
Monitor = yes
}

FileDaemon {
Name = uno-fd
FDport = 9102
WorkingDirectory = /var/lib/bacula
Pid Directory = /var/run
Maximum Concurrent Jobs = 20
}

Messages {
Name = Standard
director = bacula-dir = all, !skipped, !restored
}

Me gustaria comentar que los archivos de los clientes tambien es muy sencillo y aparte que Unix a Windows no cambian en nada, son los mismos parametros, lo que cambia es la ruta a directorios o archivos.

Consola de bacula

Por ultimo la consola para administrar a bacula. El mas simple de todos.

Director {
Name = bacula-dir
DIRport = 9101
address = 192.168.50.130
Password = "password-del-director"
}

Name = Nombre del director.
DIRport = No mover.
address = IP del director, si tienen dns y opera lo pueden usar.
Password = Password del director para contactarlo bacula-dir.conf.

bconsole.conf
Director {
Name = bacula-dir
DIRport = 9101
address = 192.168.50.130
Password = "passwod-del-director"
}

Revision de Sintaxis

Para el director, nuestra bd debe estar lista para trabajar.

Bien, hasta aqui ya tenemos los 4 archivos escenciales de bacula, tanto del lado del servidor como del cliente. Lo que sigue es verficar que no haya errores de sintaxis, para ello cada demonio de bacula tiene su forma de hacerlo, asi:

bacula-dir -t -c /etc/bacula/bacula-dir.conf
bacula-sd -t -c /etc/bacula/bacula-sd.conf
bacula-fd -t -c /etc/bacula/bacula-fd.conf
bconsole -t -c /etc/bacula/bconsole.conf

Si no retorna nada es que todo esta correctamente, de lo contrario nos indica la linea donde se produce el problema.

Si aparecen errores ya saben que deben repararlos antes de seguir.

8 comentarios:

Diego Sanchez dijo...

execelente gracias, un fabor sabes como migrar (backups) en bacula

Pedro Moreno dijo...

Hola Diego, a ver si entendi tu pregunta, quieres mover la info de mysql hacia otro mysql? o tu pregunta es otra?
Saludos!!!

Germán H. Falasco dijo...

Buenos días, te hago una consulta, tengo Bacula sobre ubuntu server 12.04, me restaura todo ok al hacer los pasos de restauración, pero no veo carpetas restauradas en la ruta que le indiqué en el "where", y así y todo me llega el mail avisandome que el restore se realizó correctamente, sabes a que puede deberse?

Pedro Moreno dijo...

Hola, puede ser permisos en la carpeta del cliente, muestra la config restore de ese cliente y muestra los permisos del folder en ese cliente.

Saludos!!!

emorgin dijo...

Buen día, es aquí donde tendría que hacer mis consultas? Pedro quería saber si es posible, que compartas tu máquina virtual de Bacula. Saludos.

Pedro Moreno dijo...

Si tienes cuenta de google aqui esta la mia perikillo arrova gmail unto kom.
Agregame y vemos tu caso, saludos.

emorgin dijo...

Hola Pedro, ya te escribí.

Una consulta, he visto que uno debe crear las particiones en CentOS de acuerdo al servicio que se piensa instalar en él. Por lo que quisiera saber, en base a tu conocimiento y experiencia, cómo han de ser estas particiones para que Bacula no tenga problemas de espacio, considerando a largo plazo también. Saludos.

Pedro Moreno dijo...

Hola, aqui ya es cosa de cuanto espacio tienes disponible.

Mi servidor esta dedicado a puro almacenamiento, disco+cinta, necesito sacarla provecho a espacio, no me interesa si la velocidad de escritura es lenta, lo que deseo es almacenar lo mas que se pueda.

Asi tengo un servidor con 5 discos + 1 spare Raid-5 2TB cada uno.

Este me da aprox. 7.4TB, de ahi se que mis particiones estan asi:

LVM

/root 1024MB
/usr 4096MB
/var 16384MB por que MySQL si necesita
/tmp 256MB
/opt 7TB

El resto lo dejo por si alguno de los otros pide un poco que aun no lo han hecho.

Pero este server este dedicado 100% respaldos.

Espero esto te sirva para tu configuracion, saludos.