rsync服务

定义:rsync是一款开源的、快速的、多功能的、可实现全量或增量的本地或远程数据同步备份的优秀工具

一、特点

  • 本地备份
  • 远程备份
  • 全量备份:无论数据新旧,全部复制(同步)。
  • 增量备份:只复制(同步)有变化的数据

二、应用场景

1.不同服务器间数据备份

定时任务+rsync(守护进程模式)

2.存储服务器实时备份

sersync+rsync(守护进程模式)

三、rsync命令

1.命令格式及参数

格式:rsync 源目录 目的目录

  • -a
常用参数 :-avz/-az
-a== -rlgtopD

在守护进程模式使用-a参数,-g参数和-o参数不生效
  • -r 递归同步(可同步目录)
  • -l 复制软连接
  • -g 复制时保持文件属组不变
  • -t 复制时保持文件修改时间不变
  • -o 复制时保持文件属主不变
  • -p 复制的时候保持文件及目录权限不变
  • -D 复制一些特殊设备文件
  • -z 同步数据时,对数据进行压缩
  • -v 显示同步过程
[root@backup /backup]# touch /data/a{01..10}.txt
[root@backup /backup]# ls /data/
a01.txt  a02.txt  a03.txt  a04.txt  a05.txt  a06.txt  a07.txt  a08.txt  a09.txt  a10.txt
[root@backup /backup]# rsync -av /data /backup/
sending incremental file list
data/
data/a01.txt
data/a02.txt
data/a03.txt
data/a04.txt
data/a05.txt
data/a06.txt
data/a07.txt
data/a08.txt
data/a09.txt
data/a10.txt

sent 626 bytes  received 210 bytes  1,672.00 bytes/sec
total size is 0  speedup is 0.00
[root@backup /backup]# tree .
.
└── data
    ├── a01.txt
    ├── a02.txt
    ├── a03.txt
    ├── a04.txt
    ├── a05.txt
    ├── a06.txt
    ├── a07.txt
    ├── a08.txt
    ├── a09.txt
    └── a10.txt

1 directory, 10 files
  • -P 显示详细的同步过程
[root@backup /data]# ls
a01.txt  a02.txt  a03.txt  a04.txt  a05.txt  a06.txt  a07.txt  a08.txt  a09.txt  a10.txt
[root@backup /data]# cd /backup/
[root@backup /backup]# ls
[root@backup /backup]# rsync -P /data/* /backup/
a01.txt
              0 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=9/10)
