rsync命令 远程数据同步工具

来源:互联网 发布:达克赛德vs灭霸 知乎 编辑:程序博客网 时间:2024/05/21 08:56

http://www.cnblogs.com/kevingrace/p/5689491.html     

    常用工具命令 rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。 rsync是一个功能非常强大的工具,其命令也有很多功能特色选项,我们下面就对它的选项一一进行分析说明。

rsync同步命令中常用的几个参数说明:

-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/

rsync如何实现同步目标路径下的目录,不同步路径下的文件 ,只想同步目录结构
[root@bastion-IDC ~]# rsync -av --delete -f '+ */' -f '- *' SRC/ DEST/

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比较温柔点,靠谱点。

-----------------------------------------------------------------------
rsync远程拷贝的时候,过滤某些某个文件或多个文件就用“--exclude 文件名”
要是过滤多个文件或子目录,就把过滤的文件或目录名的关键字放在一个文件里,如下的exclude_file文件
然后使用--exclude-from exclude—-file文件进行过滤

[root@bastion-IDC ~]# cat /root/lxp/exclude_file         //即rsync同步的时候,过滤掉含有下面字样名的文件

.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无密码登陆的信任关系

#!/bin/shEXCLUDE_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文件都不覆盖!

[root@huanqiu ~]# cat /Data/webroot_svncode/excludemain-local.phpparams-local.php [root@huanqiu ~]# vim rsync.sh#!/bin/bashEXCLUDE_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.txtsourcespublic_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
***************当你发现自己的才华撑不起野心时,就请安静下来学习吧***************

常用场景

无密码同步

rsync 备份文件地址  恢复文件地址

服务端:vim /etc/rsyncd.conf

复制代码
#This is the rsync daemon configuration #global settings pid file = /var/run/rsyncd.pidport = 873lock file = /var/run/rsyncd.locklog file = /var/log/rsync.loggid = rootuid = root#module settings [share_data]path = /web/rsync/share_datause chroot = nomax connections = 15read only = yeswrite only = nolist = noignore errors = yestimeout = 120
复制代码
/usr/bin/rsync --daemonmkdir -p /web/rsync/share_data

 

客户端

rsync -avz --progress root@192.168.1.98::share_data /home/hadoop/share_data

 限制流量同步

rsync -avz --bwlimit=50 --progress root@192.168.1.98::share_data /home/hadoop/share_data

 

有密码同步

创建密码文件,采用这种方式不能使用系统用户对客户端进行认证,所以需要创建一个密码文件,其格式为“username:password”,用户名可以和密码可以随便定义,最好不要和系统帐户一致,同时要把创建的密码文件权限设置为600,这在前面的模块参数做了详细介绍。

来自: http://man.linuxde.net/rsync
创建密码文件,采用这种方式不能使用系统用户对客户端进行认证,所以需要创建一个密码文件,其格式为“username:password”,用户名可以和密码可以随便定义,最好不要和系统帐户一致,同时要把创建的密码文件权限设置为600,这在前面的模块参数做了详细介绍。

来自: http://man.linuxde.net/rsync
创建密码文件,采用这种方式不能使用系统用户对客户端进行认证,所以需要创建一个密码文件,其格式为“username:password”,用户名可以和密码可以随便定义,最好不要和系统帐户一致,同时要把创建的密码文件权限设置为600,这在前面的模块参数做了详细介绍。

来自: http://man.linuxde.net/rsync
创建密码文件,采用这种方式不能使用系统用户对客户端进行认证,所以需要创建一个密码文件,其格式为“username:password”,用户名可以和密码可以随便定义,最好不要和系统帐户一致,同时要把创建的密码文件权限设置为600。

服务端  

vim /etc/rsyncd.conf

复制代码
#This is the rsync daemon configuration #global settings pid file = /var/run/rsyncd.pidport = 873lock file = /var/run/rsyncd.locklog file = /var/log/rsync.loggid = rootuid = root#module settings [auth_data]path = /web/rsync/auth_datause chroot = nomax connections = 15read only = yeswrite only = nolist = noignore errors = yestimeout = 120auth users = hadoopsecrets file = /etc/rsyncd.passwd
复制代码
echo "hadoop:password123" > /etc/rsyncd.passwd chmod 600 /etc/rsyncd.passwdmkdir -p /web/rsync/auth_data

 

 

客户端

echo "password123" > /home/hadoop/rsyncd.passwd chmod 600 /home/hadoop/rsyncd.passwd rsync -avz --progress  --password-file=/home/hadoop/rsyncd.passwd  hadoop@192.168.1.98::auth_data /home/hadoop/auth_data

 

或者是

export RSYNC_PASSWORD="password123"rsync -avz --progress hadoop@192.168.1.98::auth_data /home/hadoop/auth_data

 

写入同步

恢复,当服务器的数据出现问题时,那么这时就需要通过客户端的数据对服务端进行恢复,但前提是服务端允许客户端有写入权限,否则也不能在客户端直接对服务端进行恢复,使用rsync对数据进行恢复的方法如下:

     rsync -avz --progress --delete /home/hadoop/write_file hadoop@192.168.1.98::write_data

服务端

vim /etc/rsyncd.conf

复制代码
#global settings pid file = /var/run/rsyncd.pidport = 873lock file = /var/run/rsyncd.locklog file = /var/log/rsync.loggid = rootuid = root#module settings [write_data]path = /web/rsync/write_datause chroot = nomax connections = 15read only = nolist = noignore errors = yestimeout = 120auth users = hadoopsecrets file = /etc/rsyncd.passwd
复制代码
mkdir -p /web/rsync/write_data

 

客户端

echo "123" > /home/hadoop/write_fileexport RSYNC_PASSWORD="password123"rsync -avz --progress --delete /home/hadoop/write_file hadoop@192.168.1.98::write_data 

 

限定IP或者网段

复制代码
#global settings pid file = /var/run/rsyncd.pidport = 873lock file = /var/run/rsyncd.locklog file = /var/log/rsync.loggid = rootuid = root#module settings [write_data]path = /web/rsync/write_datause chroot = nomax connections = 15read only = nolist = noignore errors = yestimeout = 120auth users = hadoopsecrets file = /etc/rsyncd.passwdhosts allow = 192.168.2.32  192.168.1.0/24