gitlab多线程备份脚本
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,将公司的gitlab服务器进行备份,并且将备份rsync到异地机房,因为备份文件太大,所以这里做了切割成多个文件,进行多线程传输。#!/usr/bin/env perl ############
千家信息网最后更新 2025年02月01日gitlab多线程备份脚本
将公司的gitlab服务器进行备份,并且将备份rsync到异地机房,因为备份文件太大,所以这里做了切割成多个文件,进行多线程传输。
#!/usr/bin/env perl ################ #filename: gitback.pl #version : 1.0 #author : zzq #date : 20160705 #function: The transmission of gitlab backup files to the remote host ######################### use strict; use threads; use Thread::Queue; use File::Rsync; use threads::shared; use File::Find; use File::Basename; use POSIX qw(strftime); use Log::Log4perl qw(:easy); use Mail::Sender; my ($logger,$Msg,$Subject,$filename,$srcFile,$fileName,$filePath,$fileSize,$backFilename); my $fileCount; my $filemsg; my $message; ######### remote host rsync config ################## my $remotehost = 'rsync@10.xx.xx.xx::gitbackup'; ############# back file dir############## my $backFiledir = '/data/gitbackups/'; ######## max threads count############## my $thread_max = 10; ########## current time ############# my $currentTime = strftime("%Y%m%d%H%M", localtime(time)); $Msg = "$currentTime\n"; ########## log file ############## my $logFile = "gitback.log"; my $splitFileQueue = Thread::Queue->new(); my $remotefileQueue = Thread::Queue->new(); ############## define smtp ###################### #Sender my $send_user='monitor@.cc.cn'; #passwd for Sender #my $send_user_pw='123'; #smtp address my $smtp_server='10.168.xx.xx'; #define mail subject $Subject = "gitback-$currentTime"; #address my @address=qw(xxx.cn); ################################################# ################### define log conf ######################### my $log_logger = get_logger(); $log_logger->level($INFO); my $file_appender = Log::Log4perl::Appender->new( "Log::Dispatch::File", filename => "$logFile", mode => "append", ); $log_logger->add_appender($file_appender); my $layout = Log::Log4perl::Layout::PatternLayout->new( "%d %p > %F{1} %M -- %m%n" ); $file_appender->layout($layout); ################################################### main(); sub main { Usage() unless ( scalar(@ARGV) == 0); $log_logger->info("Begin:$currentTime"); $srcFile = backup(); print "srcFile is $srcFile\n"; ($fileName,$filePath) = fileparse($srcFile) if (-f $srcFile); $fileSize=(stat $srcFile)[7]; srcFileMd5($srcFile); splitFile($srcFile); find(\&findSplitFile,$filePath); $fileCount = $splitFileQueue->pending(); $Msg = "$Msg"."FileCount: $fileCount\n"."$filemsg"; splitFileMd5Thread(); rsyncThread(); for my $addr (@address){ sendMail($addr); } $currentTime=strftime("%Y%m%d%H%M", localtime(time)); $log_logger->info("End:$currentTime"); } ###################Access to the backup name for gitlab ################ sub backup { my $result=`gitlab-rake gitlab:backup:create`; my $flag=`echo $?`; if ($flag == 0){ $log_logger->info("gitlab-backup-create : success "); my @result=split(/\n/,$result); for my $cc (@result){ if ($cc =~ /(?\d+_gitlab_backup.tar)/){ $backFilename=$+{'filename'}; $log_logger->info("gitlab-backup-filename : $backFilename"); } } }else{ $log_logger->info("gitlab-backup-create : fail "); } return "$backFiledir$backFilename"; } ############# Search the file after segmentation ################ sub findSplitFile { if ( $_ =~ /$fileName\.\d{3}$/) { $log_logger->info("splitFileQueue enqueue : $_"); $filemsg = "$filemsg"."$_\n"; $splitFileQueue->enqueue($_); $log_logger->info("remotefileQueue enqueue : $_"); $remotefileQueue->enqueue($_); # $log_logger->info("print to logfile : $_"); } } ############## Search the MD5 file after segmentation ############ sub splitFileMd5Thread { while($splitFileQueue->pending()) { my $Queue = $splitFileQueue->dequeue(); $log_logger->info("splitfileQueueMD5 dequeue : $Queue "); threads->create(\&splitFileMd5,$Queue); } foreach my $thread (threads->list(threads::all)){ if ($thread->is_joinable()){ $thread->join(); } } foreach my $thread ( threads->list(threads::all) ) { $thread->join(); } } ################## Search for the source file md5 ################# sub srcFileMd5 { my $file=shift; my $md5_command=`md5sum $file`; my $flag=`echo $?`; if ($flag == 0) { my ($file_md5,$filename) = split(/\s+/,$md5_command); my $log = "srcfile:$file filesize:$fileSize file_md5sum:$file_md5"; $Msg = "$Msg"."srcfile:$file filesize:$fileSize file_md5sum:$file_md5\n"; $log_logger->info($log); }else { my $file_md5 = "system command maybe exec fail, command result code is $md5_command"; my $log = "srcfile:$file filesize:$fileSize file_md5sum:$file_md5"; $Msg = "$Msg"."srcfile:$file filesize:$fileSize file_md5sum:$file_md5\n"; $log_logger->warn($log); } } ####### split File MD5 ############### sub splitFileMd5 { my $file=shift; my $md5_command=`md5sum $filePath$file`; my $flag=`echo $?`; if ($flag == 0) { my ($file_md5,$filename) = split(/\s+/,$md5_command); my $log = "file:$file file_md5sum:$file_md5"; $log_logger->info($log); } } ################# Will be cut by the source file ################ sub splitFile { my $srcFile = shift; my $split_command =`split -b 50M $srcFile -d -a 3 $srcFile.`; $split_command = `echo $? `; if ($split_command == 0 ){ my $splitFileCode = 'success'; $log_logger->info(" srcFile:$srcFile desc:$splitFileCode splitFileResult:$split_command"); }else{ my $splitFileCode = 'fail'; $log_logger->warn(" srcFile:$srcFile desc:$splitFileCode splitFileResult:$split_command"); } } sub rsyncThread { while ( $remotefileQueue->pending() ){ if (scalar threads->list() < $thread_max) { my $readQueue = $remotefileQueue->dequeue(); $log_logger->info("remotefileQueue dequeue : $readQueue "); threads->create(\&rsync,$readQueue); } foreach my $thread (threads->list(threads::all)){ if ($thread->is_joinable()){ $thread->join(); } } } foreach my $thread ( threads->list(threads::all) ) { $thread->join(); } } sub rsync { my $file = shift; my $obj = File::Rsync->new( { archive => 1, compress => 1, checksum => 1, recursive => 1, owner => 1, devices => 1, group => 1, perms => 1, times => 1, verbose => 1, progress => 1, stats => 1, links => 1, 'hard-links' => 1, 'ignore-times' => 1, 'password-file' => './rsync.pass', } ); $obj->exec( { src => "$filePath$file", dest => $remotehost } ); #or warn ($log_logger->warn("rsync: $file to $remotehost fail!" )); my $rval = $obj->realstatus; if ($rval == 0 ) { $log_logger->info("rsync: $file to $remotehost Success!\n"); }else{ my $rsyncError = sprintf ("%s", $obj->err); $message = "$message"."Transfer Failed:\nfile:$file reason:$rsyncError"; $log_logger->info("rsync: $file to $remotehost fail reason:$rsyncError"); } } sub sendMail { my $CONTACTEMAIL = shift; my $sender = new Mail::Sender{ ctype => 'text/plain; charset=utf-8', encoding => 'utf-8', } ; die "Error in mailing : $Mail::Sender::Error\n" unless ref $sender; if ($sender->MailMsg({ smtp => $smtp_server, from => $send_user, to => $CONTACTEMAIL, subject => $Subject, msg => $Msg, # file => "$file", # auth => 'LOGIN', # authid => $send_user, # authpwd => $send_user_pw, charset=>'utf-8' }) < 0) { die $log_logger->error("senermail fail -- $Mail::Sender::Error\n"); } $sender->Close(); } sub Usage { print <<"END"; perl gitback.pl END exit 2; }
备份
文件
线程
公司
多个
异地
服务器
机房
传输
服务
脚本
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器有屏幕吗
教育局网络安全工作汇报材料
河东金蝶软件开发哪家好
msf管理服务器
长宁区参考数据库研发厂家报价
imf联合国数据库
广东服务器维修调试多少钱
数据库中只有一个模式知乎
智能理财软件开发
程序软件开发公司美术组职位
云南大学特色数据库
上海浪潮服务器续保价格
数据库食品配料表如何制作
如何在服务器打开两个ip地址
南京先进网络技术收购价格
想学手机软件开发相关专业
网络安全手抄报内容文字清楚
原型法软件开发
天门戴尔服务器厂家实力雄厚
盐城防爆刀片服务器直销
学什么网络技术能接单
广东工业大学网络安全学院官网
java数据库用什么技术
数据库系统划分为三个阶段
sci数据库
云朵网络安全黑板报
数据库 alias
电影网站视频服务器怎么部署的
青浦网络安全攻防
机关网络安全实施工作意见