一、rsync简介:

  rsync是一款远程数据同步的工具,是一款开源的,快速的,多功能的,可实现全量及增量的本地或远程数据同步备份的优秀工具,Rsync 软件适用于 Linux Windows等多种操作系统,并且他可以不改变数据的任何属性和内容。

  rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似ssh的scp命令,但又优于scp命令的功能,scp每次都是全量备份,而rsync支持增量备份,当然。rsync还可以在本地主机的不同分区和目录之间全量及增量的复制数据,这又类似于cp命令,但又优于cp命令,cp每次都是全量备份,rsync可以支持增量备份

二、rsync参数:

-v	详细模式输出,传输时的进度等信息,
-z	传输时进行压缩以提高传输效率 -compress-level=NUM  ,可以按级压缩,
-a	归档模式,表示以递归方式传输文件,并保持所有文件属性,等同于 -rtopgDl,相当于包含以下所有
r	对子目录以递归模式,即目录下的所有目录都同样传输,注意事小写r
-t	--times 	保持时间属性一致
-o	--owner	保持文件属主信息
-p	--perms	保持文件权限
g	--group	保持文件属组信息
-P	显示同步的过程以及传输时的进度等信息
-D	保持设备文件信息,
-I	保留软连接,

还有一些其他参数:
-e			     使用隧道模式,
--delete			让目标目录SRC和源目录数据DST一致,
--exclude=PATTERN		指定排除不需要传输的文件模式
--bwlimit=RATE  		限速
(案例:某DBA做数据同步rsync,导致用户无法访问网站)
1、使用rsync的参数,做限速
2、备份尽量在晚上做备份,
补充:rsync scp ftp都有限速的功能,

三、rsync的三种工作模式:

  1、rsync本地工作模式

  rsync的本地模式相当于cp命令,可以实现本地的文件复制,可以加参数来保持文件的属性一致。

;单台服务器使用rsync实现备份操作:
[root@localhost /]# yum install rsync -y
[root@localhost opt]# cp /etc/hosts /opt/
[root@localhost opt]# ll /opt/
total 4
-rw-r--r--. 1 root root 158 Jul 30 08:54 hosts
[root@localhost opt]# rm -f /opt/hosts 
[root@localhost opt]# rsync /etc/hosts /opt
[root@localhost opt]# ll /opt/hosts 
-rw-r--r--. 1 root root 158 Jul 30 08:55 /opt/hosts

  2、rsync使用远程ssh通道工作模式:

  使用-e参数可以是实现rsync通过远程ssh通道实现跨主机的备份操作,需要注意的是,两台主机都需要已经安装rsync。使用ssh连接会有一个问题就是传输很慢,可以采用一下方式优化:

  修改/etc/ssh/sshd_config以下几行:  

  GSSAPIAuthentication no
  #GSSAPIAuthentication yes
  UseDNS no

  然后使用rsync远程ssh通道实现跨主机文件备份:

[root@localhost backup]# rsync -avz /backup/pandj.txt -e "ssh -p 22" root@192.168.80.129:/opt
root@192.168.80.129's password: 
sending incremental file list
pandj.txt

sent 97 bytes  received 35 bytes  37.71 bytes/sec
total size is 5  speedup is 0.04
[root@localhost backup]# ssh 192.168.80.129
root@192.168.80.129's password: 
Last login: Mon Jul 30 09:09:52 2018 from 192.168.80.1
[root@localhost ~]# ip add | grep 192.168
    inet 192.168.80.129/24 brd 192.168.80.255 scope global dynamic ens33
[root@localhost ~]# cd /opt/
[root@localhost opt]# ll
total 4
-rw-r--r--. 1 root root 5 Jul 30 09:46 pandj.txt

  3、rsync daemon 服务模式:

  相当于搭建一个备份服务器,上面跑一个rsync服务,(服务称之为daemon)监听 873 端口,然后有其他的客户端服务器, 在客户端服务器上使用rsync命令,实现可以和服务器 推 和 拉 的作用, 推拉都是在客户端的操作,

  服务端编辑rsync配置文件:

#用户uid,相当于进程对应的虚拟用户远端的命令要使用rsync来访问目录
 uid = rsync
 #gid 相当于进程对应的用户组
 gid = rsync
 #安全相关
 use chroot = no 
 #最大连接数量
 max connections = 200
 #进程对应的进程号文件
 pid file = /var/run/rsyncd.pid
 #日志文件
 log file = /var/log/rsyncd.log
 #超时时间
 timeout = 900

 [backup]
 #服务端提供访问的目录
 path = /backup
 #忽略错误
 ignore errors
 #只读为假表示 可写
 read only = no
 #允许列表
 list  = yes
 #虚拟用户
 auth users = rsync_backup
 #虚拟账号对应的用户和密码
 secrets file = /etc/rsync.password

  服务端rsync配置文件配置好之后,还需要创建一个rsync用户和 /backup 这个目录,访问逻辑就是源端用户连过来的时候用的就是rsync这个用户访问 /backup 这个目录,在这个过程中,需要注意文件的权限,以及配置文件中虚拟用户的账户密码文件配置。

