1. 程式人生 > 實用技巧 >分散式資料庫的資料備份/恢復,這些你一定要了解

分散式資料庫的資料備份/恢復,這些你一定要了解

一、概述

在資料作為生產資料的今天,資料早已成為各行各業的生命源泉,資料安全的重要性不言而喻。資料備份是資料安全的基礎,完整的備份和有效的恢復手段是應對一切突發狀況的重要保障。同時資料備份也對資料的重新利用,發揮資料更大價值,有著重大的作用。

而資料備份的重點是對資料庫的備份。定期對資料庫進行資料備份,以便能在未來發生系統故障、人為誤操作等情況時,進行資料恢復,防範於未然。

巨杉資料庫作為新一代分散式交易型資料庫,採用“計算與儲存分離”的架構;和同時期發展分散式資料庫的燈塔廠商AWS在架構上不謀而合。能夠在微服務時代更好支撐應用便捷開發的需求。

計算與儲存分離的架構,也使得巨杉資料庫擁有多種多樣的備份恢復方法。在巨杉資料庫的儲存引擎層和SQL例項層都可以達到對資料庫備份恢復的目的。

計算與儲存分離架構圖

二、儲存引擎層的備份恢復

巨杉資料庫採用自研的 SequoiaDB 分散式儲存引擎,支援物理備份(db.backup)與邏輯備份(sdbexprt)。

物理備份是指轉儲資料庫物理檔案(如資料檔案、日誌檔案等),一旦資料庫發生故障,可以利用這些檔案進行還原;通常可以分為全量備份與增量備份。巨杉資料庫物理備份可以針對全庫進行或者指定資料組進行;

巨杉資料庫做物理備份和恢復工作時,要注意分散式資料庫與關係型資料庫的不同,即分散式資料庫資料恢復會涉及到多臺伺服器的資料庫物理檔案,而不只是某一臺伺服器上的資料庫物理檔案。

邏輯備份是指對資料庫物件(如使用者、表、儲存過程等)利用工具進行匯出,同時也可以利用工具把邏輯備份檔案匯入到資料庫。巨杉資料庫邏輯備份可以將集合(表)匯出為json或者csv 格式,實現快速平滑的遷移。

  • 物理備份恢復方法

下面採用3臺機器的巨杉資料庫級群(3副本),來說明儲存引擎層的物理備份恢復方法。

1. 前期準備

  • 主機資訊備註:

IP

Hostname

SequoiaDB使用者

備註

192.168.1.3

sdb03

sdbadmin

192.168.1.4

sdb04

sdbadmin

192.168.1.5

sdb05

sdbadmin

備份磁碟(掛載目錄/sdbdata/backup)

  • 通過NFS將備份目錄共享
[root@sdb05 ~]# cat /etc/exports
/sdbdata/backup   *(insecure,rw,sync,no_wdelay,insecure_locks,no_root_squash)


[root@sdb03 ~]# mount -t nfs -o rw,bg,hard,nointr,tcp 192.168.1.5:/sdbdata/backup /sdbdata/backup
[root@sdb03 ~]# chown -R sdbadmin:sdbadmin_group /sdbdata/backup


[root@sdb04 ~]# mount -t nfs -o rw,bg,hard,nointr,tcp 192.168.1.5:/sdbdata/backup /sdbdata/backup
[root@sdb04 ~]# chown -R sdbadmin:sdbadmin_group /sdbdata/backup
[root@sdb04 ~]# df -h
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/centos-root       15G  4.4G   11G  29% /
/dev/vdb                      985G  129G  806G  14% /sdbdata
/dev/vda1                     497M  172M  326M  35% /boot
/dev/vda3                      50G   13G   38G  26% /opt
192.168.1.5:/sdbdata/backup  985G  129G  807G  14% /sdbdata/backu

2. 全量備份
  • 全量備份指令碼