a02.txt
              0 100%    0.00kB/s    0:00:00 (xfr#2, to-chk=8/10)
a03.txt
              0 100%    0.00kB/s    0:00:00 (xfr#3, to-chk=7/10)
a04.txt
              0 100%    0.00kB/s    0:00:00 (xfr#4, to-chk=6/10)
a05.txt
              0 100%    0.00kB/s    0:00:00 (xfr#5, to-chk=5/10)
a06.txt
              0 100%    0.00kB/s    0:00:00 (xfr#6, to-chk=4/10)
a07.txt
              0 100%    0.00kB/s    0:00:00 (xfr#7, to-chk=3/10)
a08.txt
              0 100%    0.00kB/s    0:00:00 (xfr#8, to-chk=2/10)
a09.txt
              0 100%    0.00kB/s    0:00:00 (xfr#9, to-chk=1/10)
a10.txt
              0 100%    0.00kB/s    0:00:00 (xfr#10, to-chk=0/10)
[root@backup /backup]# ls
a01.txt  a02.txt  a03.txt  a04.txt  a05.txt  a06.txt  a07.txt  a08.txt  a09.txt  a10.txt
  • --delete 强制目的目录与源目录保持一致,不同的文件会被删除掉
[root@backup /backup]# rm -f ./*
[root@backup /backup]# ls
[root@backup /backup]# rsync /backup/ /data/ -av --delete
sending incremental file list
deleting backup/
deleting a10.txt
deleting a09.txt
deleting a08.txt
deleting a07.txt
deleting a06.txt
deleting a05.txt
deleting a04.txt
deleting a03.txt
deleting a02.txt
deleting a01.txt
[root@backup /backup]# ls /data/
./

sent 42 bytes  received 140 bytes  364.00 bytes/sec
total size is 0  speedup is 0.00
  • --exclude 文件 同步时排除指定文件
[root@backup /backup]# touch /data/a{01..10}.txt
[root@backup /backup]# rsync -avz /data/ /backup/ --exclude a01.txt
sending incremental file list
./
a02.txt
a03.txt
a04.txt
a05.txt
a06.txt
a07.txt
a08.txt
a09.txt
a10.txt

sent 530 bytes  received 190 bytes  1,440.00 bytes/sec
total size is 0  speedup is 0.00
[root@backup /backup]# ls
a02.txt  a03.txt  a04.txt  a05.txt  a06.txt  a07.txt  a08.txt  a09.txt  a10.txt
  • --bwlimit=速率 同步文件时限制传输速度
[root@backup /data]# dd if=/dev/zero of=/data/20M bs=1M count=20
20+0 records in
20+0 records out
20971520 bytes (21 MB) copied, 1.28075 s, 16.4 MB/s
[root@backup /data]# rsync -av /data/ /backup/ 
sending incremental file list
./
20M

sent 20,976,745 bytes  received 38 bytes  13,984,522.00 bytes/sec
total size is 20,971,520  speedup is 1.00
[root@backup /data]# rm -rf /backup/*
[root@backup /data]# rsync -av /data/ /backup/ --bwlimit=1M
sending incremental file list
./
20M

sent 20,976,745 bytes  received 38 bytes  1,023,257.71 bytes/sec
total size is 20,971,520  speedup is 1.00

2.使用注意事项

以下内容仅对rsync源目录参数有效

  • /目录
代表目录及目录下面所有的内容,包含目录
[root@backup /data]# rsync /data /backup/ -a
[root@backup /data]# tree /backup/
/backup/
└── data
    ├── a01.txt
    ├── a02.txt
    ├── a03.txt
    ├── a04.txt
    └── a05.txt

1 directory, 5 files
  • /目录/
代表目录下面的所有内容,不包含目录
[root@backup /data]# rsync /data/ /backup/ -a
[root@backup /data]# tree /backup/
/backup/
├── a01.txt
├── a02.txt
├── a03.txt
├── a04.txt
└── a05.txt

0 directories, 5 files

四、rsync工作模式

1.本地模式:Local模式

[root@backup /backup]# ls
a01.txt  a02.txt  a03.txt  a04.txt  a05.txt
[root@backup /backup]# ls /data/
a01.txt  a02.txt  a03.txt  a04.txt  a05.txt
[root@backup /backup]# rsync -av /data/ /backup/
sending incremental file list

sent 130 bytes  received 12 bytes  284.00 bytes/sec
total size is 0  speedup is 0.00
[root@backup /backup]# touch /data/a{06..10}.txt
[root@backup /backup]# rsync -av /data/ /backup/
sending incremental file list
./
a06.txt
a07.txt
a08.txt
a09.txt
a10.txt

sent 426 bytes  received 114 bytes  1,080.00 bytes/sec
total size is 0  speedup is 0.00

2.远程模式:Access via remote shell模式

全量备份-scp

[root@backup /backup]# scp 172.16.1.131:/data/* /backup/ 
root@172.16.1.131's password: 
a01.txt                                                                         100%    0     0.0KB/s   00:00    
a02.txt                                                                         100%    0     0.0KB/s   00:00    
a03.txt                                                                         100%    0     0.0KB/s   00:00    
a04.txt                                                                         100%    0     0.0KB/s   00:00    
a05.txt                                                                         100%    0     0.0KB/s   00:00    
[root@backup /backup]# scp 172.16.1.131:/data/* /backup/ 
root@172.16.1.131's password: 
a01.txt                                                                         100%    0     0.0KB/s   00:00    
a02.txt                                                                         100%    0     0.0KB/s   00:00    
a03.txt                                                                         100%    0     0.0KB/s   00:00    
a04.txt                                                                         100%    0     0.0KB/s   00:00    
a05.txt                                                                         100%    0     0.0KB/s   00:00   

增量备份-rsync

[root@backup /backup]# rsync 172.16.1.131:/data/ /backup/ -avz
root@172.16.1.131's password: 
receiving incremental file list
./
a01.txt
a02.txt
a03.txt
a04.txt
a05.txt

sent 122 bytes  received 317 bytes  125.43 bytes/sec
total size is 0  speedup is 0.00
[root@backup /backup]# rsync 172.16.1.131:/data/ /backup/ -avz
root@172.16.1.131's password: 
receiving incremental file list

sent 20 bytes  received 130 bytes  42.86 bytes/sec
total size is 0  speedup is 0.00
同步模式

推(Push) 本地目录 -> ip:/目录
拉(Pull) ip:/目录 ->本地目录
[root@backup /backup]# rsync -avz /etc/hostname 172.16.1.131:/backup   #Push
root@172.16.1.131's password: 
sending incremental file list
hostname

sent 98 bytes  received 35 bytes  38.00 bytes/sec
total size is 7  speedup is 0.05
[root@nfs01 ~]# cd /backup/
[root@nfs01 /backup]# cat ./hostname 
backup
[root@backup /backup]# rsync -avz 172.16.1.131:/etc/hostname /backup/   #Pull
root@172.16.1.131's password: 
receiving incremental file list
hostname

sent 43 bytes  received 97 bytes  31.11 bytes/sec
total size is 6  speedup is 0.04
[root@backup /backup]# cat ./hostname 
nfs01

3.守护进程模式:Access via rsync daemon rsync

服务端
step1:添加虚拟用户
虚拟用户要求rsync服务配置文件中uid指定的虚拟用户一致;

[root@backup /backup]# useradd -Ms /sbin/nologin rsync

step2:修改配置文件(/etc/rsyncd.conf)

#rsyncd.conf start#
fake super =yes #赋予rsync用户chgrp执行权限
uid = rsync #rsync运行时所用的虚拟用户
gid = rsync
port = 873 #指定rsyncd服务监听端口号
use chroot = no #关闭chroot功能
max connections = 2000 #最大链接数量
timeout = 600 #会话超时时间
pid file = /var/run/rsyncd.pid #指定服务进程PID信息的存放文件
lock file = /var/run/rsync.lock #指定会话进程锁文件的默认生成位置
log file = /var/log/rsyncd.log #rsync守护进程模式的服务端日志文件
ignore errors #忽略简单的错误
read only = false #关闭用户只读权限(设置用户读写权限)
list = false #用户不可查看服务端目录结构
hosts allow = 172.16.1.0/24 #准许哪个网段的主机可以使用本机的rsync服务
#hosts deny = 0.0.0.0/32 #拒绝哪个网段的主机可以使用本机的rsync服务
##allow和deny尽量不要同时用,同时使用时范围大的参数生效
auth users = rsync_backup #用于访问rsync服务端的用户名(非系统傀虚拟用户)
secrets file = /etc/rsync.password #用户名对应的密码文件(密码文件权限必须是600)
#####################################
[data] #rsync服务模块名称
comment = www by old0boy 14:18 2012-1-13 #该服务模块的说明
path = /data #该服务模块对应的备份目录
#####################################
[backup]
path = /backup
[root@backup /backup]# vim /etc/rsyncd.conf 

#rsyncd.conf start#
#赋予rsync用户chgrp执行权限;
fake super=yes
#指定rsync服务运行时所用的虚拟用户和虚拟用户组;
uid = rsync
gid = rsync
#指定服务端口号
port = 873
#关闭chroot功能;
use chroot = no
#设置rsync最大连接数量为2000;
max connections = 2000
#设置rsync会话超时时间为10分钟;
timeout = 600
#指定rsync服务进程PID信息存放文件;
pid file = /var/run/rsyncd.pid
#指定rsync服务进程锁定文件的默认生成位置;
lock file = /var/run/rsync.lock
#指定rsync服务守护进程模式的服务端日志文件位置;
log file = /var/log/rsyncd.log
#设置rsync服务忽略简单错误;
ignore errors
#关闭用户只读权限(设置用户读写权限);
read only = false
#设置客户端禁止查看服务端目录结构;
list =false
#设置准许/拒绝访问本机rsync服务的网段;
hosts allow = 172.16.1.0/24
#hosts deny = 0.0.0.0/32
##尽量避免在rsync服务中allow和deny参数同时使用;同时使用时范围大的参数生效;
#
#指定rsync客户端用于访问本机rsync服务的用户(该用户用于客户端访问本机rsync服务,非本机系统傀儡用户);
auth users = rsync_backup
#指定授权用户对应的密码文件;
secrets file = /etc/rsync_server.password
####################################################
#指定本机rsync服务的模块名称;
[backup]
#指定该服务模块的描述(可省略);
comment = web01_backup by Aspen at 2019-06-20
#指定该模块对应的本地备份目录;
path = /backup

step3:创建备份目录:并修改目录的属主和属组为rsync
备份目录要与rsync服务的模块路径一致,目录的属主和属组要与配置文件的uid、gid参数一致;

[root@backup /backup]# mkdir -p /backup/
[root@backup /backup]# chown rsync: /backup/
[root@backup /backup]# ll -d /backup/
drwxr-xr-x 2 rsync rsync 6 Jun 20 22:13 /backup/

step4:创建密码文件,修改密码文件权限为600
密码文件名称与路径要与rsync服务配置文件中secrets file参数指定的内容一致;

密码文件格式:echo'访问服务端用户名:对应密码' >密码文件 #用户名要与配置文件中指定的auth users一致
[root@backup /backup]# vim /etc/rsync_server.password
#rsync service password file
rsync_backup:123456
[root@backup /backup]# ll /etc/rsync_server.password 
-rw------- 1 root root 49 Jun 20 22:59 /etc/rsync_server.password

step5:开启rsyncd服务

Cent OS 7:systemctl restart rsyncd
Cent OS 6:/usr/bin/rsync --daemon
[root@backup /backup]# systemctl restart rsyncd

step6:检查rsync服务状态(rsync默认端口873)

ps -ef |grep rsync
ss -lntup |grep rsync
[root@backup /backup]# ps -ef |grep rsync 
root      16240      1  0 23:01 ?        00:00:00 /usr/bin/rsync --daemon --no-detach
root      16244  15007  0 23:02 pts/0    00:00:00 grep --color=auto rsync
[root@backup /backup]# ss -lntup | grep rsync
tcp    LISTEN     0      5         *:873                   *:*                   users:(("rsync",pid=16240,fd=3))
tcp    LISTEN     0      5        :::873                  :::*                   users:(("rsync",pid=16240,fd=5))

step7:本机测试

rsync -av 测试文件 访问服务端用户名@服务端IP地址::服务端模块名称
[root@backup /backup]# rsync -av /etc/hostname rsync_backup@172.16.1.141::backup
Password: 
sending incremental file list
hostname

sent 105 bytes  received 43 bytes  32.89 bytes/sec
total size is 7  speedup is 0.05
[root@backup /backup]# ls
hostname
[root@backup /backup]# cat ./hostname 
backup

系统/tmp目录权限不对,服务执行也会报错

step8:rsync服务开机自启动

Cent OS 7:systemctl enable rsyncd
Cent OS 6:编辑/etc/rc.d/rc.local文件
[root@backup /]# systemctl enable rsyncd
Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service.

附:服务端排错流程

step1:查看日志文件
step2:查看配置文件
step3:按部署流程排查

客户端
step1:创建客户端密码文件

echo '密码'>密码文件 #rsync客户端密码文件和服务端密码文件格式不同;
客户端密码文件只需保存密码;
[root@web01 ~]# vim /etc/rsync_client.password #密码文件中不要写任何注释;
123456

step2:修改密码文件权限(权限600)

chmod 600 密码文件
[root@web01 ~]# chmod 600 /etc/rsync_client.password 
[root@web01 ~]# ll /etc/rsync_client.password 
-rw------- 1 root root 43 Jun 20 23:13 /etc/rsync_client.password

step3:通过--password-file参数引用密码文件

--password-file=密码文件
[root@web01 ~]# rsync -av /etc/hostname rsync_backup@172.16.1.141::backup --password-file=/etc/rsync_client.password 
sending incremental file list

sent 51 bytes  received 20 bytes  142.00 bytes/sec
total size is 6  speedup is 0.08

step4:结合定时任务,实现自动定时备份;

五、仿真题目

全网备份题目:
某公司里有一台Web服务器,里面的数据很重要,但是如果硬盘坏了,数据就会丢失,现在领导要求你把数据在其他机器上做一个周期性定时备份。要求如下:
每天晚上12点整在Web服务器A(web01 )上打包备份网站程序目录并通过rsync命令推送到服务器 B(backup)上备份保留(备份思路可以是先在本地按日期打包,然后再利用rsync推到备份服务器上)。
具体要求如下:
1)Web服务器A和备份服务器B的备份目录必须都为/backup。 ##脚本放在/server/scripts/
2)Web服务器站点目录假定为(/var/www/html)。
3)Web服务器本地仅保留7天内的备份。
4)每天晚上12点把备份/backup 推送到备份服务器B上。 ##/backup/IP地址
5)备份服务器上每周六的数据都保留,其他备份仅保留180天备份。
6)备份服务器上检查备份结果是否正常,并将每天的备份结果发给管理员信箱。

[客户端]

[root@web01 /backup/172.16.1.17]# vim /scripts/backup.sh 
#!/bin/bash
ip=`hostname -I |awk '{print $2}'`
mkdir -p /backup/$ip
date=`date +%F-%w`
#backup configure
cd / && \
tar zchf /backup/$ip/HTML_backup-$date.tar.gz var/www/html
#md5sum
find /backup/ -type f -name '*.tar.gz'|xargs md5sum >/backup/$ip/check.md5
#Push rsync
rsync -az /backup/* rsync_backup@172.16.1.141::backup --password-file=/etc/rsync_client.password
#del
find /backup/ -type f -name '*.tar.gz' -mtime +7 -exec rm -f {} \;
[root@web01 /backup/172.16.1.17]# crontab -e
#backup file from local to 172.16.1.141 by Aspen 20190621
00 00 * * * sh /scripts/backup.sh >/dev/null 2>&1

[服务端]

[root@backup /]# tail -6 /etc/mail.rc
# Only include selected header fields when forwarding messages.
fwdretain subject date from to

 # For Linux and BSD, this should be set.
 set bsdcompat
 set from=*********@163.com smtp=smtp.163.com smtp-auth-user=********* smtp-auth-password=******** smtp-auth=login
[root@backup /]# vim  /scripts/backup.sh 
#!/bin/bash
#md5sum check
find /backup/ -type f -name '*.md5' |xargs md5sum -c >/backup/check/verify.result
#mail to manager
mail -s "verified file result" a*******n@***.com </backup/check/verify.result
#del 
find /backup/ -type f ! -name *-6.tar.gz -mtime +180 -exec rm -f {} \;
[root@backup /]# crontab -e 
#Backup File Verified by Aspen 20190621
00 00 * * * sh /scripts/backup.sh >/dev/null 2>&1
附:邮件服务
基础应用

mail -s "邮件主题" 收件人 <邮件内容
echo "邮件内容"|mail -s "主题" 收件人

扩展应用

step01: vim /etc/mail.rc
step02: set from=发件邮箱 smtp=smtp.163.com smtp-auth-user=用户名 smtp-auth-password=授权码 smtp-auth=login

附:思维导图