Linux轉移海量小檔案的技巧

2021-08-21 21:36:26 字數 3058 閱讀 2938

在做檔案遷移或者伺服器遷移的時候,有時候會遇到海量小檔案的情況,尤其是有那種使用者上傳檔案,,附件的伺服器,動輒就是幾十上百g的檔案,而每個檔案只有幾k到幾十k,使用普通的cp,scp,ftp傳輸非常慢而且不支援斷點續傳。如果通過先打包再傳輸的方式,要消耗掉大量的儲存空間,而且壓縮和解壓又要消耗雙倍的時間,非常不划算。下面介紹幾種備份海量小檔案的方法,持續更新。

1、rsync同步

通過cp,scp,ftp備份檔案不僅要考慮到網路頻寬,並且在檔案又小又多的情況下傳輸速度也上不去,而且不支援斷點續傳,rsync同樣使用網路進行備份,不過有很大的好處,比如不受檔案系統的約束,只要是檔案就可以遠端傳輸,而且可以斷點續傳,rsync會自動掃瞄哪些傳輸完成,哪些沒有完成,哪些傳輸損壞,所以我們可以不受限與時間和空間,分批傳輸。

rsync的搭建非常簡單,只需安裝然後寫乙個配置檔案即可

被複製端安裝rsync伺服器

yum install rsync
編寫配置檔案 

vi /etc/rsyncd.conf
uid=nobody

gid=nobody

max connetctions=4

use chroot=no

log file=/var/log/rsyncd.log

transfer logging=yes

log format=%t %a %m %f %b

pid file=/var/run/rsyncd.pid

lock file=/var/run/rsyncd.lock

ignore errors

read only=yes

list=yes

最後啟動rsyncd

/usr/bin/rsync --daemon
然後在接收檔案的伺服器上,安裝rsync,然後只需一條命令就可以完成備份,但是要注意檔案的許可權問題,如果原始檔屬於root,備份命令由root發出,那麼同步完後檔案所屬也是root;如果原始檔是root,備份命令由nfsnobody發出,那麼備份後的檔案所屬為nfsnobody。

2、轉殖磁碟

眾所周知小檔案的複製要遠遠慢於單個大檔案的,因為檔案不停的建立,寫入,關閉要浪費巨大的開銷。但是我們可以把一塊磁碟,乙個塊裝置,甚至乙個lv看成乙個檔案,然後通過塊拷貝的方式進行快速複製,繞過作業系統對檔案的讀寫。說白了就是轉殖一塊硬碟。硬碟的讀寫速度最高能達到100mb/s左右,ssd甚至能達到600mb/s左右,而拷貝小檔案也就幾十mb的速度,所以說通過犧牲空間的方式來提高速度。這個在虛擬機器上非常容易實現,直接轉殖虛擬機器或者vmdk磁碟就可以了。

但是這種方式受制於你把檔案儲存在**了,如果是物理磁碟或者虛擬機器vmdk磁碟上非常容易轉殖,可是如果是使用了lvm的vg和lv怎麼辦,當然也是可以的,因為lv在linux裡也算是塊檔案,這裡我們要用到linux系統的乙個命令,就是dd。

dd命令可以實現以塊的方式讀取塊裝置,比如硬碟,然後再以塊的方式進行寫入,通過這種方式,就不需要考慮檔案大小和檔案數量的問題了,因為dd命令不同與cp命令,是以塊為單位的,並且整塊磁碟上的分割槽表,引導區都會被轉殖到新磁碟上。

但是dd命令相對與cp命令有乙個缺點,就是不能直接拷貝資料夾,而必須是乙個塊裝置,也就是/dev裡面的塊裝置。一般來說,拷貝一塊完整的物理硬碟應該是這樣的(兩塊硬碟的大小完全一樣)

dd if=/dev/sda of=/dev/sdb
根據這個,我們可以把一塊空白硬碟插到源伺服器上,通過dd命令把源伺服器的乙個lv的命令全部拷貝到空白硬碟上,再把這個硬碟拆下來放到備份伺服器上。在虛擬機器上這都是很容易實現的。

units = 扇區 of 1 * 512 = 512 bytes

扇區大小(邏輯/物理):512 位元組 / 512 位元組

i/o 大小(最小/最佳):512 位元組 / 512 位元組

disk /dev/sdb: 85.9 gb, 85899345920 bytes, 167772160 sectors

units = sectors of 1 * 512 = 512 bytes

sector size (logical/physical): 512 bytes / 512 bytes

i/o size (minimum/optimal): 512 bytes / 512 bytes

注意這裡的sdb要和被轉殖的lv完全一樣的大小,由於lv的大小經常不是整數,所以我這裡建立的/dev/sdb要比lv中的已用空間稍微大一些,但是不能大的太多,因為多出來的部分也會被dd命令寫入,白白浪費時間。

同樣,如果想要把檔案系統做的靈活,也可以從乙個lv拷貝到另乙個lv中,注意在拷貝的過程中兩個lv最後都umount掉,防止有程式再寫入或者修改檔案。其實不umount也有很大概率成功,我試過,不過還是推薦先umount。

這個方法告訴我們,如果我們要儲存一些大量檔案,最好是放到單獨的lv或者磁碟下面,這樣以後遷移或者備份都會容易一些。

3、直接遠端掛載

有些情況下,我們不需要把檔案完全的拷貝或者遷移,只要新的伺服器能夠讀到就可以了,如果對檔案io要求不太大,可以直接把原來的伺服器作為檔案伺服器使用,通過nfs的方式,把檔案系統通過網路讓遠端伺服器進行掛載,簡單的說,就是把源伺服器改造成乙個nas伺服器

yum install nfs-utils
然後編輯nfs配置檔案

vi /etc/exports

第乙個引數是要分享的目錄,第二個引數是允許連線的ip位址,如果允許多個ip,可以重複寫上面這句多行。

rw代表可讀寫,async代表支援非同步讀寫(速度更快),sync即變化立即寫入磁碟(事務性更好)

all_squash是把所有使用者建立的檔案所屬都降低成nfsnobody,如果是root_squash則是只把root使用者建立的檔案所屬變為nfsnobody,其他使用者的檔案還是保留原所屬,這樣會帶來一些許可權問題導致的無法修改或建立。

啟動nfs服務

service nfs start
在遠端伺服器只需修改/etc/fstab進行掛載即可,加入如下一行

海量小檔案同步

集中式儲存是目前中小企業廣泛採用的方案,隨著時間的流逝,這些儲存不可避免的膨脹。集中式儲存的弊端愈加顯現,同步就是其中乙個。環境 檔案容量以tb計,裡面是千萬 億級的小檔案,分布在成千上萬的子資料夾內。分析 rsync幾乎是唯一選擇,海量小檔案同步面臨的問題主要是rsync無止境的掃瞄,同步進度難以...

Linux下刪除海量小檔案最快方法

測試一下linux下面刪除大量檔案的效率。首先建立50萬個檔案 test for i in se q1500000 doec hote xt seq 1 500000 do echo text seq15 0000 0 d oech otex t i.txt done 1.rm刪除 time rm ...

linux快速刪除大量小檔案

在linux下面刪除大量資料夾的情況,如 需要刪除100萬個檔案或者資料夾。這個時候,我們本來的刪除命令rm rf 就不好使了,因為要等待的太久。所以必須要採取一些非常手段。我們可以使用rsync來實現快速 刪除大量檔案。方法如下 1.安裝rsync yum y install rsync 2.建立...