[sdbadmin@sdb05 ~]#cat backup_full.sh
#!/bin/bash
date
/opt/sequoiasql/mysql/bin/mysqldump --login-path=mysql -A -d > /sdbdata/backup/full/create`date +%y%m%d%H`.sql
/opt/sequoidb/bin/sdblist -l -m list > /sdbdata/backup/full/sdblist`date +%y%m%d%H`.sql
/opt/sequoiadb/bin/sdb 'db=new Sdb()'
/opt/sequoiadb/bin/sdb 'db.backup ( { Name : "cluster_backup", Path : "/sdbdata/backup/full/%g", Overwrite : true, Description : "full_backup" } ) ;'
date


db.backup()備份常用引數說明
Name:備份名稱,預設則以當前時間格式命名,如“2016-01-01-15:00:00”,格式為“YYYY-MM-DD-HH:mm:ss”。
Description:備份使用者描述資訊。
Path:本次備份的指定路徑,預設為配置引數“bkuppath”中指定的路徑。
EnsureInc:備份方式,true 表示增量備份,false 表示全量備份,預設為 false。
OverWrite:對於同名備份是否覆蓋,true 表示覆蓋,false 表示不覆蓋,如果同名則報錯;預設為 false。
GroupName:對指定組進行備份,預設為對全系統備份,當需要對多個組進行備份可以指定為陣列型別,如:["datagroup1", "datagroup2"]。
  • 執行全量備份,查看錶test100.b 的記錄

  • 執行全量備份

3. 增量備份
  • 增量備份指令碼
[sdbadmin@sdb05 ~]#cat backup_incre.sh
#!/bin/bash
date
/opt/sequoiasql/mysql/bin/mysqldump --login-path=mysql -A -d > /sdbdata/backup/full/create`date +%y%m%d%H`.sql
/opt/sequoidb/bin/sdblist -l -m list > /sdbdata/backup/full/sdblist`date +%y%m%d%H`.sql
/opt/sequoiadb/bin/sdb 'db=new Sdb();'
/opt/sequoiadb/bin/sdb 'db.backup ( { Name : "cluster_backup", Path : "/sdbdata/backup/full/%g", EnsureInc : true } );'
date
  • 執行增量備份,向表test100.b中插入100萬條資料

  • 進行增量備份

4. 全量恢復
  • 全量恢復指令碼
(1)配置單向ssh 免密服務
[sdbadmin@sdb05 ~]#ssh-keygen -t rsa
[sdbadmin@sdb05 ~]#ssh-copy-id sdbadmin@sdb03
[sdbadmin@sdb05 ~]#ssh-copy-id sdbadmin@sdb04
[sdbadmin@sdb05 ~]#ssh-copy-id sdbadmin@sdb05


(2)恢復指令碼
[sdbadmin@sdb05 ~]#cat restore_full.sh
#!/bin/bash
#停止叢集
for hostname in {sdb03,sdb04,sdb05}
do
ssh $hostname /opt/sequoiadb/bin/sdbstop -t all
done
#全量恢復一份完整的副本資料
for groupname  in `cat /sdbdata/backup/full/sdblist20200717.sql | awk '{print $8}' | grep -Evi "GroupName|SYSCoord" `
do
/opt/sequoiadb/bin/sdbrestore -p /sdbdata/backup/full/$groupname/ -n cluster_backup -b 0 -i 0
done
#刪除另外2臺伺服器之前的副本資料,scp拷貝全量恢復的副本資料
for hostname in {sdb03,sdb04}
do
   for dbpath in `cat /sdbdata/backup/full/sdblist20200717.sql | awk '{print $10}'| grep -Evi "dbpath|*11810"`
   do
     ssh -t sdbadmin@$hostname "rm -rf "$dbpath*
     scp -pr $dbpath* $hostname:$dbpath &
   done
done
#啟動叢集
/bin/read -p " Do you want to start SequoiaDB(yes or no)?  " Do
while [[ "$Do" != "no" ]] && [[ "$Do" != "yes" ]]
do
/bin/read -p "Do you want to start SequoiaDB(yes/no)?" Do
done
if [ "$Do" == "yes" ]
then
   for hostname in {sdb03,sdb04,sdb05}             
   do                                              
   ssh $hostname /opt/sequoiadb/bin/sdbstart -t all
   done                                            
