經常使用rsync命令操做梳理

 

做爲一個運維工程師,常常可能會面對幾十臺、幾百臺甚至上千臺服務器,除了批量操做外,環境同步、數據同步也是必不可少的技能。
說到「同步」,不得不提的利器就是rsync。rsync不但能夠在本機進行文件同步,也能夠做爲遠程同步工具。
前面提到了rsync+inotify實時同步方案部署,下面結合本人近幾年運維工做中對這一工具使用的經驗,簡單在此梳理下:php

rsync同步命令中經常使用的幾個參數說明:html

-a, --archive 歸檔模式,表示以遞歸方式傳輸文件,並保持全部文件屬性,等於-rlptgoD 
-v, --verbose 詳細模式輸出 
-p, --perms 保持文件權限 
-g, --group 保持文件屬組信息
-o, --owner 保持文件屬主信息 
-r, --recursive 對子目錄以遞歸模式處理。同步目錄的時候要加上這個參數
-l, --links 保留軟鏈結,加上這個參數,同步過來的文件會保持以前的軟連接屬性不變
-H, --hard-links 保留硬鏈結 
-e, --rsh=COMMAND 指定使用rsh、ssh方式進行數據同步 
-z, --compress 對備份的文件在傳輸時進行壓縮處理 
--stats 給出某些文件的傳輸狀態 
--progress 打印同步的過程 
--timeout=TIME 同步過程當中,IP超時時間,單位爲秒 
--delete 刪除那些目標目錄中有而源目錄中沒有的多餘文件。這個是rsync作增量方式的全備份的最佳選擇方案!!!!!!
--delete-before 接受者在輸出以前進行刪除操做。即先將目標目錄中文件所有刪除,再將源目錄文件拷貝過去。這是rsync保持目標目錄跟源目錄一致的方案!!!
--delete-after 在同步操做以後作比較,刪除那些目標目錄中有而源目錄中沒有的多餘文件 
--delete-excluded 刪除目標目錄中那些被該選項指定排除的文件
--ignore-errors 即便出現IO錯誤也進行刪除,忽略錯誤
--exclude 指定同步時須要過濾掉的文件或子目錄(即不須要同步過去的),後面直接跟不須要同步的單個文件名或子目錄(不須要跟路徑) ,過濾多個文件或子目錄,就使用多個--exclude 
--exclude-from 指定同步時須要過濾掉的文件或子目錄,後面跟文件(好比/root/exclue.txt),而後將不須要同步的文件和子目錄放到/root/exclue.txt下。
--version 打印版本信息 
--port=PORT 指定其餘的rsync服務端口 
--log-format=formAT 指定日誌文件格式 
--password-file=FILE 從FILE中獲得密碼 
--bwlimit=KBPS 限制I/O帶寬,KBytes per second

一般用到的rsync同步命令,以下:
25791是ssh端口
[root@bastion-IDC ~]# rsycn -e "ssh -p 25791" -avpgolr  php5.5.1 192.168.1.22:/Data/app/linux

==========================rsync常規錯誤=======================git

rsync: failed to set times on "." (in test_upload): Permission denied (13)
rsync: opendir "." (in test_upload) failed: Permission denied (13)

緣由是因爲selinux沒有關閉致使的,關閉它便可!
[root@test ~]# getenforce 
Enforcing
[root@test ~]# setenforce 0
[root@test ~]# getenforce 
Permissive
[root@test ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

rsync如何實現同步目標路徑下的目錄,不一樣步路徑下的文件 ,只想同步目錄結構
[root@bastion-IDC ~]# rsync -av --delete -f '+ */' -f '- *' SRC/ DEST/web

rsync在遠程同步的時候,要求目標目錄要和源目錄保持同步,目標目錄中多餘的文件都要刪除
這就須要用到了參數--delete,以下:
[root@bastion-IDC ~]# /usr/bin/rsync -vlzrtogp --progress --delete root@192.168.1.120::test --password-file=/root/192.168.1.115 /root/2013/
可是這個--delete加上去就是一個危險的命令,由於它是在同步以前先將目標目錄中的文件刪除,而後再將源目錄中的文件同步過去。
若是目標目錄比較大,在刪除過程當中出現宕機事故就很差了。因此最好仍是用--delete-before或--delete-after比較溫柔點,靠譜點。sql

----------------------------------------------------------------------------------------------------------
rsync遠程拷貝的時候,過濾某些某個文件或多個文件就用「--exclude 文件名」
要是過濾多個文件或子目錄,就把過濾的文件或目錄名的關鍵字放在一個文件裏,以下的exclude_file文件
而後使用--exclude-from exclude—-file文件進行過濾apache

[root@bastion-IDC ~]# cat /root/lxp/exclude_file         //即rsync同步的時候,過濾掉含有下面字樣名的文件vim

.svn
.git
.DS_Store
*.sql
*.bak
.project
main.php
environment.php
main/upload         //這個過濾的是rsync同步目錄下的main/upload目錄
main/temp/runtime
fangff              //過濾的目錄
hqtime              //過濾的目錄
apiConfig.php
consoleConfig.php
tpl_c
consoleConfig.php

[root@bastion-IDC ~]# cat rsync_code.sh         //提早作本機與192.168.1.57的ssh無密碼登錄的信任關係api

#!/bin/sh
EXCLUDE_FILE="/root/lxp/exclude_file"
/usr/bin/rsync -avpgolr -e "ssh -p 25791" --exclude-from ${EXCLUDE_FILE} /var/www/vhosts/www.wangshibo.com/httpdocs/ root@192.168.1.57:/var/www/vhosts/www.wangshibo.com/httpdocs/
/usr/bin/rsync -avpgolr -e "ssh -p 25791" --exclude-from ${EXCLUDE_FILE} /var/www/vhosts/fanghu.xqshijie.com/httpdocs/ root@192.168.1.57:/var/www/vhosts/fanghu.xqshijie.com/httpdocs/
/usr/bin/rsync -avpgolr -e "ssh -p 25791" --exclude-from ${EXCLUDE_FILE} /Data/fanghu_temp/ root@192.168.1.57:/Data/fanghu_temp/

例如:同步本機目錄到遠程服務器上,過濾到同步目錄中的個別文件
下面腳本說明:同步過程當中,同步目錄中凡是main-local.php和params-local.php文件都不覆蓋!tomcat

[root@huanqiu ~]# cat /Data/webroot_svncode/exclude
main-local.php
params-local.php

[root@huanqiu ~]# vim rsync.sh
#!/bin/bash
EXCLUDE_FILE="/Data/webroot_svncode/exclude"
SOURCE_DIR=/srv/apache-tomcat-7.0.67/webapps/jenkins/jobs/apihuanqiu}/workspace/
DEST_DIR=/var/www/vhosts/apihuanqiu/
REMOTE_IP=192.168.19.19

