一、概述
在數據作為生產資料的今天,數據早已成為各行各業的生命源泉,數據安全的重要性不言而喻。數據備份是數據安全的基礎,完整的備份和有效的恢復手段是應對一切突發狀況的重要保障。同時數據備份也對數據的重新利用,發揮數據更大價值,有著重大的作用。
?
而數據備份的重點是對數據庫的備份。定期對數據庫進行數據備份,以便能在未來發生系統故障、人為誤操作等情況時,進行數據恢復,防范于未然。
?
巨杉數據庫作為新一代分布式交易型數據庫,采用“計算與存儲分離”的架構;和同時期發展分布式數據庫的燈塔廠商AWS在架構上不謀而合。能夠在微服務時代更好支撐應用便捷開發的需求。
?
計算與存儲分離的架構,也使得巨杉數據庫擁有多種多樣的備份恢復方法。在巨杉數據庫的存儲引擎層和SQL實例層都可以達到對數據庫備份恢復的目的。
?
計算與存儲分離架構圖
?
?
二、存儲引擎層的備份恢復
巨杉數據庫采用自研的 SequoiaDB 分布式存儲引擎,支持物理備份(db.backup)與邏輯備份(sdbexprt)。
?
物理備份是指轉儲數據庫物理文件(如數據文件、日志文件等),一旦數據庫發生故障,可以利用這些文件進行還原;通??梢苑譃槿總浞菖c增量備份。巨杉數據庫物理備份可以針對全庫進行或者指定數據組進行;
?
巨杉數據庫做物理備份和恢復工作時,要注意分布式數據庫與關系型數據庫的不同,即分布式數據庫數據恢復會涉及到多臺服務器的數據庫物理文件,而不只是某一臺服務器上的數據庫物理文件。
?
邏輯備份是指對數據庫對象(如用戶、表、存儲過程等)利用工具進行導出,同時也可以利用工具把邏輯備份文件導入到數據庫。巨杉數據庫邏輯備份可以將集合(表)導出為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) |
[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 -hFilesystem 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% /opt192.168.1.5:/sdbdata/backup 985G 129G 807G 14% /sdbdata/backup
?
2. 全量備份
[sdbadmin@sdb05 ~]#cat backup_full.sh#!/bin/bashdate/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"]。
3. 增量備份
[sdbadmin@sdb05 ~]#cat backup_incre.sh#!/bin/bashdate/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
?
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}dossh $hostname /opt/sequoiadb/bin/sdbstop -t alldone#全量恢復一份完整的副本數據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 0done#刪除另外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 & donedone#啟動集群/bin/read -p " Do you want to start SequoiaDB(yes or no)? " Dowhile [[ "$Do" != "no" ]] && [[ "$Do" != "yes" ]]do/bin/read -p "Do you want to start SequoiaDB(yes/no)?" Dodoneif [ "$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 )
5. 增量恢復
[sdbadmin@sdb05 ~]#cat restore_incre.sh#!/bin/bash#停止集群for hostname in {sdb03,sdb04,sdb05}dossh $hostname /opt/sequoiadb/bin/sdbstop -t alldone#增量恢復副本數據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 -1done#啟動集群/bin/read -p " Do you want to start SequoiaDB(yes or no)? " Dowhile [[ "$Do" != "no" ]] && [[ "$Do" != "yes" ]]do/bin/read -p "Do you want to start SequoiaDB(yes/no)?" Dodone
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
?
巨杉數據庫自帶的邏輯備份恢復工具為 sdbexprt 和 sdbimprt。
?
1. sdbexprt 工具使用
sdbexprt 可以將集合從 SequoiaDB 數據庫導出為 json 格式或者 csv 格式的數據存儲文件。sdbexprt 支持將一個集合導出到一個文件中,同時也支持將多個集合批量導出到指定目錄下。
(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 \--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 的缺點是備份的過程是串行化的,不能并行的進行備份,速度較慢。
(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公司開發和維護。
$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和系統運維人的必修課,在分布式環境下,雖然分布式數據庫會有不同的機制保證數據的安全,但是數據的備份和恢復仍然是在生產環境中特別需要注意的一個重點,也希望大家一定要熟練掌握。
總結
以上是生活随笔為你收集整理的分布式数据库的数据备份/恢复,这些你一定要了解的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。