您好,登錄后才能下訂單哦!
需求:
主機上有上百G的備份文件要rsync到遠端主機,我們將大文件進行切割為幾十個小文件進行多線程傳輸。
這里使用14個1G的文件進行演示:
[root@vm0 test]# pwd /root/test [root@vm0 test]# ll 總用量 13631540 -rw-r--r--. 1 root root 1073741824 6月 11 18:29 test10.data -rw-r--r--. 1 root root 1073741824 6月 11 18:30 test11.data -rw-r--r--. 1 root root 1073741824 6月 11 18:31 test12.data -rw-r--r--. 1 root root 1073741824 6月 11 18:31 test13.data -rw-r--r--. 1 root root 1073741824 6月 11 18:32 test14.data -rw-r--r--. 1 root root 1073741824 6月 11 18:23 test2.data -rw-r--r--. 1 root root 1073741824 6月 11 18:24 test3.data -rw-r--r--. 1 root root 1073741824 6月 11 18:25 test4.data -rw-r--r--. 1 root root 1073741824 6月 11 18:26 test5.data -rw-r--r--. 1 root root 1073741824 6月 11 18:26 test6.data -rw-r--r--. 1 root root 1073741824 6月 11 18:27 test7.data -rw-r--r--. 1 root root 1073741824 6月 11 18:28 test8.data -rw-r--r--. 1 root root 1073741824 6月 11 18:29 test9.data [root@vm0 test]#
腳本名:tq.pl
#!/usr/bin/env perl use strict; use threads; use Thread::Queue; use File::Find; use File::Rsync; use POSIX qw(strftime); #本地主機文件目錄 my $srcFilePath='/root/test/'; #使用隊列,將要備份的文件逐一插入隊列 my $fileQueue = Thread::Queue->new(); #遠端主機備份目錄 my $remotedir='lansgg@192.168.137.129::lansggtest'; #最大線程數 my $thread_max = 5; my $backupTime = strftime("%Y%m%d%H%M%S",localtime(time)); print "begin : $backupTime\n"; #檢索要備份目錄下的所有文件,. 除外。 linux中 . 代表當前目錄 sub findAllFile { unless ( $_ eq '.'){ print "corrent file : $File::Find::name \n"; $fileQueue->enqueue($_); } } find(\&findAllFile,$srcFilePath); #使用rsync進行傳輸 sub rsync { my $file = shift; print "rsync -- $file \n"; my $obj = File::Rsync->new( { archive => 1, compress => 1, checksum => 1, recursive => 1, times => 1, # verbose => 1, timeout => 300, progress => 1, stats => 1, 'ignore-times' => 1, 'password-file' => './rsync.pass', } ); $obj->exec( { src => "$srcFilePath$file", dest => $remotedir } ) or warn "rsync Failed ! \n"; #print $obj->out; } #檢查隊列中未傳輸的文件 while ($fileQueue->pending()){ if (scalar(threads->list()) < $thread_max ){ my $readQueue = $fileQueue->dequeue(); # print "current file Queue is $readQueue \n"; #生成線程 threads->create(\&rsync,$readQueue); #查看當前線程總數 my $thread_count = threads->list(); # print "thread_count is $thread_count\n"; } #確定當前線程是否作業完成,進行回收 foreach my $thread (threads->list(threads::all)){ if ($thread->is_joinable()){ $thread->join(); } } } #join掉剩下的線程(因為在while中的隊列為空時,可能還有線程在執行,但是此時程序將退出while循環,所以這里需要額外程序join掉剩下的線程) foreach my $thread ( threads->list(threads::all) ) { $thread->join(); } $backupTime = strftime("%Y%m%d%H%M%S",localtime(time)); print "end : $backupTime\n";
此腳本是使用了核心功能,后期可以加上日志記錄,郵件發送等功能。
當我們執行該腳本時,查看主機線程情況
[root@vm0 pl]# ps -ef |grep tq root 6377 2152 88 19:05 pts/3 00:00:12 perl ./tq.pl [root@vm0 pl]# pstree -p 6377 perl(6377)─┬─rsync(6379) ├─rsync(6381) ├─rsync(6383) ├─rsync(6385) ├─rsync(6387) ├─{perl}(6378) ├─{perl}(6380) ├─{perl}(6382) ├─{perl}(6384) └─{perl}(6386) [root@vm0 pl]# ps -ef |grep rsync root 6379 6377 14 19:05 pts/3 00:00:14 rsync --archive --checksum --compress --ignore-times --progress --recursive --stats --times --password-file=./rsync.pass --timeout=300 /root/test//test13.data lansgg@192.168.137.129::lansggtest root 6381 6377 14 19:05 pts/3 00:00:14 rsync --archive --checksum --compress --ignore-times --progress --recursive --stats --times --password-file=./rsync.pass --timeout=300 /root/test//test12.data lansgg@192.168.137.129::lansggtest root 6383 6377 14 19:05 pts/3 00:00:14 rsync --archive --checksum --compress --ignore-times --progress --recursive --stats --times --password-file=./rsync.pass --timeout=300 /root/test//test1.data lansgg@192.168.137.129::lansggtest root 6385 6377 14 19:05 pts/3 00:00:14 rsync --archive --checksum --compress --ignore-times --progress --recursive --stats --times --password-file=./rsync.pass --timeout=300 /root/test//test8.data lansgg@192.168.137.129::lansggtest root 6387 6377 12 19:05 pts/3 00:00:12 rsync --archive --checksum --compress --ignore-times --progress --recursive --stats --times --password-file=./rsync.pass --timeout=300 /root/test//test3.data lansgg@192.168.137.129::lansggtest root 6399 2193 0 19:06 pts/2 00:00:00 grep rsync
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。