rsync 是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程数据镜像同步备份的优秀工具。
1.1.1 语法格式
三种模式:
1)本地模式
rsync [选项] [源文件] [目标文件]
2)通过远程shell访问模式:
拉取(pull) :
rsync [选项] 用户@主机:源文件 [目标文件]
推送(push) :
rsync [选项] [源文件] 用户@主机:源文件
3)rsync 守护进程模式
拉取 :
rsync [选项] 用户@主机::源文件 [目标文件]
rsync [选项] rsync://用户@主机:端口/源文件 [目标文件]
推送 :
rsync [选项] [源文件] 用户@主机:源文件
rsync [选项] [源文件] rsync://用户@主机:端口/源文件 [目标文件]
1.1.2 选项说明
-v |
详细模式输出 |
-z |
传输时进行压缩以提高传输效率 |
-a |
以递归方式传输文件,并保持所有文件的属性 |
-r |
对子目录以递归模式,即目录下的所有目录都以同样的模式传输,注意是小写的r |
-P |
显示同步的过程及传输时的进度等信息 |
-e |
使用信道协议,指定替代rsh的shell程序,例如ssh |
-n |
测试选项,模拟执行 |
--exclued |
指定排除不需要传输的文件模式(和tar参数一样) |
--delete |
是目标目录内容和源文件保持一致,删除不同的文件 |
--bwlimit=KBPS |
限制传输速度 |
1.1.3 范例
- 源地址带与不带(/)的区别
带(/)
[root@centos6 tmp]# rsync -av ex./ /server/file/
[root@centos6 file]# ll
total 20
drwxr-xr-x 8 root root 4096 Jun 2 22:12 1ex
drwxr-xr-x 8 root root 4096 Jun 2 22:30 2ex
drwxr-xr-x 8 root root 4096 Jun 2 21:56 3ex
不带(/)
[root@centos6 tmp]# rsync -av ex. /server/file/
[root@centos6 file]# ll
total 4
drwxr-xr-x 7 root root 4096 Jun 2 21:52 ex.
注释 源文件后面带(/)表示复制源目录下面的文件 不带(/) 表示 复制此目录
- 拉取推送文件及目录
[root@centos6 tmp]# rsync -av root@10.0.0.41:/tmp/hosts /tmp
root@10.0.0.41's password:
receiving incremental file list
hosts
sent 30 bytes received 430 bytes 102.22 bytes/sec
total size is 352 speedup is 0.77
[root@centos6 tmp]# ll 检查10.0.0.200
total 16
-rw-r--r-- 1 root root 352 Jun 2 00:19 hosts
- 推送文件及目录
[root@centos6 tmp]# rsync -av /tmp/hosts root@10.0.0.41:/tmp/
root@10.0.0.41's password:
sending incremental file list
hosts
sent 425 bytes received 31 bytes 130.29 bytes/sec
total size is 352 speedup is 0.77
[root@backup tmp]# ll 检查10.0.0.41
total 4
-rw-r--r-- 1 root root 352 Jun 2 00:19 hosts
注 rsync 复制时 重复执行复制直至目录下文件相同就不在复制了
- 利用ssh隧道模式(-e) 拉取推送文件及目录
[root@centos6 tmp]# rsync -av -e 'ssh -p 22' /tmp/hosts root@10.0.0.41:/tmp/
root@10.0.0.41's password:
sending incremental file list
hosts
sent 425 bytes received 31 bytes 101.33 bytes/sec
total size is 352 speedup is 0.77
[root@backup tmp]# ll 检查10.0.0.41
total 4
-rw-r--r-- 1 root root 352 Jun 2 00:19 hosts
注 前面范例使用rsync同步数据都是明文传输,在要求保障数据安全的场景下,可以使用-e 选项借助SSH隧道进行加密传输数据,-p是ssh命令的选项,指定ssh传输的端口号为22.
1.1.4 经验技巧
1)生产场景常用选项-avz,如果在脚本中-v也可以省略
2)关于-z压缩选项的使用建议,如果为内网环境,且没有其他业务占用宽带,可以不用-z选项。不压缩传输,几乎可以满宽带传输(千M网络),压缩传输则网络发送速度就会骤降,压缩的速率赶不上传输的速率
3)选项-n是一个提高安全性的选项,它可以结合-v选项输出模拟的传输过程,如果没有错误,则可以去除-n,传输真正的文件
1.2 rsync守护进程模式
1.2.1 配置服务端
1) 创建配置文件
vim /etc/rsyncd.conf
rsyncd.conf具体说明:
# rsync_config
#####rsyncd.conf start#####
# 设置rsync守护进程模式保存进程号的文件的位置及名字
pid file = /var/run/rsyncd.pid
# 设置锁文件的位置及名字
lock file = /var/run/rsync.lock
# 设置日志文件的位置及名字,可以通过log format参数设置日志格式
log file = /var/log/rsyncd.log
# 设置进行数据传输时所使用的linux系统的用户或UID号
uid = rsync
# 设置进行数据传输时所使用的linux系统的用户组或GID号
gid = rsync
# 这是一个与安全有关的参数。如果设置use chroot = yes,rsync会首先进行chroot设置,
# 将根映射到path参数路径下,对客户端而言,系统的根就是path参数所指定的路径,但这样做需要root权限,
# 并且在同步符号连接资料时仅会同步名称,而内容将不会同步。
use chroot = no
# 设置并发连接数,0代表无限制。超出并发数后,如果依然有客户端连接请求,则将会接收到稍后重试的提示消息。
max connections = 200
# 超时时间
timeout = 300
# 忽略一些I/O错误
ignore errors
# 是否允许客户端传输数据到服务端,设置为yes表示客户端不可写,也就是只读。
read only = false
# 客户端请求显示模块列表时,是否予以显示。设置为true为显示,设置为false为不显示。
list = false
# 设置允许哪些主机可以同步数据,可以是单个IP,也可以是网段,多个IP和网段之间使用空格分隔。
hosts allow = 172.16.1.0/24
# 设置出hosts allow里面设置的主机以外,要拒绝的IP或网段信息。
hosts deny = 0.0.0.0/32
# 设置允许连接服务端的rsync服务的虚拟用户,此用户与linux系统中的用户没有关系。
auth users = rsync_backup
# 设置秘钥认证文件,此文件要求全县为制度,建议设为600。
secrets file = /etc/rsync.password
# 模块名称,rsync守护进程模式通过模块定义同步的目录,模块以[name]的形式定义。
[backup_test]
# 注释说明,非必须项。
comment = "backup dir by ms"
# 同步目录的真实路径
path = /backup
#####rsyncd.conf end#####
2)根据配置文件创建用户
创建进行数据传输时所使用的linux系统用户
命令:
useradd rsync -s /sbin/nologin -M
检查:
id rsync
3)创建认证密钥文件
配置文件中指定的认证密钥文件默认是不存在的,需要创建出来。
命令:
echo "rsync_backup:oldboyedu" > /etc/rsync.password
检查:
cat /etc/rsync.password
4)设置密钥文件的权限
涉及到密码信息的文件,都应该格外注意安全性,所以尽量将密钥文件的权限将至最低,将安全性提到最高。
rsync的密钥文件只需要root用户自己能够读写即可,所以权限设置为600即可。
命令:
chmod 600 /etc/rsync.password
检查:
ls -l /etc/rsync.password
5)创建本地同步目录
本地同步目录一定要确保存在,不存在的话务必要事先创建,否则在应用时会出错。
命令:
mkdir -p /backup
检查:
ls -ld /backup/
6)设置本地同步目录的属主和属组
由于在配置文件中设定了uid和gid的信息,所以需要将本地同步目录属主和属组为相应的用户。
命令:
chown -R rsync.rsync /backup
检查:
ls -ld /backup/
7)启动rsync服务
命令:
rsync --daemon
8)检查rsync服务是否正常启动
命令:
ps -ef | grep rsync | grep -v grep
或
netstat -nltup | grep rsync
或
lsof -i :873
9)设置rsync开机自动启动
想要让rsync服务开机自动启动,可以将其添加至/etc/rc.local文件内。其中/etc/rc.local文件是/etc/rc.d/rc/local文件的软链接。
命令:
echo '# start rsync server when this machine opened.' >> /etc/rc.local
echo '/usr/bin/rsync --daemon' >> /etc/rc.local
10)停止rsync服务(在需要的时候使用,一般修改了服务的配置文件后会需要重启服务)
可以使用killall或者pkill命令杀掉rsync服务,也可以查到端口号交给kill命令去直接杀掉。
命令:
killall rsync
或
pkill rsync
或
kill `cat /var/run/rsyncd.pid`
或
ps aux |grep rsync |grep -v grep |awk '{print $2}' |xargs kill -9 && rm -f /var/run/rsyncd.pid
1.2.2 客户端配置
客户端也需要安装rsync软件,但不需要编写rsync服务的配置文件rsyncd.conf,也不需要启动rsync服务。
不过,客户端也需要设置认证密钥文件,并且对其进行权限控制。
(1)服务器环境检查
与服务端一样,也应该先进行检查,再上手操作。
所以客户端的第一步也是先检查服务器上是否已经安装了rsync软件。
命令:
rpm -qa rsync
或
rpm -qa | grep rsync
(2)安装rsync软件(此步视上一步的结果来确定是否需要操作)
如果检查结果是服务器上没有安装rsync软件,那么需要安装一下,一般rsync软件在装机时就已安装好了。
命令:
yum install -y rsync
(3)创建认证密钥文件
此处需要注意,与服务端不同的地方在于,客户端的密钥文件里面只需要存放rsyncd.conf中auth users参数设定的用户的密码,不需要将用户也一并存放进去。
也就是说,如果客户端的密钥文件里面也写成 user:password的形式,反倒是错误的写法,在应用rsync的守护进程模式传输数据时,会导致传输失败。
命令:
echo 'oldboyedu' > /etc/rsync.password
检查:
cat /etc/rsync.password
(4)设置密码文件的权限
涉及到密码信息的文件,都应该格外注意安全性,所以尽量将密钥文件的权限将至最低,将安全性提到最高。rsync的密钥文件只需要用户自己能够读写即可,所以权限设置为600即可。
命令:
chmod 600 /etc/rsync.password
检查:
ls -l /etc/rsync.password
(5)一些说明
a.客户端的/etc/rsync.password里只放密码,不放用户;
b.客户端的/etc/rsync.password里的密码必须与服务端要使用rsync命令的用户的/etc/rsync.password里的密码一致;
c.客户端的/etc/rsync.password文件和服务端的/etc/rsync.password文件没有任何关系,既客户端存放密码的文件名称不需要与服务端存放密码的文件名称相同,只要和客户端rsync命令接的参数--password-file=/etc/rsync.password一致即可。
d.为安全起见,需要对密码文件授权600。
(6)在客户端采用免交互的方式推送数据到服务端
在客户端采用常规方式(也就是非免交互的方式)推送到服务端的命令格式如下:
rsync -avzP /etc/hosts rsync_backup@172.16.1.41::backup_test
在客户端采用免交互的方式推送到服务端的命令格式如下:
rsync -avzP /etc rsync_backup@172.16.1.41::backup_test --password-file=/etc/rsync.password