做为一个运维工程师,常常可能会面对几十台、几百台甚至上千台服务器,除了批量操做外,环境同步、数据同步也是必不可少的技能。
说到“同步”,不得不提的利器就是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