/usr/bin/rsync -e "ssh -p22" -avpgolr --exclude-from ${EXCLUDE_FILE} $SOURCE_DIR $REMOTE_IP:$DEST_DIR
/usr/bin/ssh -p22 $REMOTE_IP "chmod a+w -R /var/www/vhosts/apihuanqiu/frontend/web/assets/"
/usr/bin/ssh -p22 $REMOTE_IP "chmod a+w -R /var/www/vhosts/apihuanqiu/frontend/runtime/"

1)排除單獨的文件夾和文件

好比要排除sources文件夾,咱們能夠添加 '--exclude' 選項:
--exclude 'sources'
命令是這樣的:
[root@bastion-IDC ~]# rsync -e 'ssh -p 30000' -avl --delete --stats --progress --exclude 'sources' demo@192.168.1.120:/home/demo /backup/

好比要排除 "public_html" 文件夾下的 "database.txt" 文件:
--exclude 'public_html/database.txt'
命令是這樣的:
[root@bastion-IDC ~]# rsync -e 'ssh -p 30000' -avl --delete --stats --progress --exclude 'sources' --exclude 'public_html/database.txt' demo@192.168.1.120:/home/demo /backup/

好比排除掉同步目錄中的相似*-prod.properties文件(好比global-prod.properties等)
命令是這樣的:
[root@bastion-IDC ~]# /usr/bin/rsync -av -e "/usr/bin/ssh -p25791" --rsync-path="/usr/bin/rsync" --exclude=*-prod.properties --progress /opt/tomcat/webapps/awaken_beta/ 192.168.1.20:/Data/app/apache-tomcat-8/awakenweb/ROOT/

2)使用 '--exclude-from' 排除多個文件夾和文件

創建文件:
[root@bastion-IDC ~]# touch /home/backup/exclude.txt

在裏面定義要排除的文件夾和文件
[root@bastion-IDC ~]# vim /home/backup/exclude.txt
sources
public_html/database.*
downloads/test/*

使用指令:
--exclude-from '/home/backup/exclude.txt'

最後的命令以下:
[root@bastion-IDC ~]# rsync -e 'ssh -p 30000' -avl --delete --stats --progress --exclude-from '/home/backup/exclude.txt' demo@192.168.1.120:/home/demo /backup/

-------------------------------------------------用rsync命令和scp命令實現本機帶進度條提示拷貝-----------------------------------

rsync和scp拷貝時顯示進度條提示
1)rsync命令
[root@dbtest bak]# rsync -e "ssh -p22222" -avpgolr --progress db170630.tar.gz 192.168.1.198:/data/upload/
root@192.168.1.198's password:
sending incremental file list
db170630.tar.gz
702087168 4% 5.60MB/s 0:41:47

--progress 能夠實現本機帶進度條提示拷貝,能夠實現不一樣機器帶進度條提示拷貝,能夠拷貝多個文件

2)scp命令
[root@dbtest bak]# scp -v /mnt/full20100526.tar.gz /usr/local/src/
[以上命令] 本機拷貝沒法顯示進度

[root@dbtest bak]# scp -v /mnt/full20100526.tar.gz root@192.168.1.1:/usr/local/src/
[以上命令] 不一樣機器拷貝能夠顯示進度條,即便不帶"-v"參數也能夠顯示進度條

[root@dbtest bak]# scp -v /mnt/full20100526.tar.gz root@127.0.0.1:/usr/local/src/
[以上命令] 變相實現本機帶進度條提示拷貝,能夠不帶"-v"參數

3) cp命令
暫時沒有找到帶進度條提示拷貝

----------------------------------------------------- rsync同步時候的限流操做----------------------------------------------------
# rsync -auvz --progress --delete --bwlimit=1000 遠程文件 本地文件 //限制爲1000kBytes/s
# rsync -auvz --progress --delete --bwlimit=2048 遠程文件 本地文件 //限制爲2M/s

--------scp同步時的限流(-l參數)--------# scp -l 1024 file root@192.168.1.100 //限制爲1M Bytes/s

相關文章
相關標籤/搜索