rsync
rsync
rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。
rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。
rsync是一个功能非常强大的工具,其命令也有很多功能特色选项,我们下面就对它的选项一一进行分析说明。
1、安装部分:采用源码安装方式:下载地址 http://rsync.samba.org/ 里面会有tar包,自己下。
2、在linux中解压, ./configure --prefix=/usr/local/rsync/ make $$ make install
这里如果用yum安装的话,配置文件在/etc/rsyncd.conf,如果是源码安装,就是自己指定的那个目录了。
我们看下rsync的配置文件:
[root@game-kg-mygj2 rsync]# ll
total 16
drwxr-xr-x 2 root root 4096 May 27 14:37 logs ##日志目录
-rw-r--r-- 1 root root 1595 Oct 8 2016 rsyncd.conf ##服务端的配置文件
-rw------- 1 root root 8 Oct 8 2016 rsyncd.pass ##服务端的认证字段
-rw------- 1 root root 14 Oct 8 2016 rsyncd.pwd ##传送过程中可以指定不同用户,不同用户的密码都是存储在这里的
total 16
drwxr-xr-x 2 root root 4096 May 27 14:37 logs ##日志目录
-rw-r--r-- 1 root root 1595 Oct 8 2016 rsyncd.conf ##服务端的配置文件
-rw------- 1 root root 8 Oct 8 2016 rsyncd.pass ##服务端的认证字段
-rw------- 1 root root 14 Oct 8 2016 rsyncd.pwd ##传送过程中可以指定不同用户,不同用户的密码都是存储在这里的
conf:
#address = ***.***.***.*** ##指定服务端ip地址,就是本机地址,这里可以注释
port = 873 ##指定端口,默认就是873,处于安全考虑可以设置高位端口
uid = root ##rsync运行用户,默认是nobody
gid = root ##rsync运行组
max connections = 200 ##最大连接数,0表示没限制
timeout = 600 ##等待一个崩溃服务器的超时时间,0表示一直等待!
use chroot = no ##rsync daemon在传输前是否切换到指定目录下
list = no ##客户端请求显示模块列表时,模块是否显示出来,设置false表示影藏,默认是true,推荐false
read only = no ##指定模块是否可读写,即能否上传文件,这里要是no或者false。
pid file=/app/sdo/rsync/logs/rsyncd.pid ##pid文件位置
#hosts allow=10.0.0.0/8 192.168.0.0/16 ##指定哪些网段主机能够与自己的rsync服务通信
#syslog facility = local7 ##这个似乎是转储日志文件的参数
lock file = /app/sdo/rsync/logs/rsync.lock ##进程锁文件,后面会说到!
log file = /app/sdo/rsync/logs/rsyncd.log ##日志文件
transfer logging = yes ##是否记录传输日志
auth users = agent ##认证用户
uid = root ##rsync运行用户,默认是nobody
gid = root ##rsync运行组
max connections = 200 ##最大连接数,0表示没限制
timeout = 600 ##等待一个崩溃服务器的超时时间,0表示一直等待!
use chroot = no ##rsync daemon在传输前是否切换到指定目录下
list = no ##客户端请求显示模块列表时,模块是否显示出来,设置false表示影藏,默认是true,推荐false
read only = no ##指定模块是否可读写,即能否上传文件,这里要是no或者false。
pid file=/app/sdo/rsync/logs/rsyncd.pid ##pid文件位置
#hosts allow=10.0.0.0/8 192.168.0.0/16 ##指定哪些网段主机能够与自己的rsync服务通信
#syslog facility = local7 ##这个似乎是转储日志文件的参数
lock file = /app/sdo/rsync/logs/rsync.lock ##进程锁文件,后面会说到!
log file = /app/sdo/rsync/logs/rsyncd.log ##日志文件
transfer logging = yes ##是否记录传输日志
auth users = agent ##认证用户
[sdoserver] ##模块详情
path=/app/sdo/server ##路径
secrets file = /app/sdo/rsync/rsyncd.pwd ##指定密码文件
comment = sdo server #相当于备注的意思,没有也没事!
rsync的conf文件是没有模板的,初次使用需要我们手动编辑的!
[root@game-kg-mygj2 rsync]# cat rsyncd.pass
1234567 #认证密码
[root@game-kg-mygj2 rsync]# cat rsyncd.pwd
test:1234567 #test用户的认证密码
1234567 #认证密码
[root@game-kg-mygj2 rsync]# cat rsyncd.pwd
test:1234567 #test用户的认证密码
配置文件处理好,开启服务:
rsync --daemon --config=/app/sdo/rsync/rsyncd.conf
查看端口是否已经在监听了!
客户端:网上说客户端不需要开启rsync服务,但是我觉得还是要有的,按照上面的步骤再处理一遍,因为有时会涉及到从客户端机器作为源目录去同步给服务端。
测试
这里以线上的语句为例:
需求:把本地的/app/sdo/server/bin目录下的资源,同步到远程的sdoserver模块下:
rsync -avz --delete --progress -c --password-file=/app/sdo/rsync/rsyncd.pass --exclude-from=.exclude_bin.list /app/sdo/server/bin agent@192.168.76.147::sdoserver/bin
首先分析参数:
-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
-P:显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显示进度信息的)。
-n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。
-a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
-r --recursive:递归到目录中去。
-t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新
:检查出mtime不同从而导致增量传输无效。
-o --owner:保持owner属性(属主)。
-g --group:保持group属性(属组)。
-p --perms:保持perms属性(权限,不包括特殊权限)。
-D :是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。
-l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
-z :传输时进行压缩提高效率。
-R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。用法见下文示例。
--size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
-u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。
-d --dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1目录,使用该选项将拷贝dir1但不拷贝file1。
--max-size :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"--max-size=1.5m")
--min-size :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
--exclude :指定排除规则来排除不需要传输的文件。
--bwlimit:传送带宽限速。
--delete :以SRC为主,对DEST进行同步。多则删之,少则补之。注意"--delete"是在接收端执行的,所以它是在
:exclude/include规则生效之后才执行的。
-b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀。
--backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
-e :指定所要使用的远程shell程序,默认为ssh。
--port :连接daemon时使用的端口号,默认为873端口。
--password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码。
-W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效。
--existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。
--ignore-existing:要求只更新目标端不存在的文件。和"--existing"结合使用有特殊功能,见下文示例。
--remove-source-files:要求删除源端已经成功传输的文件。
那指令中的‘-avz’就好理解了!
--delete:
使用"--delete"选项后,源端存在,但是客户端存在的文件,他就会先把客户端的文件删掉,再去同步其他文件的内容;
可以这么理解,使得源站和客户端的资源完全同步的参数;
好比你源站通过开发合并了几个配置文件,那多余的配置文件就能删掉了,删掉以后同步到线上,如果使用了--delete参数,那也会把线上的那几个多余的文件删掉,如果没有--delete参数,那线上环境的那几个没用的配置文件还会保留在机器上!
--exclude-from:
使用"--exclude"选项指定排除规则,排除那些不需要传输的文件。
使用"--exclude"选项指定排除规则,排除那些不需要传输的文件。
这个很好理解,开发环境中一般都是从版本库里拉的资源,比如svn或者git,这样的话,就会包含一些.svn和.git目录和文件,这些文件,在同步的时候,是需要我们过滤掉的!
这里我们就是使用--exclude-from='.exclude_bin.list'来过滤掉指定文件,过滤哪些文件呢???这得看.exclude_bin.list文件的内容了:
[root@game-kg-mygj2 .base_op]# cat .exclude_bin.list
core.*
*.svn
core.*
*.svn
可以看到,我们是可以使用正则匹配指定文件的!
这里就是排除了coredump文件和svn库文件!
语句最后部分:
/app/sdo/server/bin agent@192.168.76.147::sdoserver/
源端 目标地址的对应模块
这里其实也有很多说法:
1、拷贝本地文件到本地的某个路径。当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。如:rsync -a /data /backup
2、使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。如:rsync -avz *.c foo:src
3、使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。如:rsync -avz foo:src/bar /data从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动4、模式。如:rsync -av root@192.168.76.147::www /databack从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。如:rsync -av /databack root@192.168.76.147::www
5、列出远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。如:rsync -v rsync://192.168.76.147/www
此外还有个地方需要注意,那就是源端的路径格式:
我们这里的例子:‘/app/sdo/server/bin’,他表示把‘/app/sdo/server/bin’下面的!下面的!下面的资源传到远程机器上;
那如果我们这么写:‘/app/sdo/server/bin/’,这样就变成了把本地‘/app/sdo/server/bin/’目录同步到远程机器上;
第一种方式,远程的agent@192.168.76.147::sdoserver/bin 目录下出现的是本地‘/app/sdo/server/bin’下的文件,这样就完成了同步,但第二种方式的话,远程的‘agent@192.168.76.147::sdoserver/bin’目录下,会多出现一个bin目录!该bin目录下的资源,才是我们原本想要同步的东西!
也就是说源端这里的路径写法是需要注意的‘/app/sdo/server/bin’和‘/app/sdo/server/bin/’会出现不同的效果!
ok,指令参数这里就说这么多,下面看看上面提到的lock文件:
在生产环境中,我们常常用到crontab去执行rsync相关的脚本,那么问题来了:如果在crontab的执行周期内,由于需要同步的文件很多很大或者由于网络等原因导致上一次同步还没有完成,此时又会重新fork出一个rsync进程,长此以往下午,rsync进程会越来越多,执行效果会越来越慢,最终会导致一些无法预知的事情!
为了防止此类问题出现,lock就出现了:
flock -xn /var/run/rsync.lock -c 'rsync -avzP --bwlimit 3000 /home/lra abc@192.168.76.147::abc --password-file=/etc/rsync.pas'
上面这条指令,就是指定了锁文件的的操作,在每次执行后面的rsync指令之前,都会检查./var/run/rsync.lock文是否存在,如果存在则说明之前的同步还没有完成,那么此次同步就不会执行!直到上次rsync同步完成后,后面周期里的rsync才会继续执行!
想到了Python里的进程锁。。。。没这个简单。
以上就是笔者这里接触到的rsync功能,共勉!