elif [ "$Do" == "no" ]                         
then 
   echo "please start SequoiaDB by hand"
fi


sdbrestore資料恢復常用引數:
--bkpath -p:備份源資料所在路徑。
--increaseid -i:需要恢復到第幾次增量備份,預設恢復到最後一次 ( -1 )。
--beginincreaseid -b:需要從第幾次備份開始恢復,預設由系統自動計算 ( -1 )。
--bkname -n:需要恢復的備份名。
--action -a:恢復行為,“restore”表示恢復,“list”表示檢視備份資訊,預設為“restore”。
--diaglevel -v:恢復工具自身的日誌級別,預設為 WARNING ( 3 
  • 執行全量恢復,清空test100.b 表的記錄

  • 執行全量恢復

  • 檢視全量恢復後test100.b 表的記錄條數

5. 增量恢復
  • 增量恢復指令碼
[sdbadmin@sdb05 ~]#cat restore_incre.sh
#!/bin/bash
#停止叢集
for hostname in {sdb03,sdb04,sdb05}
do
ssh $hostname /opt/sequoiadb/bin/sdbstop -t all
done
#增量恢復副本資料
for groupname  in `cat /sdbdata/backup/full/sdblist20200717.sql | awk '{print $8}' | grep -Evi "GroupName|SYSCoord"`
do
/opt/sequoiadb/bin/sdbrestore -p /sdbdata/backup/full/$groupname/ -n cluster_backup -b -1
done
#啟動叢集
/bin/read -p " Do you want to start SequoiaDB(yes or no)?  " Do
while [[ "$Do" != "no" ]] && [[ "$Do" != "yes" ]]
do
/bin/read -p "Do you want to start SequoiaDB(yes/no)?" Do
done


if [ "$Do" == "yes" ]
then
   for hostname in {sdb03,sdb04,sdb05}             
   do                                              
   ssh $hostname /opt/sequoiadb/bin/sdbstart -t all
   done                                            
elif [ "$Do" == "no" ]                         
then 
   echo "please start SequoiaDB by hand"
fi
  • 執行增量恢復

  • 檢視增量恢復後test100.b 表的記錄條數

  • 增量恢復後,表test100.b資料完全恢復

邏輯備份恢復方法

巨杉資料庫自帶的邏輯備份恢復工具為 sdbexprt 和 sdbimprt。

1. sdbexprt 工具使用

sdbexprt 可以將集合從 SequoiaDB 資料庫匯出為 json 格式或者 csv 格式的資料儲存檔案。sdbexprt 支援將一個集合匯出到一個檔案中,同時也支援將多個集合批量匯出到指定目錄下。

  • sdbexprt常用引數說明

  • SequoiaDB 採用 json文件型別定義資料儲存模型(類物件儲存)。邏輯備份恢復採用json格式,更加平滑高效。下面把資料匯出 json 格式為例:
(1)匯出集合sbtest.sbtest1 的資料
sdbexprt \
--hostname   "localhost"  \
--svcname    "11810"    \
--user       "sdbadmin" \
--password   "sdbadmin"
--type       'json'      \
--csname     'sbtest' \
--clname     'sbtestl' \
--file       '/tmp/sbtest.sbtest1.json'


(2)匯出集合空間sbtest下,所有集合的資料
sdbexprt \
--hostname   "localhost"  \
--svcname    "11810"    \
--user       "sdbadmin" \
--password   "sdbadmin"
--type       'json'      \
--cscl     'sbtest' \
--dir       '/tmp'
Note:SQL例項層與儲存引擎層對應關係為庫名等同於底層的集合空間;表名等同於底層的集合。
2. sdbimprt工具使用

sdbimprt 是巨杉資料庫自帶的資料匯入工具,它可以將json格式或csv格式的資料高效平滑的匯入到巨杉資料庫中。

為了可以最大化提升 I/O 與網路吞吐量,對於百GB級檔案建議將資料匯入檔案切分為多個子檔案並且存放於不同伺服器,採用多伺服器並行載入策略;並且在檔案載入過程中使用-j 引數開啟多執行緒。

sdbimprt並行匯入架構圖

  • sdbimprt 常用引數說明

  • 下面以匯入json格式資料為例
sdbimprt \
--hosts        'localhost:11810'    \
--user         'sdbadmin'           \
--password     'sdbadmin'           \  
--csname       'sbtest'           \
--clname       'sbtest1'           \
--insertnum    10000                \
--jobs         20                   \
--type         'json'                \
--file         '/tmp/sbtest.sbtest1.json'
--coord        false                \
--ignorenull   true                 \
--verbose      true                 \
--force        false                \
--errorstop    true                 \
--sharding     true                 \
--transaction  false                \
--allowkeydup  true     

三、SQL 例項層的備份操作

巨杉資料庫在聯機交易場景下,SQL 例項層主要以 MySQL 為主;原生 MySQL 資料庫同樣支援物理備份(Xtrabackup等)和邏輯備份(mysqldump、mysqlpump、mydumper)。

原生MySQL資料庫物理檔案只存在於單臺伺服器與分散式資料庫存在較大差異;物理備份工具(Xtrabackup等)並不適用於巨杉資料庫SQL例項層。邏輯備份工具(mysqldump、mysqlpump、mydumper)是完全適用的,下面以mysqldump、mydumper 為例進行說明。

1. mysqldump 工具使用

mysqldump 是 MySQL 自帶的邏輯備份工具。它的備份原理是,通過協議連線到 MySQL 資料庫,將需要備份的資料查詢出來,將查詢出的資料轉換成對應的insert語句。

mysqldump 的優點是簡單靈活,資料格式清晰,方便編輯,可以進行不同級別備份。mysqldump 的缺點是備份的過程是序列化的,不能並行的進行備份,速度較慢。

  • mysqldump 常用引數說明

  • 使用mysqldump實現資料庫備份,常見場景
(1)備份所有庫:
mysqldump -h 192.168.3.6 -P 3306  -u root -p root123456  -A > /backup/all.sql
(2)備份幾個庫:
mysqldump --h 192.168.3.6 -P 3306  -u root -p root123456  -B 庫名1 庫名2 > /backup/database.sql
(3)備份單個庫某幾個表(表名用空格隔開即可)
Mysqldump -h 192.168.3.6 -P 3306  -u root -p root123456  庫名 表名1 表名2> /backup/table.sql
(4)mysqldump恢復
mysql -h 192.168.3.6 -P 3306  -u root -p root123456 < /backup/all.sql;
或者
MySQL>source /backup/all.sql
2. mydumper&myloader工具使用

mydumper&myloader是用於對MySQL資料庫進行多執行緒備份和恢復的開源 (GNU GPLv3)工具。開發人員主要來自MySQL、Facebook和SkySQL公司,目前由Percona公司開發和維護。

  • mydumper常用引數說明:

  • myloader常用引數說明:

  • 示例:備份恢復sbtest
$time mydumper -h 192.168.3.6 -P 3306  -u root -p root123456 -t 6  -c  -e -B sbtest -o /home/data/
$time myloader -h 192.168.3.6 -P 3306  -u root -p root123456 -t 6 -B sbtest -o -d /home/data

  • 小結

除了上文介紹到的一些技術點,我們在實際應用中也可以選擇第三方備份軟體或者資料備份一體機進行集中的資料備份管理;實現對資料庫、檔案、作業系統、虛擬機器的實時、定時備份。這裡大家可以也和我們互動一下,一起分享一下大家使用第三方工具、軟體進行資料恢復備份的一些經驗。

資料備份和恢復,是所有DBA和系統運維人的必修課,在分散式環境下,雖然分散式資料庫會有不同的機制保證資料的安全,但是資料的備份和恢復仍然是在生產環境中特別需要注意的一個重點,也希望大家一定要熟練掌握。