背景
隨著數(shù)字化在我們?nèi)粘I钪性絹?lái)越高的比重,各行各業(yè)不可避免的產(chǎn)生越來(lái)越多的數(shù)據(jù)。對(duì)于日益增多的數(shù)據(jù),我們都有著備份的需求。如果有一套方案能夠提供無(wú)限的存儲(chǔ)空間,可以存儲(chǔ)所有主機(jī)上的數(shù)據(jù)的備份,那么我們就再也無(wú)需擔(dān)心數(shù)據(jù)的增長(zhǎng)了。阿里云對(duì)象存儲(chǔ)是一種海量、安全、低成本、高可靠的云存儲(chǔ)服務(wù),能夠完美契合我們的需求。而且通過(guò)將數(shù)據(jù)備份放在云端,本地就不再需要預(yù)留任何存儲(chǔ)空間給備份,可以大大提高本地存儲(chǔ)空間的利用效率。
如果我們想將數(shù)據(jù)從當(dāng)前主機(jī)定期備份到阿里云對(duì)象存儲(chǔ),有沒(méi)有什么好的方法呢?我們可以利用rsync命令,rsync是linux下面的一個(gè)非常強(qiáng)大和高效的工具,可以在指定的源目錄和目標(biāo)目錄之間進(jìn)行數(shù)據(jù)的同步,并且能夠?qū)崿F(xiàn)增量備份。不過(guò)它的源端和目標(biāo)端都是目錄,而阿里云對(duì)象存儲(chǔ)的訪問(wèn)協(xié)議是RESTFUL的接口,沒(méi)有辦法直接通過(guò)文件的協(xié)議進(jìn)行訪問(wèn)。這時(shí)候就需要用到云存儲(chǔ)網(wǎng)關(guān)了,云存儲(chǔ)網(wǎng)關(guān)能夠?qū)ESTFUL的對(duì)象訪問(wèn)協(xié)議轉(zhuǎn)換為傳統(tǒng)的NFS/SMB文件訪問(wèn)協(xié)議,大大降低應(yīng)用對(duì)于對(duì)象存儲(chǔ)的適配。而且通過(guò)云存儲(chǔ)網(wǎng)關(guān)提供的文件接口進(jìn)行備份,源端文件的uid/gid之類(lèi)的文件屬性在備份到OSS之后也不會(huì)丟失。接下來(lái)我們通過(guò)具體的實(shí)踐來(lái)展示整個(gè)數(shù)據(jù)備份的過(guò)程。
配置實(shí)踐
我們本地有一個(gè)/working的目錄,我們需要將這個(gè)目錄里面的數(shù)據(jù)備份到OSS存儲(chǔ)桶里面的/rsync/目錄里面。
[root@hz1 working]# ls
dir1 dir2 dir3
[root@hz1 working]# pwd
/working
我們首先創(chuàng)建了一個(gè)云存儲(chǔ)網(wǎng)關(guān)并創(chuàng)建了一個(gè)NFS共享。如果不熟悉云存儲(chǔ)網(wǎng)關(guān),可以參考如何在Linux上掛載OSS Bucket,里面詳細(xì)描述了創(chuàng)建網(wǎng)關(guān)NFS共享以及掛載的過(guò)程。下面就是我們創(chuàng)建的NFS共享,這里NFS共享的數(shù)據(jù)最終會(huì)存儲(chǔ)在OSS Bucket里面的rsync子目錄里面。
在我們的主機(jī)上,云存儲(chǔ)網(wǎng)關(guān)的NFS共享的掛載點(diǎn)位于/oss,剛開(kāi)始里面什么數(shù)據(jù)都沒(méi)有。
[root@hz1 /]# mount 172.16.0.241:/test-rsync /oss
[root@hz1 /]# ls /oss
[root@hz1 /]#
現(xiàn)在源端目錄和目的端目錄都已經(jīng)有了,接下來(lái)就該使用rsync進(jìn)行數(shù)據(jù)備份了。rsync功能很強(qiáng)大,但是使用起來(lái)卻非常簡(jiǎn)單。通過(guò)下面的命令我們就可以進(jìn)行備份了。-r選項(xiàng)表示對(duì)源目錄進(jìn)行遞歸操作。-a選項(xiàng)表明備份的時(shí)候保留文件uid/gid/owner/mtime等基本的文件屬性,其中mtime屬性會(huì)被用來(lái)后續(xù)判斷增量。以/working或者/working/方式指定源目錄決定了目標(biāo)目錄里面是否包含working這個(gè)文件夾。下面的示例是不會(huì)在目的端生成working目錄的。
[root@hz1 ——]# rsync /working/ /oss -rav
sending incremental file list
working/dir3/
working/dir3/new_abc
sent 1,557 bytes received 46 bytes 1,068.67 bytes/sec
total size is 400 speedup is 0.25
執(zhí)行完上面的命令之后,我們看到/oss目錄下面已經(jīng)包含了源目錄里面的那些文件了。
[root@hz1 ——]# ls /oss
dir1 dir2 dir3 new_file
那么這些文件有沒(méi)有同步到OSS里面呢,我們打開(kāi)阿里云OSS控制臺(tái)瀏覽相應(yīng)的目錄,可以看見(jiàn)這些文件無(wú)一例外的都已經(jīng)被上傳到了對(duì)應(yīng)的存儲(chǔ)桶里面。
總結(jié)
我們前面展示了如何利用rsync將文件備份到阿里云對(duì)象存儲(chǔ)里面。不過(guò)在實(shí)際的使用中,還有一些需要關(guān)注的地方,結(jié)合下面幾點(diǎn)相信能滿足絕大多數(shù)用戶的需求了,有需要的小伙伴感覺(jué)來(lái)嘗試一下吧。
前面只是展示了單次的備份過(guò)程,如果想要定期備份怎么辦呢?答案很簡(jiǎn)單,通過(guò)Linux Crontab定時(shí)任務(wù)就可以實(shí)現(xiàn)啦,網(wǎng)上相關(guān)的教程很多,這里就不做展開(kāi)了。
rsync是單線程工作的,所以如果碰到數(shù)據(jù)的備份速度不能滿足需求的時(shí)候,可以通過(guò)起多個(gè)rsync進(jìn)程的方式來(lái)提升同步的速度,可以讓不同的rsync進(jìn)程處理不同的目錄。
rsync通過(guò)掃描所有源端文件和目標(biāo)端文件來(lái)比對(duì)從而發(fā)現(xiàn)增量。如果源端文件非常多,比如達(dá)到億級(jí)別或者更多,掃描本身會(huì)產(chǎn)生非常大的負(fù)擔(dān)。所以如果結(jié)合用戶自身的業(yè)務(wù)能夠直接導(dǎo)出增量文件或者目錄,然后指定rsync只負(fù)責(zé)處理這部分增量文件,那么勢(shì)必能大大減少備份的時(shí)間。