開源備份工具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簡介均屬百度百科摘抄。


拓撲流程圖:

wKiom1nEkIOjaI54AAClkRbK9vY136.png

其實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

Client端:

[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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章