天天看點

開源備份工具bacula

BACULA安裝

    Bacula是一款開源的跨平台網絡備份工具,提供基于企業級的CS的備份解決方案。可以對資料進行備份、恢複、以及完整性校驗。

功能特點

支援完全備份,增量備份,差異備份。

支援多種恢複方式

支援多種檔案系統下的備份恢複(ext3、ext2、reiserfs、xfs、jfs、smbfs、iso9660、ntfs等)

支援各種備份媒體

支援多種作業系統

強大的内部功能

組成部分

一個完整的bacula備份系統,由下面5個部分組成

Director Daemon:負責監聽所有的備份、恢複、驗證、存檔事務,以及定制備份和恢複檔案計劃等,并将整個系統運作狀況記錄在一個資料庫檔案中。其配置檔案為bacula-dir.conf。

Storage Daemon(SD):主要負責将資料備份到存儲媒體上,而在資料恢複時,負責将資料從存儲媒體中傳送出去。其配置檔案為bacula-sd.conf。

File Daemon(FD):安裝在需要備份資料的機器上的守護程序,在備份資料時,它負責把檔案傳出,在恢複資料時負責接收資料并執行恢複操作。配置檔案為bacula-fd.conf。

Console:管理控制台。可以通過這個控制台連接配接到Director Daemon進行管理備份與恢複操作。

Monitor:程序監控端。

工作流程

1、通過console連接配接到Director端,備份恢複操作開始。

2、Director端從自己的資料庫中調出記錄資訊,對存儲端SD與用戶端FD的任務進行協調。

3、用戶端FD負責驗證Director的操作許可,如果驗證通過,則允許連接配接到存儲端SD

4、用戶端FD根據Director發出的請求去連接配接SD,将FD端的資料備份到存SD指定的存儲媒體上,或者将SD端存儲媒體中的資料傳回到用戶端FD指定的位置上,完成備份恢複過程。

以上是bacula簡介均屬百度百科摘抄。

拓撲流程圖:

開源備份工具bacula

其實bacula這5個核心元件不必分别裝在不同的機器上,筆者這兒就直接使用2台雲主機模拟服務流程:

1.京東雲主機:server [ console director mysql monitor SD ]

2.阿裡雲主機:client   [ FD ]

[root@JD ~]# uname -r

3.10.0-514.el7.x86_64

需要安裝資料庫

yum install mariadb* -y      

在Client和Server端下載下傳解壓預編譯包

[root@JD src]# pwd
/usr/local/src
[root@JD src]# tar -zvxf bacula-5.2.13.tar.gz 
[root@JD src]# cd bacula-5.2.13      

Client主機上:

[root@Aliyun bacula-5.2.13]# ./configure --prefix=/usr/local/bacula --enable-client-only
[root@Aliyun bacula-5.2.13]# make
[root@Aliyun bacula-5.2.13]# make install
[root@Aliyun bacula-5.2.13]# cd /usr/local/bacula/etc/      
[root@Aliyun etc]# egrep -v '^#|^$' bacula-fd.conf 
Director {##定義連接配接用戶端FD的控制端
  Name = JD-dir
  Password = "dc5XEaySjV90PBfM0wCChirlEYkH4feUXjesKNHxdU2X"
  ##名字和密碼是用來驗證Server控制端的連接配接操作是否合法,需要與Server端的bacula-dir.conf中的Director一緻.
}
Director {##定義允許連接配接用戶端FD的監控段
  Name = JD-mon
  Password = "JMRJc5OtI7eqz+Fh3mbe6yQJig6R6wwTftuWX7+bXUAx"
  ##一樣是驗證,這是驗證server端監控本地程序是否合法
  Monitor = yes##開啟監控
}
FileDaemon {                         ##定義用戶端的FD
  Name = xad-fd
  FDport = 9102                  #預設監聽端口
  WorkingDirectory = /usr/local/bacula/opt/bacula/working
  Pid Directory = /var/run
  Maximum Concurrent Jobs = 20##一次能處理的并發作業數
}
Messages {
  Name = Standard
  director = xad-dir = all, !skipped, !restored
}      

Server主機上:

[root@JD bacula-5.2.13]# ./configure --prefix=/usr/local/bacula --with-mysql #需開啟資料庫
[root@JD bacula-5.2.13]# make 
[root@JD bacula-5.2.13]# make install      

設定資料庫和建立庫和表

[root@JD bacula-5.2.13]# cd /usr/local/bacula/etc/
執行以下三個檔案,預設以資料庫root使用者且密碼為空進行,倘若root有密碼,則同時修改這三個檔案中連接配接資料庫的代碼段:
......
if mysql -D ${db_name} $* -u root -p00000000 -f <<END-OF-DATA 
 #添加紅色部分,-p後為root密碼
