一、什么是rsync
rsync是类unix系统下的数据镜像备份工具——remote sync。一款快速增量备份工具 Remote Sync,远程同步 支持本地复制,或者与其他SSH、rsync主机同步。 ——来自百度
二、安装rsync
Rsync官网下载地址:http://rsync.samba.org/
1.服务端
1.1 yum安装或者源码包安装。我为了方便就用了yum安装
#yum install rsync
1.2 配置rsyncd.conf文件
rsyncd.conf是rsyncd的主配置文件,该文件默认不存在,安装完成之后需要我们手动创建(/etc/rsyncd.conf);
我先贴出我的文件,然后在做说明
#cat /etc/rsyncd.conf
uid = root #运行RSYNC守护进程的用户;可以指定nobody为任何用户
gid = root #运行RSYNC守护进程的组;可以指定nobody为任意组
use chroot = no #不使用chroot;#如果"use chroot"指定为true,那么rsync在传输文件以前首先chroot到path参数所指定的目录下
max connections = 4 #最大连接数
pid file = /var/run/rsyncd.pid #pid文件的存放位置
log file = /var/log/rsyncd.log #日志文件的存放位置
[rsynctest] #这个是模块名。可以理解成Java中对外暴露的接口名
path = /yuxj/rsync-test/ #需要同步的目录
read only = no #允许可读可写
list = no #不允许列清单;意思是把rsync 服务器上提供同步数据的目录在服务器上模块是否显示列出来;这个后面会有说明
auth users = root #认证的用户名,这个用户名必须是linux是上真实存在的用户名
secrets file = /etc/inburst.pas #密码文件的存放位置(这个文件也需要我们手动创建)
当然这个是我自己的配置文件。rsyncd.conf还有其他的可只配置(比如端口号、允许主机访问、禁止主机访问),当然这个需要实际开发情况进行取舍。
这里说明一下,当我们同步的时候,只需要在命令上面指定上面模块名(对外暴露的接口,有没有Java的感觉)。rsync会根据这个模块名会找到path目录进行同步。
1.2.1 模块定义
就上面的模块定义可以进行简单说明一下;
模块定义什么呢?主要是定义服务器哪个目录(path)要被同步。每个模块都要以[name]形式。这个名字就是在rsync 客户端看到的名字(对外暴露)。而服务器真正同步的数据是通过path指定的。我们可以根据自己的需要,来指定多个模块。
每个模块要指定认证用户,密码文件、但排除并不是必须的。
1.3 配置密码文件(/etc/inburst.pas)
格式; 用户名:密码
#cat /etc/inburst.pas
root:12qwaszxQq123#@! #用户名:密码
1.4 给予密码文件只读权限(不赋予权限,同步时会失败)
# chown root:root /etc/inburst.pas
# chmod 600 /etc/inburst.pas
1.5 如果有防火墙,需要添加端口(rsync默认为873端口,可以在上面conf文件里面进行更改)
# iptables -A INPUT -p tcp --dport 873 -j ACCEPT
1.6 启动
--daemon参数方式,是让rsync以服务器模式运行
# rsync --daemon
2.客户端
服务端安装完毕了,客户端安装就很简单了。
2.1. 安装rsync,参照上面
2.2 配置rsyncd.conf文件
客户端只需要创建这个文件,不需要写任何配置
2.3 配置密码文件(/etc/rsync_client.pas)
这个文件只需要填写密码即可; 格式;密码
# cat /etc/rsync_client.pas
12qwaszxQq123#@!
2.4 给密码文件赋权限
# chown root:root /etc/rsync_client.pas
# chmod 600 /etc/rsync_client.pas
2.5 启动
到这里配置结束。是不是很简单。
三、 rsync中的参数(只列出了一些常用的)
-r 是递归
-l 是链接文件,意思是拷贝链接文件;
-p 表示保持文件原有权限;
-t 保持文件原有时间;
-g 保持文件原有用户组;
-o 保持文件原有属主;
-D 相当于块设备文件;
-z 传输时压缩;
-P 传输进度;
-v 传输时的进度等信息,和-P有点关系,自己试试。可以看文档;
-e ssh的参数建立起加密的连接。
-u 只进行更新,防止本地新文件被重写,注意两者机器的时钟的同时
--progress 是指显示出详细的进度情况
--delete 是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致
--password-file=/password/path/file 来指定密码文件,这样就可以在脚本中使用而无需交互式地输入验证密码了,这里需要注意的是这份密码文件权限属性要设得只有属主可读。
四、实例
我们首先需要知道rsync有六种不同的工作模式,接下来我们会一一验证(因为网上很多文章都只是列举出这六种模式,但却很少有验证,我这里就做一个搬运工,把它整理):
- 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。
- 使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。
- 使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。
- 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。
- 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。
- 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
0.我们首先来验证一下上面服务端中rsync.conf中的list=no这个配置
在客户端看看rsync服务器上提供了哪些可用的数据源(其中xxx.xxx.xxx.xx是我自己的服务端ip)
# rsync --list-only root@xxx.xxx.xxx.xx::
因为上面配置了list=no,所以上面都不会列出来,我们接下来把list更改为yes,在看看
# rsync --list-only root@182.151.203.58::
rsynctest
这就验证完了上面的list=no/yes 参数配置。
接下来我们验证rsync的六种工作模式:
1.拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。
命令格式:rsync [OPTION] SRC DES
# rsync -r /yuxj/rsync-test/yuxj /yuxj/rsync-test/yuxj_back
上面的就是将/yuxj/rsync-test/yuxj文件夹拷贝到/yuxj/rsync-test/yuxj_back中
这里讲我们的SRC,/yuxj/rsync-test/yuxj后面加上/;变成/yuxj/rsync-test/yuxj/;然后我们在试试
# rsync -r /yuxj/rsync-test/yuxj/ /yuxj/rsync-test/yuxj_back
这里是将/yuxj/rsync-test/yuxj中的子文件夹/文件,而不是yuxj这整个文件夹,进行拷贝到/yuxj/rsync-test/yuxj_back中
2.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。
命令格式:rsync [OPTION] SRC [USER@]HOST:DEST
#rsync -r /root/apache-tomcat-7.0.75 root@xxx.xxx.xx.xx:/yuxj
上面的命令就是将本机的/root/apache-tomcat-7.0.75整个文件夹拷贝到xxx.xxx.xx.xx这个IP机子下面的yuxj文件夹中
这条命令需要输入密码验证
3.使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。
命令格式: rsync [OPTION] [USER@]HOST:SRC DEST 就是将上面一条命令的DST和SRC换一下位置
# rsync -r root@xxx.xxx.xxx.xx:/yuxj/rsync-test /tmp
上面的命令就是将xxx.xxx.xxx.xx这个IP下面的yuxj/rsync-test整个文件夹拷贝到本地的tmp中
这条命令需要输入密码验证
4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。
命令格式:rsync [OPTION] [USER@]HOST::SRC [DEST]
特别说明一下,这里用到两个冒号,::后面跟的就是我们之前在rsync.conf中配置的模块名,还记得吗?
# rsync -r root@xxx.xxx.xxx.xx::rsynctest /tmp
上面的命令就是将xxx.xxx.xxx.xx这个IP下面rsync中定义的模块rsynctest中定义的path拷贝到本地的tmp中
这条命令需要输入密码验证,可以参考上面第三节rsync参数中的--password-file配置密码文件,即不需要密码
5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。
命令格式:rsync [OPTION] [DEST] [USER@]HOST::SRC 就是将上面一条命令的DST和SRC换一下位置
# rsync -r /tmp root@xxx.xxx.xxx.xx::rsynctest
上面的命令就是将本地的tmp整个文件夹拷贝到xxx.xxx.xxx.xx这个IP下面rsync中定义的模块rsynctest中定义的path中
这条命令需要输入密码验证,可以参考上面第三节rsync参数中的--password-file配置密码文件,即不需要密码
6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
五、个人理解的rsync原理
首先说明一下rsync有一套自己的rsync算法来进行文件的同步操作。
电脑没装画图工具,手画的,将就了吧。
现有两个机器,分别是机器A和机器B; 机器A下面存放着aaa文件夹,机器B下面存放在bbb文件夹。现在需要将aaa中的差异文件同步到bbb中。
首先机器B对bbb文件进行拆分,拆成若干个数据块,并对每个数据块进行校验,这个时候就有一系列校验码,
现在发送命令,将这一串校验码发送到机器A,机器A在对比自己的校验码,找出差异,然后发送给机器B,机器B同步完成。
所以rsync是增量更新。
以上个人愚见。
六、重新在来看看什么是rsync
经过上面的一系列折腾,应该对rsync有了一个比较全面的认识吧,要我说什么是rsync;
其实就是来解决分布式情况下集群文件一致性的问题。
希望大家喜欢!