定义: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
|