......
[root@JD etc]# ./grant_mysql_privileges	##開啟遠端連接配接
[root@JD etc]#./create_mysql_database ##建立資料庫
[root@JD etc]#./make_mysql_tables	##建立資料表
進入mysql并檢視是否有相關的資料資訊
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bacula             |
| mysql              |
| performance_schema |
| test               |
| xad                |
+--------------------+
6 rows in set (0.00 sec)      

Console端配置

[root@JD etc]# egrep -v '^#|^$' bconsole.conf##編輯console端配置檔案
Director {
  Name = JD-dir##Director端名稱
  DIRport = 9101##console預設端口
  address = Dir-IP##Director端位址
  Password = "dc5XEaySjV90PBfM0wCChirlEYkH4feUXjesKNHxdU2X"
  ##與Director端驗證是的密碼,需與Director端一緻
}      

Director端配置

控制端配置檔案共有10個邏輯段:

Director{...}      定義全局設定

Jobdefs{...}      定義預設執行任務

Job{...}        自定義一個備份或者恢複任務

Client{...}        定義要備份的主機位址

Fileset{...}      定義備份哪些資料,不備份哪些資料

Schedule{...}     定義備份時間政策

Storage{...}      定義資料的存儲方式

Pool{...}        定義供Job使用的池屬性

Catalog{...}      定義背景資料庫

Messages{...}     定義發送日志報告和記錄日志的位置

[root@JD etc]# egrep -v '^#|^$' bacula-dir.conf 
Director {                    #定義全局配置 
  Name = JD-dir
  DIRport = 9101                # 預設端口
  QueryFile = "/usr/local/bacula/etc/query.sql"
  WorkingDirectory = "/usr/local/bacula/opt/bacula/working"
  PidDirectory = "/var/run"
  Maximum Concurrent Jobs = 1##一次能處理的最大并發數
  Password = "dc5XEaySjV90PBfM0wCChirlEYkH4feUXjesKNHxdU2X"        
 # 與Console驗證的驗證 password需一緻
  Messages = Daemon##發送消息通知方式
}
JobDefs {##定義預設執行任務
  Name = "DefaultJob"
  Type = Backup##任務類型預設為備份,可選restore和verify
  Level = Incremental
  ##備份類型:Full(完全備份)、Incremental(增量備份)和Differential(差異備份)
 ##如果第一次沒做完全備份,則先進行完全備份後再執行Incremental
  Client = xad-fd##與用戶端主機FD配置檔案中一緻
  FileSet = "Full Set"##指定需要備份的資料政策,下文定義
  Schedule = "WeeklyCycle"##指定這個備份任務的執行時間政策,下文定義
  Storage = File###指定備份資料的存儲路徑與媒體,下文定義
  Messages = Standard
  Pool = File##指定備份使用的pool屬性,下文定義
  Priority = 10
  Write Bootstrap = "/usr/local/bacula/opt/bacula/working/%c.bsr"   #指定備份的引導資訊
}
Job {
  Name = "BackupClient1"
  JobDefs = "DefaultJob"
}
Job {
  Name = "BackupCatalog"
  JobDefs = "DefaultJob"
  Level = Full
  FileSet="Catalog"
  Schedule = "WeeklyCycleAfterBackup"
  # This creates an ASCII copy of the catalog
  # Arguments to make_catalog_backup.pl are:
  #  make_catalog_backup.pl <catalog-name>
  RunBeforeJob = "/usr/local/bacula/etc/make_catalog_backup.pl MyCatalog"
  # This deletes the copy of the catalog
  RunAfterJob  = "/usr/local/bacula/etc/delete_catalog_backup"
  Write Bootstrap = "/usr/local/bacula/opt/bacula/working/%n.bsr"
  Priority = 11                   # run after main backup
}
Job {##定義還原任務
  Name = "RestoreFiles"
  Type = Restore
  Client=xad-fd                 
  FileSet="Full Set"                  
  Storage = File                      
  Pool = Default
  Messages = Standard
  Where = /tmp/bacula-restores
}
FileSet {##定義需要的備份資料
  Name = "Full Set"
  Include {
    Options {
      signature = MD5
    }
    File = /usr/local/src##需要備份的資料的路徑
  }
  Exclude {
    File = /usr/local/bacula/opt/bacula/working
    File = /tmp
    File = /proc
    File = /tmp
    File = /.journal
    File = /.fsck
  }
}
Schedule {##定義時間政策
  Name = "WeeklyCycle"
  Run = Full 1st sun at 23:05
  Run = Differential 2nd-5th sun at 23:05
  Run = Incremental mon-sat at 23:05
}
Schedule {
  Name = "WeeklyCycleAfterBackup"
  Run = Full sun-sat at 23:10
}
FileSet {
  Name = "Catalog"
  Include {
    Options {
      signature = MD5
    }
    File = "/usr/local/bacula/opt/bacula/working/bacula.sql"
  }
}
Client {##定義用戶端
  Name = xad-fd
  Address = IP-Client##用戶端位址
  FDPort = 9102##用戶端端口
  Catalog = MyCatalog##資料庫存儲資訊方式
  Password = "dc5XEaySjV90PBfM0wCChirlEYkH4feUXjesKNHxdU2X"  ##與用戶端一緻
  File Retention = 30 days            # 資料循環時間,非備份檔案存儲時間
  Job Retention = 6 months            # 定義任務保持周期
  AutoPrune = yes                     # 任務超過保持周期是否自動删除
}
Storage {##定義儲存設備
  Name = File
  Address = IP-SD                # 儲存設備服務SD的位址
  SDPort = 9103   # 儲存設備通信端口
  Password = "dc5XEaySjV90PBfM0wCChirlEYkH4feUXjesKNHxdU2X"  ##需與SD端配置一緻
  Device = FileStorage   # 定義存儲媒體類型,需與SD端配置一緻
  Media Type = File   # 媒體類别,需與SD端配置一緻
}
Catalog {##定義日志和資料設定
  Name = MyCatalog
  dbname = "bacula"; dbuser = "root"; dbpassword = "00000000"##庫名和密碼
}
Messages {##儲存日志的格式和通知形式(郵件)
  Name = Standard
  mailcommand = "/usr/local/bacula/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: %t %e of %c %l\" %r"
  operatorcommand = "/usr/local/bacula/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 = "/usr/local/bacula/opt/bacula/log/bacula.log" = all, !skipped    ##bacual運作日志
  catalog = all
}
Messages {
  Name = Daemon
  mailcommand = "/usr/local/bacula/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula daemon message\" %r"
  mail = root@localhost = all, !skipped            
  console = all, !skipped, !saved
  append = "/usr/local/bacula/opt/bacula/log/bacula.log" = all, !skipped
}
Pool {
  Name = Default##定義池屬性
  Pool Type = Backup
  Recycle = yes                       #重複使用
  AutoPrune = yes                     #自動清除過期備份檔案
  Volume Retention = 365 days         # 備份檔案保留時間
}
Pool {
  Name = File
  Pool Type = Backup
  Recycle = yes                      
  AutoPrune = yes                    
  Volume Retention = 365 days         
  Maximum Volume Bytes = 50G          # 最大備份檔案的大小限制
  Maximum Volumes = 100               # 備份檔案個數最大限制
}
Pool {
  Name = Scratch
  Pool Type = Backup
}
Console {##定義console
  Name = JD-mon
  Password = "JMRJc5OtI7eqz+Fh3mbe6yQJig6R6wwTftuWX7+bXUAx"  ##需與console一緻
  CommandACL = status, .status
}      