[root@localhost ~]# useradd rsync -s /sbin/nologin -M               //创建一个rsync用户 不需要登陆,不需要家目录。
[root@localhost ~]# tail -1 /etc/passwd
rsync:x:1001:1001::/home/rsync:/sbin/nologin
[root@localhost ~]# mkdir /backup			 //创建一个backup目录
[root@localhost ~]# ll -d /backup/
drwxr-xr-x. 2 root root 23 Jul 30 09:46 /backup/

//到这边远端用户还是访问不了/backup这个目录,因为有权限的控制,需要我们把这个目录的属主改成rsync,也可以用chmod 777但是这样不安全,不建议使用
[root@localhost ~]# chown -R  rsync.rsync /backup
[root@localhost ~]# ll -d /backup/
drwxr-xr-x. 2 rsync rsync 23 Jul 30 09:46 /backup/

//然后检查配置文件,还少一个虚拟账号对应的密码文件 secrets file = /etc/rsync.password 编辑此文件并修改此文件的权限,
[root@localhost ~]# echo "rsync_backup:123456" > /etc/rsync.password
[root@localhost ~]# tail -1 /etc/rsync.password 
rsync_backup:123456
[root@localhost ~]# chmod 600 /etc/rsync.password 
[root@localhost ~]# ll /etc/rsync.password 
-rw-------. 1 root root 20 Jul 31 09:25 /etc/rsync.password

//启动rsync服务,并加入开机自启,查看端口确认服务是否起来。
[root@localhost ~]# /usr/bin/rsync --daemon
[root@localhost ~]# echo "/usr/bin/rsync --daemon" >> /etc/rc.local 
[root@localhost ~]# lsof -i:873
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rsync   2245 root    4u  IPv4  20736      0t0  TCP *:rsync (LISTEN)
rsync   2245 root    5u  IPv6  20737      0t0  TCP *:rsync (LISTEN)

  

  服务端至此配置完成,配置客户端的步骤如下:

  1、需要配置一个密码文件,和服务端一致并修改权限

[root@client ~]# echo "rsync_backup:123456" > /etc/rsync.password
[root@client ~]# chmod 600 /etc/rsync.password 
[root@client home]# tail -1 /etc/rsync.password 
rsync_backup:123456

  2、创建一个 /backup 目录,用来测试

[root@client backup]# mkdir /backup/

  3、测试推送

//在服务端 /backup 目录下创建一个测试文件
[root@localhost backup]# touch test
[root@localhost backup]# echo 11111 > test
//在客户端拉取服务区的文件
[root@client backup]# pwd
/backup
[root@client backup]# ll
total 0
[root@client backup]# rsync -avz rsync_backup@192.168.80.128::backup /backup/
receiving incremental file list
./
test

sent 50 bytes  received 127 bytes  354.00 bytes/sec
total size is 6  speedup is 0.03
[root@client backup]# ll
total 4
-rw-r--r--. 1 root root 6 Jul 31 11:12 test
[root@client backup]# more test 
11111

  如果想要非交互式的传输,可以用以下命令:

[root@localhost backup]# rsync -avz /backup/ rsync_backup@192.168.80.130::backup/ --password-file=/etc/rsync.password

 

四、配置过程中的注意点:

  1、服务端的目录属主要修改成配置文件中的用户,否则会有权限问题

  2、虚拟用户密码文件服务端内容为:虚拟用户名:密码   客户端密码配置内容为  密码,且两个文件权限均需要修改成600

五、rsync配置中常见的问题:

1、配置文件问题

@ERROR: chroot failed

rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6] 

排查思路;
1、命令解析: 客户端使用 命令 参数 目录 虚拟用户@服务端地址::模块名/ --password-file=/etc/rsync.password 来往服务端同步信息,
2、排查地址及端口,服务端使用lsod -i :873 或者 netstat -lntup | grep 873 来查看服务是否存在
然后在客户端 telnet 服务端地址加端口,排查是否地址端口存在问题,
3、不加 --password-file 参数,手动输入密码,看用户名和密码是否能登陆上
虚拟用户名和密码都定义在 /etc/rsyncd.conf配置文件中
auth users = rsync_backup
secrets file = /etc/rsync.password
/etc/rsync.password 文件需要创建,服务端中输入rsync_backup:123456,用户名密码
/etc/rsync.password 客户端中输入 joywise
4、能连接上,排查 uid gid 中rsync是否存在,[backup]模块中目录地址是否正确,
5、查看 [root@backup backup]# tail -10 /var/log/rsyncd.log
提示我 /backup 这个目录找不到,ll -d /backup查看目录确实存在,怀疑问题在配置文件中的[backup] 模块中 path 中,经过排查, path = /backup 这条配置后面有很多空格导致找不到目录,所有提示 chroot failed,修改配置文件,然后再从客户端推,解决问题。