Централизованное резервное копирование данных Windows и *nix серверов средствами Bacula

    Приветствую всех хаброжителей!

    Как нетрудно догадаться, речь пойдет о бекапах.
    Своевременный бекап — крайне важная часть работы системного администратора. Своевременный бекап делает сон спокойным, а нервы стальными, придает сил и оберегает здоровье.

    Думаю вполне резонным будет предположение, что данная тема уже набила оскомину, но все же я рискну поделиться своим опытом. На суд читателя будет представлена клиент-серверная реализация схемы резервного копирования. В качестве инструмента я выбрал open source проект Bacula. По более чем полугодовому опыту его использования остаюсь доволен своим выбором.

    Bacula состоит из нескольких демонов, каждый из которых несет свою функциональную нагрузку. На рисунке ниже схематично представлена взаимосвязь этих демонов.

    Под хабракатом я опишу все демоны подробно


    В моем случае резервному копированию подлежат:
    1. Конфигурационные файлы различных демонов со всех серверов.
    2. MySQL базы данных.
    3. Документооборот с файлового сервера Windows.
    4. Различные важные данные с nix серверов(движки сайтов/форумов, etc..)




    1.Описание демонов Bacula



    Система построена по технологии клиент-сервер, и для передачи данных использует протокол TCP. Резервные копии создаются в собственном, полностью открытом формате.

    Система резервирования данных Bacula состоит из четырёх основных элементов: Director Daemon, Storage Daemon, File Daemon и Bacula Console. Все эти элементы реализованы в виде самостоятельных приложений.

    Director Daemon (DD) – это центральный элемент системы, осуществляющий управление её остальными компонентами. В его задачи входит управление процессом резервирования/восстановления данных, обеспечение интерфейса управления для администраторов и многое другое. Говоря проще – это диспетчер, который инициирует все процессы и отслеживает ход их выполнения.

    Storage Daemon (SD) – приложение, отвечающее за чтение/запись данных непосредственно на устройства хранения информации. Принимает управляющие команды от DD, а также резервируемые данные от/к File Daemon.

    File Daemon (FD) – этот элемент ещё можно назвать Агентом. Ведь именно он работает в рамках операционной системы, данные которой необходимо резервировать. File Daemon выполняет всю рутину, осуществляя обращение к резервируемым файлам и их дальнейшую передачу к SD. Также на стороне FD выполняется шифрование резервных копий, если это определено конфигурацией.

    Bacula Console (BC) – интерфейс администратора сиcтемы. По своей сути, это командный интерпретатор для управления Bacula. Строго говоря, Bacula Console может быть расширена с помощью графических систем управления, которые, как правило, являются всего лишь надстройкой над BC. К таким системам можно отнести Tray Monitor и Bat. Первая устанавливается на компьютере администратора системы и осуществляет наблюдение за работой системы резервирования, а вторая обеспечивает возможность управления посредством графического интерфейса.

    Bacula Catalog – база данных, в которой хранятся сведения обо всех зарезервированных файлах и их местонахождении в резервных копиях. Каталог необходим для обеспечения эффективной адресации к требуемым файлам. Поддерживаются MySql, PostgreSql и SqLite.
    Такое структурное деление позволяет организовать очень гибкую систему резервирования, когда Storage Daemon разворачивается на выделенном сервере с несколькими устройствами хранения данных. Также Bacula Director может управлять несколькими экземплярами SD, обеспечивая резервирование части данных на одно устройство хранения, а части – на другое.

    2. ОС и железо


    Теперь, когда у читателя сформировалось представление о работе демонов Bacula, я перейду к описанию того, как я реализовал всю эту красоту у себя.
    В качестве аппаратного обеспечения для DD, SD и Bacula Catalog у меня выступает PC со следующими характеристиками
    Устройство Модель количество Емкость/Частота
    HDD Hitachi HDS723020BLA642 3 2Tb
    CPU AMD Phenom(tm) II X4 970 Processor 1 3500 Mhz
    Motherboard Gigabyte GA-880GA-UD3H 1 -
    RAM 3541 Mb

    О используемых на сервере ОС и версиях ПО
    # lsb_release -a
    LSB Version:    :core-4.0-ia32:core-4.0-noarch:graphics-4.0-ia32:graphics-4.0-noarch:printing-4.0-ia32:printing-4.0-noarch
    Distributor ID:    CentOS
    Description:    CentOS release 5.7 (Final)
    Release:    5.7
    Codename:    Final
    
    # uname -a
    Linux backupsrv.domain.ru 2.6.18-274.7.1.el5PAE #1 SMP Thu Oct 20 17:03:59 EDT 2011 i686 athlon i386 GNU/Linux
    
    # rpm -qa |grep -E "syslog-ng|bacula|mysql-ser" 
    bacula-libs-5. 0.3-1
    syslog-ng-2.1.4-9.el5
    bacula-mysql-5. 0.3-1
    mysql-server-5. 0.77-4.el5_6.6
    


    Хранением данных занимаются несколько software(mdadm) RAID массивов.
    Под систему три партиции на трех дисках, грузится можно с любого из них, под бекапы один массив из двух партиций.
    Имя массива из каких партиций точка монтирования Файловая система Уровень массива
    md0 /dev/sda1,/dev/sdb1,/dev/sdc1 boot ext2 1
    md1 /dev/sda2,/dev/sdb2,/dev/sdc2 / ext3 1
    md2 /dev/sda3,/dev/sdb3 /backup ext4 1

    3. Описание схемы резервного копирования и настроек демонов Bacula


    Всего у меня сконфигурированы 19 клиентов Bacula, но подробно я остановлюсь на описании бекапа сервера биллинга и документов с файлового сервера Windows. Фокус на эти два сервера обусловлен тем, что остальные клиенты настроены аналогично, и на примере этих серверов-клиентов можно строить свои конфигурации.

    Резервное копирование сервера биллинга это, по сути, бекап базы данных mysql и конфигурационных файлов демонов.
    BD позволяет выполнять локальный скрипт на клиенте как до, так и после задания.
    Каждую ночь, при старте задания на бекап сервере, запускается локальный(на самом сервере биллинга) скрипт, который создает архив базы биллинга, далее этот архив забирает BD и помещает на соответствующий пул томов(на самом деле операциями с чтением/записью управляет SD, но это сейчас не важно). Сразу же после выполнения задания запускается еще один скрипт, который в свою очередь, перемещает созданный архив в отдельную папку на сервере биллинга, для пущей надежности. Таким образом архив БД будет как у Bacula, так и локально на сервере биллинга(да, я параноик). Подробнее эти механизмы и скрипты будут описаны ниже.

    С файлового сервера Windows сохраняем весь необходимый документооборот. В воскресенье создается Full бекап, каждый последующий день, с понедельника по субботу, Diff бекапы.

    Теперь о конфигурационных файлах демонов Bacula. Начнем с самого объемного — bacula-dir.conf.
    Файлы конфигурации всех демонов Bacula состоят из описаний, так называемых, ресурсов. Каждый из ресурсов характеризует определенный функционал демона.
    Я буду комментировать каждую строчку в конфиге, поэтому далее будут следовать блоки-ресурсы файлов Bacula(bacula-dir.conf, bacula-sd.conf, bacula-fd.conf), если что-то нужно объяснить более подробно укажите это в комментариях.
    Ресурс Dirtector
    Director { 
      # имя bacula director'а
      Name = backupsrv.domain.ru-dir 
      # какой порт слушать, у нас default
      DIRport = 9101 
      # путь к скрипту, где лежат sql запросы для работы с Bacula Catalog(mysql database)
      QueryFile = "/usr/lib/bacula/query.sql" 
      # здесь хранятся статус файлы демона
      WorkingDirectory = "/backup/bacula-work/" 
      # pid файл демона
      PidDirectory = "/var/run" 
      # сколько заданий может запускаться одновременно
      Maximum Concurrent Jobs = 1 
      # пароль для доступа в BC и управления демонами 
      Password = "bacula_paS$w0rD10*" 
      # куда слать mail'ы, описано в ресурсе Messages
      Messages = Daemon 
      # на какой адрес биндится процессу
      DirAddress = 10.1.19.2 
    } 


    Ресурс catalog, описываем подключение к БД
    
    Catalog {
      Name = MyCatalog
      dbname = "bacula"; dbuser = "bacula"; dbpassword = "edsfweo8vhwpe"
    }


    Ресурс Messages
    Messages {
      # это имя прописано в ресурсе Director, помните?
      Name = Daemon
      # команда для отправки email
      mailcommand = "/usr/sbin/bsmtp -f \"\(Bacula\) \<%r\>\" -s \"Bacula daemon message\" %r" 
      # шлем все на майл админам(root алиас на admins@domain.ru) 
      # высылаются только алярмы, ероры и прочую важность
      mail = root@backupsrv.domain.ru = alert,error,fatal,terminate, !skipped 
      # что выводить на консоль                                                                                       
      console = all, !skipped, !saved
      # что в лог
      append = "/var/lib/bacula/log" = alert,error,fatal,terminate, !skipped
    }


    Для каждого клиента в заданиях указаны Pool и Storage.
    Pool, извините за тавтологию, это пул томов(volume) на который размещаются резервные копии данных клиентов. У меня тома — это файлы в формате bacula, размещенные на software raid массиве. Для разных клиентов могут быть определены разные пулы томов. К примеру у меня созданы 6 пулов, для разных типов клиентов. В примере ниже описан лишь один из них, для данных биллинга.
    Storage описывает какие физические устройства будут использованы в качестве томов.
    (Storage BGB-ST описан в конфиге SD)
    Ресурс Pool
    Pool {
      # имя пула, указывается в заданиях резервного копирования
      Name = bgb
      # тип пула, емнип  этой версии только такой поддерживается
      Pool Type = Backup #
      # повторно использовать тома(сначала пишет в 1-ый, потом в 2-ой,
      # потом 3-й, 3-й закончился - снова в 1-й) 
      Recycle = yes 
      # удалять записи из bacula catalog(из mysql базы бакулы)
      # старше нижеуказанных значений
      AutoPrune = yes 
      # период в течении которого информация о томах(volumes)
      # хранится в базе данных, по истечению периода эта информация
      # удаляется
      Volume Retention = 90 days 
      # максимальный объем тома     
      Maximum Volume Bytes = 100G 
      # максимальное количество томов в пуле
      Maximum Volumes = 3 
      # с каких символов начинается имя тома
      LabelFormat = "Vol" 
      } 


    Ресурс Storage
    Storage {
      # имя хранилища и пароль (о соответствии имен и паролей в разных конфигах
      # демонов Bacula, я расскажу позже)
      Name = BGB-F
      Password = "StoRage_PaSSw0rD" 
      # fqdn имя сервера
      Address = backupsrv.domain.ru 
      # порт оставляем стандартный
      SDPort = 9103 
      # имя девайса описанного в конфиге SD
      Device = BGB-ST 
      # у нас все пишется на софтовый рэйд в файлы собственного формата       
      # bacula(например /backup/bgbilling/Vol0001)
      Media Type = File 
    } 


    Задание на примере бекапа базы данных биллинга.
    Ресурс Client
    Client {
      # имя 
      Name = bgbilling-fd 
      # ip адрес клиента
      Address = 10.103.2.5
      # порт, который клиент слушает
      FDPort = 9102
      # имя mysql базы данных Bacula
      Catalog = MyCatalog
      # пароль для FD
      Password = "Fd_paSSw0rd" 
      # период в течении которого информация о файлах задания
      # хранится в базе данных, по истечению периода эта информация
      # удаляется(но не сами данные!!) 
      File Retention = 45 days 
      # тоже самое, только для самого задания
      Job Retention = 90 days 
      # удалять записи из каталога(бд mysql) старше вышеуказанных значений
      AutoPrune = yes 
    } 


    Само задание.
    Ресурс Job
    
    Job {
      # имя задания 
      Name = "BGBilling"
      # тип(backup or restore)
      Type = Backup 
      # уровень(полный, диференциальный или инкрементный)
      Level = Full 
      # имя клиента 
      Client=bgbilling-fd 
      # имя файл-сета(там рассказано что бекапить, а что не бекапить)
      FileSet="bgbilling-set" 
      # имя SD ресурса                            
      Storage = BGB-F 
      # имя пула(для разных клиентов разные пулы томов(volume) куда пишутся сами 
      # бекапы)
      Pool = bgb
      # скрипт запускающийся ДО выполнения задания (путь до скрипта  -
      # это путь НА КЛИЕНТЕ!)
      ClientRunBeforeJob = "/root/sh/before_bg_db_backup.sh" 
      # скрипт запускающийся ПОСЛЕ выполнения задания                                                          
      ClientRunAfterJob = "/root/sh/after_bg_db_backup.sh" 
      # имя ресурса messages, который будет использоваться для этого задания
      Messages = Standard
      # имя шедулера
      Schedule = "DaylyFullBGBilling" 
      # в этом файле содержится информация о том, какие файлы должны будут
      # востанавливаться, на каком вольюме находятся файлы,
      # где конкретно они находятся - это очень важные файлы, их нужно бэкапить
      Write Bootstrap = "/backup/bsr-files/bgbilling.bsr" 
    } 
    


    Я обещал подробнее остановиться на скриптах выполняющихся до и после задания.
    Скрипт до задания
    $ sudo cat  /root/sh/before_bg_db_backup.sh
    #!/bin/bash
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    mysql -e "flush tables with read lock" --user=root --password="ololo" bgbilling
    lvcreate -L20G -s -n backup_db   /dev/BGB-LVM1/billing_db
    mysql -e "unlock tables" --user=root --password="ololo" bgbilling
    mount /dev/BGB-LVM1/backup_db  /backup
    tar -czf  /usr/backups/`date +%Y-%m-%d_%H-%M`.bgb.tgz /backup/bgbilling/
    umount /backup
    lvremove -f /dev/BGB-LVM1/backup_db
    

    Скрипт после задания
    $ sudo cat  /root/sh/after_bg_db_backup.sh
    #!/bin/bash
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    rm /usr/backups/after_run_bacula_backup/*
    mv /usr/backups/*.tgz /usr/backups/after_run_bacula_backup/
    


    Ресурс FileSet(что бекапим, а что нет)
    FileSet {
      Name = "bgbilling-set" 
      Include {
        Options {
          # разработчики яро рекомендуют юзать это опцию, 
          # создается сигнатура забекапленных файлов в md5
          signature = MD5 
        }
        # перечисляем то, что нужно бекапить
        File = /usr/backups 
        File = /etc 
        File = /root/sh 
      }
      Exclude {
        # а это бекапить нет нужды
        File = /usr/backups/after_run_bacula_backup/* 
        File = /usr/backups/after_run_bacula_backup 
     }
    } 
    


    Расписание запуска задания.
    Ресурс Schedule
    Schedule {
      # имя расписания
      Name = "DaylyFullBGBilling" 
      # когда запускать задание
      Run = Full sun-sat at 1:10 
    } 


    Подробно комментировать ресурсы для резервного копирования документов с сервера Windows я не буду, приведу соответствующую часть конфига bacula-dir.conf полностью
    
    Storage {                                                                                                                                                    
    Name = WINDOWS-F                                                                                                                                             
                                                                                                                                                                 
    Address = backupsrv.domain.ru       # N.B. Use a fully qualified name here                                                                                  
    SDPort = 9103                                                                                                                                                
    Password = "StoRage_PaSSw0rD"                                                                                                                                
    Device = WINDOWS-ST                                                                                                                                          
                                                                                                                                                                 
    Media Type = File                                                                                                                                            
    }                                                                                                                                                            
                                                                                                                                                                 
    Pool {                                                                                                                                                       
    Name = windows                                                                                                                                               
                                                                                                                                                                 
    Pool Type = Backup                                                                                                                                           
    Recycle = yes                       # Bacula can automatically recycle Volumes                                                                               
    AutoPrune = yes                     # Prune expired volumes                                                                                                  
    Volume Retention = 60 days                                                                                                                                   
    Maximum Volume Bytes = 30G          # Limit Volume size to something reasonable                                                                              
    Maximum Volumes = 5                # Limit number of Volumes in Pool                                                                                         
    LabelFormat = "Vol-Windows"                                                                                                                                  
                                                                                                                                                                 
    }                            
                                                                                                                             
    Job {                                                                                                                                                        
      Name = "centra-bdk"                                                                                                                                        
      Type = Backup                                                                                                                                              
      Level = Full                                                                                                                                               
      Client= centra-bdk-fd                                                                                                                                      
      FileSet="centra-bdk-fd-fs"                                                                                                                                 
      Storage = WINDOWS-F                                                                                                                                        
      Pool = windows                                                                                                                                             
      Messages = Standard                                                                                                                                        
      Schedule = "Windows_Centra-bdk"                                                                                                                            
      Write Bootstrap = "/backup/bsr-files/centra-bdk.bsr"                                                                                                       
    }                                                                                                                                                            
                                                                                                                                                                 
                                                                                                                                                                 
    FileSet {                                                                                                                                                    
      Name = "centra-bdk-fd-fs"                                                                                                                                  
      Include {                                                                                                                                                  
        Options {                                                                                                                                                
          signature = MD5                                                                                                                                        
          Compression=GZIP                                                                                                                                       
        }      
        # обратите внимание на двойной бекслэш и ковычки!                                                                                                                                                  
        File = "D:\\Public\\!!!Абонентский\ Отдел"                                                                                                               
        File = "D:\\Public\\Отдел\ ИТ"                                                                                                                           
        File = "D:\\Public\\tex\\Maps"                                                                                                                 
        File = "D:\\Public\\сервис\ мены "                                                                                                                       
        File = "D:\\Public\\Отдел\ продаж1"                                                                                                                      
    }                                                                                                                                                            
    Exclude {                                                                                                                                                    
        File = "*.mp3"                                                                                                                                           
        File = "*.avi"                                                                                                                                           
        File = "*.wmv"                                                                                                                                           
     }                                                                                                                                                           
    }                                                                                                                                                            
                                                                                                                                                                 
                                                                                                                                                                 
                                                                                                                                                                 
    Client {                                                                                                                                                     
      Name = centra-bdk-fd                                                                                                                                       
      Address = 10.1.19.50                                                                                                                                       
      FDPort = 9102                                                                                                                                              
      Catalog = MyCatalog                                                                                                                                        
      Password = "Fd_paSSw0rd"          # password for FileDaemon                                                                                                
      File Retention = 30 days            # 30 days                                                                                                              
      Job Retention = 2 months            # two months                                                                                                           
      AutoPrune = yes                     # Prune expired Jobs/Files                                                                                             
    }                                                                                                                                                            
                                                                                                                                                                 
    Schedule {                                                                                                                                                   
    Name = "Windows_Centra-bdk"                                                                                                                                  
    Run = Level=Full on sun at 07:10                                                                                                                             
    Run = Level=Differential on mon-sat at 22:15                                                                                                                 
    } 
    

    Конфигурационный файл BD на этом завершен. Переходим к конфигурации SD — описанию файла bacula-sd.conf

    Ресурс Storage
    Storage { 
      # имя для SD
      Name = backupsrv.domain.ru-sd 
      # порт стандартный
      SDPort = 9103 
      # рабочая директория процесса(для статус файлов)
      WorkingDirectory = "/var/lib/bacula" 
      # pid будет здесь
      Pid Directory = "/var/run/bacula" 
      # биндится на этом ip
      SDAddress = 10.1.19.2 
    } 
    


    Ресурс Director(связь с BD описанном в конфиге bacula-dir.conf)
    Director {
      # имя DD, того самого, который был описан ранее
      Name = backupsrv.domain.ru-dir 
      # пароль  
      Password = "StoRage_PaSSw0rD" 
    } 


    Начинается описание различных девайсов, всего у меня используется 4 разных девайса. Я приведу в качестве примера два, для биллинга и для Windows.
    Ресурс Device для биллинга.
    
    Device {
      # имя,  о соответствии имен и паролей будет сказано ниже
      Name = BGB-ST 
      # тип
      Media Type = File 
      # директория где лежат файлы этого устройства(тома, volumes)  
      Archive Device = /backup/bgbilling 
      # новые тома будут обзываться согласно настроек Pool'а(здесь Vol*) см. 
      # конфиг DD
      LabelMedia = yes;
      # для устройства типа File должно быть так
      Random Access = Yes; 
      # если устройство открыто, использовать его
      AutomaticMount = yes;
      # думаю понятно =)
      RemovableMedia = no; 
      # открывать только тогда, когда стартует соответствующие задание
      AlwaysOpen = no; 
    } 
    


    Ресурс Device для файлового сервера Windows
    
    Device {                                                                                                                                                     
      Name = WINDOWS-ST                                                                                                                                          
      Media Type = File                                                                                                                                          
      Archive Device = /backup/windows                                                                                                                           
      LabelMedia = yes;                                                                                                                                          
      Random Access = Yes;                                                                                                                                       
      AutomaticMount = yes;                                                                                                                                      
      RemovableMedia = no;                                                                                                                                       
      AlwaysOpen = no;                                                                                                                                           
    }  
    


    Ресурс Messeges.
    Messages { 
     # имя
     Name = Standard 
     # отправлять  DD = имя директора  = слать все                       
     director = backupsrv.domain.ru-dir = all 
    } 


    Конфигурационный файл bconsole.conf, доступ в консоль Bacula.
     
    Director {
      Name = backupsrv.ray-com.ru-dir
      DIRport = 9101
      address = 10.1.19.2
      Password = "bacula_paS$w0rD10*"
    }
    


    Не забудьте создать соответствующие Storage папки и назначить bacula владельцем этих папок.
    Совет из комментариев
    @/usr/local/etc/bacula/client.conf

    @/usr/local/etc/bacula/job.conf

    @/usr/local/etc/bacula/pool.conf

    @/usr/local/etc/bacula/fileset.conf
    Конфиги можно разделить на разные файлы,
    Options { signature = MD5 compression = GZIP }
    и включить компрессию.

    Конфигурирование серверной части завершено.

    Конфиг клиента.

    Важно отметить, что каждый из клиентов должен резолвить fqdn имя сервера в его ip адрес! Обеспечте это средствами dns или пропишите в hosts!


    Ресурс Director.
    
    Director {
    # имя BD
    Name = backupsrv.domain.ru-dir
    # пароль для доступа к BD к клиенту(указан в ресурсе Client у BD)
    Password = "Fd_paSSw0rd"
    }
    Ресурс FileDaemon
    FileDaemon { 
    # имя клиента
    Name = bgbilling-fd
    # слушаем порт 9102
    FDport = 9102 
    WorkingDirectory = /usr/lib/bacula
    Pid Directory = /var/run/bacula
    FDAddress = 10.103.2.5
    }
    
    Ресурс Messeges
    Messages {
    Name = Standard
    director = backupsrv.domain.ru = all, !skipped, !restored
    append = "/var/bacula/log" = all, !skipped
    }
    


    В комментариях конфигурационных файлов я упоминал о схеме соответствия паролей и имен демонов в различных конфирурационных файлах, так вот, если вы где-то запутались — воспользуйтесь картинкой ниже.


    4. Пример процедуры востановления


    Для мониторинга и востановления ваших резервных копий удобно использовать утилиту bat.
    В Ubuntu она ставиться так
    
    # sudo aptitude install bacula-console-qt
    

    В портажах Gentoo я её не нашел, поэтому собирал из исходников.
    Конфигурационный файл bat.conf полностью аналогичен bconsole.conf, приведенному ранее.
    Итак, к примеру я хочу востановить архив базы данных биллинга за определенное число. Алгоритм, которым пользуюсь я, таков:
    1. Открываем bat и находим нужное задание

    2. вводим команду list files jobid=3059 для того чтобы убедиться что в задании есть нужные файлы

    3. Теперь переходим в консоль(мне так удобнее просто=)). В консоли я восстановлю архив биллинга на другого клиента

    $ sudo bconsole
    [sudo] password for onotole: 
    Connecting to Director 10.1.19.2:9101
    1000 OK: backupsrv.domain.ru-dir Version: 5.0.3 (30 August 2010)
    Enter a period to cancel a command.
    *restore
    Automatically selected Catalog: MyCatalog
    Using Catalog "MyCatalog" 
    
    First you select one or more JobIds that contain files
    to be restored. You will be presented several methods
    of specifying the JobIds. Then you will be allowed to
    select which files from those JobIds are to be restored.
    
    To select the JobIds, you have the following choices:
         1: List last 20 Jobs run
         2: List Jobs where a given File is saved
         3: Enter list of comma separated JobIds to select
         4: Enter SQL list command
         5: Select the most recent backup for a client
         6: Select backup for a client before a specified time
         7: Enter a list of files to restore
         8: Enter a list of files to restore before a specified time
         9: Find the JobIds of the most recent backup for a client
        10: Find the JobIds for a backup for a client before a specified time
        11: Enter a list of directories to restore for found JobIds
        12: Select full restore to a specified Job date
        13: Cancel
    Select item:  (1-13): 9
    Defined Clients:
         1: 192.168.15.12-fd
         2: 1.1.1.1-fd
         3: 1.1.1.75-fd
         4: ASTERISK-configs-fd
         5: DHCPD-configs-fd
         6: GW1-configs-fd
         7: GW2-configs-fd
         8: NAS-20-configs-fd
         9: NAS-21-configs-fd
        10: NAS-6-configs-fd
        11: NAS-ololo-configs-fd
        12: NS_AND_MAIL-configs-fd
        13: RADIUS-ololo-configs-fd
        14: VIRTSRV1-configs-fd
        15: bgbilling-fd
        16: configs-fd
        17: domain.ru-fd
        18: mydomain.ru-fd
        19: tv.domain.ru-fd
        20: zabbix.domain.ru-fd
    Select the Client (1-20): 15
    Automatically selected FileSet: bgbilling-set
    +-------+-------+----------+----------------+---------------------+------------+
    | JobId | Level | JobFiles | JobBytes       | StartTime           | VolumeName |
    +-------+-------+----------+----------------+---------------------+------------+
    | 3,292 | F     |    1,666 | 10,874,552,420 | 2011-12-19 02:31:08 | Vol0014    |
    +-------+-------+----------+----------------+---------------------+------------+
    To select the JobIds, you have the following choices:
         1: List last 20 Jobs run
         2: List Jobs where a given File is saved
         3: Enter list of comma separated JobIds to select
         4: Enter SQL list command
         5: Select the most recent backup for a client
         6: Select backup for a client before a specified time
         7: Enter a list of files to restore
         8: Enter a list of files to restore before a specified time
         9: Find the JobIds of the most recent backup for a client
        10: Find the JobIds for a backup for a client before a specified time
        11: Enter a list of directories to restore for found JobIds
        12: Select full restore to a specified Job date
        13: Cancel
    Select item:  (1-13): 12
    Enter JobId to get the state to restore: 3059
    Selecting jobs to build the Full state at 2011-12-06 02:28:47
    You have selected the following JobId: 3059
    
    Building directory tree for JobId(s) 3059 ...  +++++++++++++++++++++++++++++++++++++++++++++
    1,535 files inserted into the tree.
    
    You are now entering file selection mode where you add (mark) and
    remove (unmark) files to be restored. No files are initially added, unless
    you used the "all" keyword on the command line.
    Enter "done" to leave this mode.
    
    cwd is: /
    $ ls
    etc/
    root/
    usr/
    $ ls usr
    usr/
    $ mark usr 
    1,667 files marked.
    $ done
    Bootstrap records written to /backup/bacula-work//backupsrv.domain.ru-dir.restore.8.bsr
    
    The job will require the following
       Volume(s)                 Storage(s)                SD Device(s)
    ===========================================================================
    
        Vol0010                   BGB-F                     BGB-ST                   
    
    Volumes marked with "*" are online.
    
    1,667 files selected to be restored.
    
    Run Restore job
    JobName:         restore
    Bootstrap:       /backup/bacula-work//backupsrv.domain.ru-dir.restore.8.bsr
    Where:           /usr/restore
    Replace:         always
    FileSet:         bgbilling-set
    Backup Client:   bgbilling-fd
    Restore Client:  bgbilling-fd
    Storage:         BGB-F
    When:            2011-12-26 15:01:38
    Catalog:         MyCatalog
    Priority:        10
    Plugin Options:  *None*
    OK to run? (yes/mod/no): mod
    Parameters to modify:
         1: Level
         2: Storage
         3: Job
         4: FileSet
         5: Restore Client
         6: When
         7: Priority
         8: Bootstrap
         9: Where
        10: File Relocation
        11: Replace
        12: JobId
        13: Plugin Options
    Select parameter to modify (1-13): 5
    The defined Client resources are:
         1: bgbilling-fd
         2: GW1-configs-fd
         3: GW2-configs-fd
         4: NAS-6-configs-fd
         5: NAS-20-configs-fd
         6: NAS-21-configs-fd
         7: NAS-ololo-configs-fd
         8: DHCPD-configs-fd
         9: ASTERISK-configs-fd
        10: NS_AND_MAIL-configs-fd
        11: VIRTSRV1-configs-fd
        12: mydomain.ru-fd
        13: tv.domain.ru-fd
        14: domain.ru-fd
        15: 1.1.1.1-fd
        16: 1.1.1.75-fd
        17: zabbix.domain.ru-fd
        18: 192.168.15.12-fd
    Select Client (File daemon) resource (1-18): 2
    Run Restore job
    JobName:         restore
    Bootstrap:       /backup/bacula-work//backupsrv.ray-com.ru-dir.restore.8.bsr
    Where:           /usr/restore
    Replace:         always
    FileSet:         bgbilling-set
    Backup Client:   bgbilling-fd
    Restore Client:  GW1-configs-fd
    Storage:         BGB-F
    When:            2011-12-26 15:01:38
    Catalog:         MyCatalog
    Priority:        10
    Plugin Options:  *None*
    OK to run? (yes/mod/no): yes
    Job queued. JobId=3453
    You have messages.
    *
    


    4. Ждем успешного выполнения задания, статус можно отслеживать в том же bat


    Еще несколько скриншотов

    image




    Благодарю всех кто дочитал мой опус до конца.
    В качестве завершения позволю себе еще несколько советов.
    Важно не только делать бекапы и отслеживать что они выполнились без ошибок, но так же и регулярно их разворачивать и проверять. Подобная практика даёт еще +100 к указанным в начале спокойствию, крепкости нервов и здоровью. Так же очень хорошей практикой является регулярное резервное копирование базы данных bacula и bsr файлов.

    С наступающим Новым Годом вас!!!

    Использованые источники:


    1. www.ibm.com/developerworks/ru/library/l-Backup_4
    2. www.bacula.org/en/?page=documentation
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 49
    • +1
      Много слышал про Bacula, но всю статью не осилил не спавши почти сутки и много конфигов :), чисто по диагонали. Пугает количество демонов и постоянные «устройства», «томы» и «raid»в тексте. Можно ли их (демонов) разместить на двух хостах (сервер и рабочий, причем рабочий за натом без возможности прокинуть порты) баз отдельных разделов, винтов и т. п.? Грубо говоря на сервере (два раздела, ext4 / и swap) что-то крутится, а клиент обращается, запускает скрипты на сервере и пишет куда-нибудь в home (разделов много, хард один, в принципе не проблема создать отдельный раздел со вложенными extended, но не хочется)? Или Bacula для такого простого случая будет стрельбой из пушки по воробьям и достаточно использовать ssh, scp/rsync?
      • +1
        Думаю, что в данном случае действительно «как из пушки».
        Если серверов-клиентов 5-7 и в перспективе постоянный прирост, то следует взяться за bacula/.
        • +1
          Хехе… У меня Bacula DD и SD + Catalog установлены на моем самом обычном домашнем десктопе (Ubuntu) и бэкапят они 2 виртуалки на хостинге. В качестве GUI использую только Bat — интерфейс средней паршивости, но все задачи прекрасно можно выполнять из него, не изучая консольные команды.
          Ни капли не жалею что потратил вечер на настройку — все работает как часы, пару раз даже пользовался восстановлением из бэкапа
          • 0
            Bacula создавалась для работы со стримерами и потому там все так замутно с устройствами/томами/etc. И именно из-за этого Bacula очень любит использовать тома повторно. Когда я поднимал bacula с хранилищем на дисках, пришлось написать специальный сервисный скрипт (Job с Type=Admin), который перед backup job'ами пробегает по всем томам, удаляя устаревшие задачи, после чего удаляет все пустые тома из базы и с диска.
          • 0
            Спасибо за статью! Давно хотел познакомиться с Bacul'ой поближе, да все как-то руки не доходили, а тут — такой материал :)
            • 0
              Жаль вы не остановились на параллельном снятии бекапов с разных серверов (т.е. одновременно лить более одного бекапа). Так и не удалось понять, возможно ли это, если бекапы с разных серверов пишутся в разные Device, Но эти самые Device смотрят на один физический раздел.

              У меня все задания встают в очередь. С дифами это не страшно, а вот полные воскресные бекапы заканчиваются только к 12:00.
              • 0
                Увы, но в подобном функционале мы, возможно пока, не нуждаемся.
                • 0
                  Если у вас такая хрень с полными бекапами — почитайте про дедупликацию данных. Бакула умеет её на уровне ФС, что в принципе тоже неплохо (более тяжёлые решения умеют чуть-ли не на уровне кластеров). Вкратце — вы создаёте один, основной, бекап, который принимается за базовый. Далее, в задании для полного бекапа ссылаетесь на него, и те файлы, которые в базовом и полном совпадают, бекапиться не будут. Это похоже на дифференциальный бекап, с той разницей, что базовое задание может быть общим для разных бекапов — например, если делать бекап не данных, а целого сервака, то файлы ОС часто идентичны, что и даёт возможность сэкономить.
                  Но и для бекапа данных, который, я так подозреваю, у вас и происходит — базовый бекап позволит немножко снять нагрузку. Я делаю так: раз в два месяца делается базовый бекап, каждые выходные — полный, каждый день — инкрементал или диффы, в зависимости от ресурса.
                  • 0
                    Это интересно. Спасибо.
                    А зачем каждые два месяца полный бекап? «На всякий случай» или это необходимо?
                    • 0
                      Время восстановления и размер хранимых данных вестимо
                      • 0
                        Ко времени восстановления я также добавляю параметр надёжности. Это в теории инкременталы и диффы такие замечательные — на практике быстрее и надёжнее восстанавливается из огромного, но простого полного бекапа.
                      • 0
                        Очень просто — раз в два месяца базовый, это для одного из ресурсов (для других политики и сроки другие), потому что примерно за два месяца набегает довольно много изменений в данных этого ресурса, что приводит к неэффективности дедупликации, так как полные бекапы пишут всё, что отлично от базового. В числах: на ресурсе лежат 500 Gb данных, после создания базового размер первого полного — 15-20 Gb, через месяц — 50-80 Gb, через два — до двухсот доходит, поэтому разумнее снова сделать базовый, разгрузить полные и уменьшить таким образом окно резервного копирования, чтобы успело всё сделать за выходные.
                    • 0
                      Параметр «Maximum Concurrent Jobs» позволяет контролировать кол-во параллельных бэкапов, точнее сколько одновременно запущенных заданий может выполняться. Но стоит иметь ввиду. что могут быть проблемы, если два запущенных задания будут писать на один и тот же том.

                      Хотя все же лучше сделать как говорит Shajtan.
                      • 0
                        RTFM^W Обязательно прочтите документацию.
                      • 0
                        Отличная статья! Давно нуждаюсь в этом! ;)
                        Можно попросить: Если вы работали с ZFS и LVM напишите пожалуйста о них.

                        Недавно поднял на домашнем ZFS pool на базе MBR разметки и решил забэкапиться. Мне нужно знать где находятся метки и можно ли их бэкапить? Вот примерно то что я хочу избежать:Восстановление ZFS-пула с помощью подручных средств. Также начал рыть по теме LVM и тоже не нашел хоть сколь нибудь развернутого ответа. ;)
                        • 0
                          Про LVM на русском языке читайте здесь — xgu.ru/wiki/LVM
                          лучшего источника на русском языке я не знаю.
                          Что же касается ZFS, для разметки я бы все таки использовал GPT, а документация по ZFS есть на сайте оракла.
                          • –1
                            Ок, скажу по другому.
                            К примеру по каким-то причинам у вас пул устройств полетел и вывод #zpool import показывает пул с CORRUPTED. Что делать? Запуск #zpool status вообще устройство не выводит, как будто его и не существовало! Импортировать с Fixit не получается. Что делать? Какие конкретно шаги должны быть сделаны? И самое главное, что нужно было сделать чтобы эти шаги были минимальными?

                            >>а документация по ZFS есть на сайте оракла.
                            которая раскрывает теорию, а не практику! Практику восстановления смотрите ту статью ссылку на которую я привел выше. Загляните, не поленитесь! Вы поймете о чем я и также поймете что чтение мануалов тут не сразу поможет, тут нужно точное понимание где расположены «zfs vdev labels» и как их бэкапить.

                            >>для разметки я бы все таки использовал GPT
                            Для FreeBSd 10-тки, когда реализуют «EFI booting» обязательно перейдем на GPT.
                            • 0
                              Простите, но ваши вопросы ни как не корелируют с описанным в статье.
                              Я не могу вам помочь в рамках комментариев к статье.
                              • +1
                                Что вы делали такого, чтобы ушатать ZFS?
                                • –1
                                  А почему вопрос ко мне?
                                  Я ZFS не шатал =)
                                  • 0
                                    Так вопрос и не к вам =)
                                  • +1
                                    Сори, поторопился…
                                    • –1
                                      Что делал? Просто тестил некоторый продукт на разных ситуациях )
                                    • 0
                                      а как ты создаешь во FreeBSD разделы больше 2 ТБ?
                                      • –1
                                        К разметке диска это не имеет никакого отношения.
                                      • 0
                                        zfs export mytank
                                        zfs import mytank -f
                                        всё

                                        Причина такого поведения здесь.
                                  • 0
                                    Как говорится, пользуясь случаем, предлагаю тем, у кого есть linux-сервер с исходниками и бд, которые бы он хотел забэкапить. Можно воспользоваться моей статьёй — в ней нет описания что для чего означает каждая строчка в конфиге, но конфиг рабочий.
                                    • +2
                                      Хм… в таком случае у меня вопрос.
                                      Конфигурационные файлы приведенные мною не работают? Укажите в каком месте пожалуйста.
                                      • 0
                                        Нет, я для тех людей, у кого есть веб-сервера и не хотели бы особо морочиться с настройками бакулы. Я, например, такую статью искал: чтобы скопировать, поправить пару моментов и пользоваться. Но таковую не нашёл. И чтобы сохранить время другим людям, похожим на меня. =)
                                        Ваши конфиги я не проверял, думаю, что они рабочие.
                                      • 0
                                        Самопиар?
                                    • +2
                                      @/usr/local/etc/bacula/client.conf
                                      @/usr/local/etc/bacula/job.conf
                                      @/usr/local/etc/bacula/pool.conf
                                      @/usr/local/etc/bacula/fileset.conf

                                      Конфиги можно разделить на разные файлы,
                                      Options { signature = MD5 compression = GZIP }
                                      и включить компрессию.
                                      Еще у меня почему-то при попытке посмотреть в клиенте(bat,win7), в пункте bRestroe при выборе job`a вылетает пустое окно с заголовком «error». Встречались?
                                      • 0
                                        Спасибо за совет.
                                        Нет не встречался, bat у меня только на Ubuntu и на Gentoo, там таких ошибок небыло.
                                        • 0
                                          Согласен с вами. Очень удобная фича :)
                                          У меня один файл = одно задание. В bacula-dir.conf прописаны ресурсы Director, Catalog, Console, JobDefs, Job (задание для восстановления), Messages, т.к. они почти всегда одинаковы для всех заданий (у меня один директор и демон хранения). А в файлах все остальное (Client, FileSet, Job, Pool, Schedule, Storage).
                                          • 0
                                            Еще встретил очень интересный способ инклудить:
                                            @|"sh -c 'for f in /etc/bacula/clientdefs/*.conf ; do echo @${f} ; done'"
                                            • 0
                                              Да, в документации где-то такое встречается. Использую с каталогом jobs-enabled, в котором лежат симлинки на jobs-available, по аналогии с конфигом апача. А bat у меня тоже колбасит, возможно из-за несоответствия версий директора и самого бата.
                                            • 0
                                              bat под винду вообще мегаглючная штука. У меня регулярно вылетал при попытке построить дерево каталогов для восстановления. Давал его только с третьего-четвёртого раза, и только если после выпадания с ошибкой ткнуть в закладку консоли и просмотреть все-все сообщения об ошибках. Мистика… даже непонятно, что именно в багтрекер писать. Иногда повторялось, иногда работало идеально.
                                            • +1
                                              Тоже использую бакулу, почти год. Очень доволен. Особенно впечатляет гибкость конфигурации.
                                              По началу было немного сложновато с ней разобраться, а когда разобрался так стал удивляться: «А чего сложного-то?» :)

                                              > # fqdn имя сервера
                                              > Address = backupsrv.domain.ru

                                              Не обязательно… Можно указать IP адрес. Это справедливо для всех полей «Address =» во всех конфигах.

                                              Так же хотел бы заметить, что для бакулы нет разницы в пробелах и регистре в названии ресурсов и параметров. Например: «Media Type», «MediaType» и «mediatype» для бакулы одно и то же.
                                              • 0
                                                Согласен, но я использую доменное имя, поэтому примечание справедливо.
                                                Пароли и имена ресурсов(такие как backupsrv.domain.ru-dir и т.д.), все таки, должны совпадать во всех конфигурационных файлах.
                                                • 0
                                                  Заметку про «Address = » сделал, т.к. у не знающего может сложиться впечатление, что в том случае нужно только имя, а в других только ip ;)

                                                  Про второе не совсем понял к чему вы… Пароли и т.п. это ведь значения параметров и они конечно же должны совпадать. А вот названия параметров не важно как записано («Media Type», «MediaType» и «mediatype»). У меня, например, в одних конфигах «FD Port» (конфиг директора), а в других «fdport» (конфиг агента) и даже такое встречается (конфиг другого агента)
                                                  FDAddresses = {
                                                  ip = { addr = 10.3.1.3; port = 9102; }
                                                  }

                                                  и все работает отлично :)

                                                  // Просто конфиги, которые на сервере директора, я копировал из документации и правил под себя. А те что на клиентах уже писал сам.
                                                  • 0
                                                    Буду иметь ввиду, спасибо за информацию =)
                                              • 0
                                                А я столкнулся с тем, что наш HP Ultrium 9хх напроч не видится ядром линукса, а модули для ядра есть под старючие дистрибутивы :(
                                                Пришлось писать скрипт на повершелле под ntbackup на 2003 файлсервере, где он из коробки :(
                                                • 0
                                                  «Where: /usr/restore» — здесь можно уточнить, что процесс восстановления создает файлы относительно корня. То есть, если мы ресторим в /usr/restore забэкапленую ранее /etc/some/dir, то на выходе получим /usr/restore/etc/some/dir.
                                                  Иногда удобно, дабы руками аккуратно разгрести данные. Если такой необходимости нет, то можно указать «where: /»
                                                  И да, как уже сказано выше, конфиги, дабы было супер-кошерно-2.0 и красиво, лучше инклудить с помощью "@".

                                                  Сам месяц назад тоже столкнулся с необходимостью развернуть бакулу. В целом все понятно, но пулы с томами и метками по началу вводят в ступор. :)
                                                  • +2
                                                    я бы в jobs рекомендовал использовать Accurate = yes. Это включает режим, при котором в инкрементальных бэкапах производится корректный учет удаленных и переименованных файлов. Режим жрёт на сервере больше памяти и проца, но зато если вы удалили файл 1го декабря и восстановили бекап на 2е, то у вас удаленного файла в restore таки не будет.

                                                    лично мне bat показался очень глючным. Использую webacula.sourceforge.net — просто устанавливается, функционально и красиво.

                                                    ps: недавно bacula обновилась с версии 5. 0.3 (которую использует автор статьи) до 5.2.3. обещают справление многих багов и увеличение стабильности. подробности на www.bacula.org/en/?page=news
                                                    • 0
                                                      «Accurate = yes» штука хорошая и полезная. Но и вреда от нее хватает: если в винде включена индексация, то после того как винда проиндексирует файлы, большинство из них попадет в инкрементальные бэкап, т.о. инк. бэкап может весить как полный. Я с этим столкнулся когда разбирался, почему некоторые инк. бэкапы очень нужной программы весят почти как полные. Когда отключил индексацию в винде, то стало все нормально, но в программе перестал работать поиск. Пришлось включить индексацию и поставить «Accurate = no». И это при том, что в «FileSet» у меня «BaseJob», «Accurate» и «verify» выставлены в «s5» (size + md5).
                                                      • 0
                                                        Не кажется ли Вам, что в винде стоит использовать встроенный и штатный инструментарий, а не городить огород? у нас винда бекапится в файлик, файлики с бекапами уезжают на резервном файлсервере на ленточку.
                                                        • 0
                                                          Эм… ~400 гигов данных у этой программы и объем постоянно увеличивается, полный бэкап занимает 10-15 часов.
                                                          Если для вас это огород, то для чего тогда агент бакулы для винды существует?
                                                          Виндовым ntbackup'ом я бэкаплю состояние системы (реестр и т.п.), а полученный файл забираю бакулой. Но не 400 гигов же бэкапить виндовым бэкапером…
                                                          • 0
                                                            эм. в два раза больше данных ~800гб в полном бекапе у нас в компании уезжает в бекап с пятницы вечера до когда придется. daily бекап около 30 гигабайт улетает за час.
                                                            но у нас идет реорганизация сетевого диска, т.к. там валяются документа надцатилетней давности, которые не нужны, и настройка квот, так что скоро это будет раза в два меньше
                                                    • 0
                                                      Много времени назад (на черновиках хабра нет даты) взялся писать статью, но подробно описав весь пантеон демонов, и добавив в текст минимально требуемый текст конфигов с англоязычными комментариями, понял, что описать поднятие какой-либо конфигурации и задокументировать все файлы конфигурации у меня сил не хватит.
                                                      Очень рад, что у кого-то всё-таки хватило мужества написать такую статью. Отличная работа, FessAectan! Если ситуация за последнее время не поменялась, а статья так хороша, как мне кажется — это самая лучшая статья по теме на русском языке.

                                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.