SD配置檔案

[root@JD etc]# egrep -v '^#|^$' bacula-sd.conf 
Storage {                             # 定義存儲
  Name = JD-sd
  SDPort = 9103                   
  WorkingDirectory = "/usr/local/bacula/opt/bacula/working"
  Pid Directory = "/var/run"
  Maximum Concurrent Jobs = 20
}
Director {##控制端資訊
  Name = JD-dir
  Password = "dc5XEaySjV90PBfM0wCChirlEYkH4feUXjesKNHxdU2X"
}
Director {##監控端monitor資訊
  Name = JD-mon
  Password = "JMRJc5OtI7eqz+Fh3mbe6yQJig6R6wwTftuWX7+bXUAx"
  Monitor = yes
}
Device {##定義裝置媒體
  Name = FileStorage
  Media Type = File
  Archive Device = /tmp##存儲位置
  LabelMedia = yes;                   # 通過label指令建立卷檔案
  Random Access = Yes;#随機通路
  AutomaticMount = yes;               #自動挂載使用
  RemovableMedia = no;#支援可移動裝置
  AlwaysOpen = no;
}
Messages {
  Name = Standard
  director = JD-dir = all
}      

啟動方式

Server端:

[root@JD etc]#/usr/local/bacula/etc/bacula-ctl-dir start
[root@JD etc]#/usr/local/bacula/etc/bacula-ctl-sd start
[root@JD ~]# netstat -tunlp | grep 910
tcp        0      0 0.0.0.0:9101            0.0.0.0:*               LISTEN      26967/bacula-dir    
tcp        0      0 0.0.0.0:9103            0.0.0.0:*               LISTEN      27002/bacula-sd      
[root@Aliyun etc]# /usr/local/bacula/etc/bacula-ctl-fd start
[root@Aliyun ~]# netstat -tunlp | grep 910
tcp        0      0 0.0.0.0:9102            0.0.0.0:*               LISTEN      22685/bacula-fd      

繼續閱讀