rsync 复制软件应用与实现
1、rsync是什么?
英文全称Remote synchronization
开源,高速的,数据复制(拷贝)工具
2、rsync的作用?
工作中需要定时、实时数据备份,本地服务器目录,可能是不同的机器、机房之间的数据备份,用rsync完成。
3、rsync功能特性? 七个特性

4、全量和增量的区别
全量:全部备份
增量:差异化备份,最近增加的内容进行备份=====》效率高
5、rsync复制原理:

6、rsync三种工作模式
第一种模式:命令
rsync语法:

1》把数据从一个地点移动到另一个地点相当于cp
[root@play ~]# >oldboydu
[root@play ~]# echo "00000000" >oldboydu
[root@play ~]# cat oldboydu
00000000
[root@play ~]# rsync oldboydu te
[root@play ~]# cat te
00000000
[root@play ~]#
2》通过加参数实现删除的功能,相当于rm命令。
删除文件内容
[root@backup ~]# touch /null.txt
[root@backup ~]# rsync -r --delete /null.txt /opt/hosts
[root@backup ~]# cat /opt/hosts
[root@backup ~]#

删除目录
[root@backup ~]# mkdir /null
[root@backup ~]# rsync -r --delete /null/ /opt/
[root@backup ~]# ls /opt/
[root@backup ~]#

3》查看属性信息功能,相当于ls命令。
[root@backup ~]# rsync /etc/hosts
-rw-r--r-- 332 2019/04/12 11:24:41 hosts
第二种模式:远程shell模式
借助类似ssh隧道传输数据,适合不同的机器
异地拷贝,相当于scp
<强调一个重点:适合rsync>
null和null/ 区别,null是目录和目录下的内容,
null/只是目录下的内容,不含本身
拉门 推门 思考:
pull,拉:从远端拉取到本地。
pull-----语法1(常用):
rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync命令 参数选项 [虚拟用户]@[主机地址]::[模块名] 本地路径
pull-----语法2:
rsync [OPTION...] rsync://[USER@]HOST::SRC... [DEST]
rsync命令 参数选项 rsync://[虚拟用户]@[主机地址]/[模块名] 本地路径
push,推:从本地推到远端。
push-----语法1(常用):
rsync [OPTION...] [DEST] [USER@]HOST::SRC...
rsync命令 参数选项 本地路径 [虚拟用户]@[主机地址]::[模块名]
push-----语法2:
rsync [OPTION...] [DEST] rsync://[USER@]HOST::SRC...
rsync命令 参数选项 本地路径 rsync://[虚拟用户]@[主机地址]/[模块名]
命令演示===》pull,拉:从远端拉取到本地。
rsync -avz root@172.16.1.41:/opt/hosts /opt
rsync -avz -e "ssh -p 22" root@172.16.1.41:/opt/hosts /opt
rsync -avz rsync_backup@172.16.1.41::backup /etc/hosts --password-file=/etc/rsync.password
命令演示===》push,推:从本地推到远端。
rsync -avz /etc/hosts root@172.16.1.41:/opt/
rsync -avz /etc/hosts -e 'ssh -p 22' root@172.16.1.41:/opt/
rsync -avz /etc/hostsrsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
命令演示中
--password-file=/etc/rsync.password是免密码的
第三种模式:rsync守护进程模式
首先要搭建rsync服务端(要有守护进程),
rsync服务模式:开启后台进程,接受别人访问
7、rsync命令参数
参数 | 意思 |
---|---|
-v | --verbose 显示输出过程 |
-z | --compress 压缩 |
-a | --archive 多参数集合(-rtopgDl) |
-r | --recursive 递归 |
-t | --times 保持修改时间属性 |
-o | --owner 保持属主不变 |
-p | --perms 保持权限不变 |
-g | --group 保持用户组不变 |
-l | --links 保持拷贝软连接 |
-q | --quiet 安静的拷贝 |
--bwlimit=KBPS | 限制I/O带宽,KBytes per second。 |
--delete | 删除 |
--exclude | 排除 |
--exclude-from | 从文件中排除 |
--partial | 支持大文件断点续传 |
企业常用参数组合:-avz或者-vzrtopg
实践排除复制:
NFS01:
[root@nfs01 ~]# mkdir /data -p
[root@nfs01 ~]# cd /data
[root@nfs01 /data]# touch {a..d}
[root@nfs01 /data]# ls
a b c d
--exclude 排除参数
例:排除 a b
[root@nfs01 /data]# rsync -avz /data/ --exclude=a --exclude=b rsync_backup@172.16.1.41::backup
sending incremental file list
./
c
d
排除1到4
[root@nfs01 /data]# touch {1..5}
[root@nfs01 /data]# rsync -avz /data/ --exclude={1..4} rsync_backup@172.16.1.41::backup
sending incremental file list
./
5
a
b
[root@nfs01 /data]# rsync -avz /data/ --exclude={1,3,a} rsync_backup@172.16.1.41::backup
sending incremental file list
2
4
--exclude-from 从文件排除
[root@nfs01 /data]# rsync -avz /data/ --exclude-from=./paichu.txt rsync_backup@172.16.1.41::backup
sending incremental file list
./
16
17
18
19
20
paichu.txt
实践删除:
rsync作为镜像,相当于raid1,让两台服务器目录保持一致。
--delete 让两台服务器目录保持一致
[root@web01 ~]# cd /data
[root@web01 /data]# ll
总用量 0
[root@web01 /data]# rsync -avz --delete /data/ rsync_backup@172.16.1.41::backup
Password:
sending incremental file list
deleting oo
./
sent 51 bytes received 29 bytes 10.67 bytes/sec
total size is 0 speedup is 0.00
[root@backup ~]# cd /backup/
[root@backup /backup]# ll
总用量 0
推送:
rsync -avz --delete /data/ rsync_backup@172.16.1.41::backup
本地目录有啥,远端就有啥。
注意:远端目录是不是东西更多,多了东西会被删除。提前备份backup对应的目录。
rsync -avz --delete rsync_backup@172.16.1.41::backup /data/
远端有啥。本地目录就有啥,注意本地/data目录。把/data改成根。提前注意备份本地/data
企业案例:
某上市公司,白天高峰期某DBA人员从数据库服务器通过rsync将上百GB数据复制到备份服务器,导致数据库库服务器带宽占满,
造成用户无法访问网站的悲剧。其实可以利用rsync限速功能,将复制速度限制在剩余带宽的1/3或者1/2,可能就不会出现故障了
解决企业案例:
用 --bwlimit=KBPS 参数
限制I/O带宽,KBytes per
选择流量低谷时进行打包备份,
8、rsync守护进程模式应用实践
(1)以下操作都是在backup服务器
1、安装
[root@backup ~]# rsync --version
rsync version 3.1.2 protocol version 31
[root@backup ~]# yum install rsync(不需要)
2、配置配置文件/etc/rsyncd.conf
备份
cp /etc/rsyncd.conf{,.ori}
cat>/etc/rsyncd.conf<<EOF
#rsync_config_______________start
#created by oldboy
#site: http://www.oldboyedu.com
uid = rsync
gid = rsync
use chroot = no
fake super = yes
max connections = 200
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 172.16.1.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
[backup]
comment = welcome to oldboyedu backup!
path = /backup/
EOF
man rsync 查命令的参数
man rsyncd.conf 查配置参数
https://www.samba.org/ftp/rsync/rsync.html
创建用户和备份目录
[root@backup ~]# useradd rsync
[root@backup ~]# id rsync
uid=1001(rsync) gid=1001(rsync) 组=1001(rsync)
[root@backup ~]# mkdir -p /backup
[root@backup ~]# chown -R rsync.rsync /backup/
[root@backup ~]# ls -ld /backup/
drwxr-xr-x 2 rsync rsync 6 4月 15 12:12 /backup/
3、启动和检查
rsync --daemon(c6及以前)
systemctl start rsyncd 启动服务
systemctl enable rsyncd 开机自启动
systemctl status rsyncd 查看服务状态
[root@backup ~]# ps -ef|grep sync|grep -v grep #检查进程
root 7521 1 0 11:39 ? 00:00:00 /usr/bin/rsync --daemon --no-detach
[root@backup ~]# netstat -lntup|grep 873 #检查端口
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 7521/rsync
tcp6 0 0 :::873 :::* LISTEN 7521/rsync
[root@backup ~]# lsof -i :873 #检查端口
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsync 7521 root 3u IPv4 41439 0t0 TCP *:rsync (LISTEN)
rsync 7521 root 5u IPv6 41440 0t0 TCP *:rsync (LISTEN)
4、配置密码文件
[root@backup ~]# echo "rsync_backup:oldboy" > /etc/rsync.password
[root@backup ~]# chmod 600 /etc/rsync.password
[root@backup ~]# cat /etc/rsync.password
rsync_backup:oldboy
[root@backup ~]# ls -l /etc/rsync.password
-rw------- 1 root root 20 4月 15 11:51 /etc/rsync.password
方法1:认证密码文件
[root@nfs01 ~]# echo "oldboy" > /etc/rsync.password
[root@nfs01 ~]# chmod 600 /etc/rsync.password
[root@nfs01 ~]# cat /etc/rsync.password
oldboy
[root@nfs01 ~]# ls -l /etc/rsync.password
-rw------- 1 root root 7 4月 15 11:55 /etc/rsync.password
方法2:
[root@nfs01 ~]# echo ' export RSYNC_PASSWORD=oldboy' >>/etc/bashrc
[root@nfs01 ~]# tail -1 /etc/bashrc
export RSYNC_PASSWORD=oldboy
[root@nfs01 ~]# . /etc/bashrc
[root@nfs01 ~]# echo $RSYNC_PASSWORD
oldboy
客户端完成nfs01配置完成
守护进程模式客户端rsync的命令语法:
配置服务器端守护进程,实现数据传输:
错误1:
[root@nfs01 ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
@ERROR: invalid uid rsync
rsync error: error starting client-server protocol (code 5) at main.c(1648) [sender=3.1.2]
解答:
[root@backup ~]# useradd rsync
[root@backup ~]# id rsync
uid=1001(rsync) gid=1001(rsync) 组=1001(rsync)
[root@backup ~]# mkdir -p /backup
[root@backup ~]# chown -R rsync.rsync /backup/
chown -R, --recursive 递归处理所有的文件及子目录
[root@backup ~]# ls -ld /backup/
drwxr-xr-x 2 rsync rsync 6 4月 15 12:12 /backup/
错误2:
[root@nfs01 ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
sending incremental file list
hosts
rsync: chgrp ".hosts.YDuTjO" (in backup) failed: Operation not permitted (1)
sent 223 bytes received 124 bytes 694.00 bytes/sec
total size is 332 speedup is 0.96
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1178) [sender=3.1.2]
解答:增加如下参数到/etc/rsyncd.conf
fake super = yes #不用root用户也可以存储文件的完整属性。
This allows the full attributes of a file to be stored without having to have the daemon actually running as root.
[root@backup ~]# grep fake /etc/rsyncd.conf
fake super = yes
改完配置,要重启服务:
[root@backup ~]# systemctl restart rsyncd
在测试:成功
[root@nfs01 ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
sending incremental file list
hosts
sent 89 bytes received 49 bytes 276.00 bytes/sec
total size is 332 speedup is 2.41
rsync -avz /etc rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
服务端检查:
[root@backup ~]# ls /backup/
hosts
[root@backup ~]# ls /backup/
etc hosts
1、最简单的实现,可以在配置文件结尾加如下内容(特殊底纹部分):
[root@backup ~]# cat /etc/rsyncd.conf
uid = rsync
gid = rsync
use chroot = no
fake super = yes
max connections = 200
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false172.16.1.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
[backup]
comment = welcome to oldboyedu backup.
path = /backup/
[data] #<==新模块。
path = /data/ #<==新备份目录。
除了增加以上两行外,读者也可以设定更多的独立配置参数,例如:独立虚拟用户,独立密码文件等。
2、建立目录并授权。
[root@backup ~]# chown -R rsync.rsync /data
[root@backup ~]# ls -ld /data
drwxr-xr-x 2 rsync rsync 6 4月 16 10:04 /data
3、重启rsync服务(只要修改配置,就考虑重载服务)
[root@backup ~]# systemctl restart rsyncd
4、从客户端访问测试
[root@backup ~]# ls /data
etc
企业案例题
2.1 Rsync 企业级全网备份项目考试
2.1.1 项目前言介绍
随着互联网大环境的不断蓬勃发展,社会上各个行业都不断转变思路,拓展自
己的业务领域,向着互联网企业进行转型,转型后的企业也在不断扩展着自身的互
联网架构.随着架构不断的扩展,架构中的服务器数量也在不断增多,由原来的几
台变为几十台,甚至几百台的规模。此时由于服务器数量的增多,对服务器中数
据的管理备份也随之变的复杂,传统的本地备份或简单的 scp 复制到存储服务器
的备份解决方案,已远远不能有效的解决规模壮大后的架构需求。因此急需一种
更为智能的解决方案来完成备份数据需求,保证整体架构数据的安全可靠性。
2.1.2 项目需求说明
某公司里有一台 web 服务器,里面的数据很重要,但是如果硬盘坏了,数据
就会丢失,现在领导要求把数据做备份,这样 web 服务器数据丢失可以进行恢复,
要求如下:
每天晚上 00 点整在 web 服务器 A 上打包备份系统配置文件、网站程序目录
及访问日志并通过 rsync 命令推送到服务器 B 上备份保留(备份思路可以是先在
本地按日期打包,然后再推到备份服务器 B 上)
已知 3 台服务器主机名分别为 web01、backup 、nfs01,
主机信息见下表:
表 2-7 全网备份主机信息表
服务器说明

备份要求
每天晚上 00 点整在 Web 服务器上打包备份系统配置文件、网站程序目录及
访问日志并通过 rsync 命令推送备份服务器 backup 上备份保留
备份思路
可以是先在本地按日期打包,然后再推到备份服务器 backup 上;NFS 存储
老男孩教育 Linux 运维 58 期项目案例 www.oldboyedu.com
服务器同 Web 服务器实际工作中就是运维主要管理的全部服务器。
2.1.3 具体备份需求
所有服务器的备份目录必须都为/backup
要备份的系统配置文件包括但不限于:
a) 定时任务服务的配置文件 (/var/spool/cron/root) (适合 web 和 nfs 服
务器)。
b) 开机自启动的配置文件 (/etc/rc.local) (适合 web 和 nfs 服务器)。
c) 日常脚本的目录 (/server/scripts)。
Web 服务器站点目录假定为/var/html/www,如果没有可以先模拟创建。
Web 服务器访问日志路径假定为/app/logs,如果没有可以先模拟创建。
Web 服务器本地保留打包后的 7 天备份数据即可(本地留存不能多于 7 天,
因为太多硬盘会满) 。
备份服务器 backup 上,保留最近 7 天的备份数据,同时保留 6 个月内每周一
的所有数据副本。
备份服务器上,要按照备份数据服务器的内网 IP 为目录保存备份,备份的文
件按照时间名字保存。
需要确保备份的数据尽量完整正确,在备份服务器上对备份的数据是否完整
进行检查。
每天早晨 8:00 把备份成功或失败结果信息发给系统管理员邮箱中。
表 2-8 服务器备份信息汇总表

2.1.4项目逻辑架构

解决:
1、第一个里程碑:
在backupfu服务器搭建好rsync服务,并在web01、nfs01上测试成功。
第二个里程碑 开发脚本打包备份
每个服务器上都要有的
/backup 备份目录
/var/spool/cron/root /etc/rc.local /server/scripts /var/html/www /app/logs 需要备份的内容
模拟创建:
[root@nfs01 ~]# mkdir -p /server/scripts
[root@web01 ~]# mkdir -p /server/scripts /var/html/www /app/logs
web01:
[root@web01 ~]# mkdir -p /backup
[root@web01 ~]# ls -ld /backup/
drwxr-xr-x 2 root root 6 4月 16 11:36 /backup/
[root@web01 /]# tar zcvhf /backup/bak_$(date +%F_%w).tar.gz /var/spool/cron/root /etc/rc.local /server/scripts /var/html/www /app/logs
tar: 从成员名中删除开头的“/” 《=======在打包结尾加上 &>/dev/null 就不在提示了
/var/spool/cron/root
/etc/rc.local
/server/scripts/
/var/html/www/
/app/logs/
[root@web01 /]# ls /backup/
bak_2019-04-16_2.tar.gz
写脚本:
[root@web01 /]# mkdir /server/scripts/ -p
[root@web01 /]# cd /server/scripts/
[root@web01 /server/scripts]# cat /server/scripts/bak.sh
[root@web01 /server/scripts]# cat bak.sh
[root@web01 /server/scripts]# vim bak.sh
#!/bin/sh
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
export RSYNC_PASSWORD=oldboy
IP=$(hostname -i)
mkdir -p /backup/$IP
#1.打包
tar zchf /backup/$IP/bak_$(date +%F_%w).tar.gz /var/spool/cron/root /etc/rc.local /server/scripts /var/html/www /app/logs &>/dev/null &&\
#2.删除
find /backup/ -type f -name "*.tar.gz" -mtime +7|xargs rm -f &&\
#3.推送
rsync -az /backup/ rsync_backup@172.16.1.41::backup &>/dev/null
[root@web01 /server/scripts]# /bin/sh /server/scripts/bak.sh
[root@web01 /server/scripts]# ls /backup/
bak_2019-04-16_2.tar.gz
定时任务:
[root@web01 /server/scripts]# crontab -e
[root@web01 /server/scripts]# crontab -l|tail -2
######back.....
00 00 * * * /bin/sh /server/scripts/bak.sh >/dev/null 2>&1
[root@web01 /server/scripts]# find /backup/ -type f -name "*.tar.gz" -mtime +7|xargs rm -f
确保备份完整。
做flag和采集指纹:
[root@nfs01 /server/scripts]# #采集人的指纹
[root@nfs01 /server/scripts]# md5sum oldboy.txt >zhiwen.log
[root@nfs01 /server/scripts]# cat zhiwen.log
348bd3ce10ec00ecc29d31ec97cd5839 oldboy.txt
[root@nfs01 /server/scripts]# #校验
[root@nfs01 /server/scripts]# md5sum -c zhiwen.log
oldboy.txt: 确定
web客户端脚本:
[root@nfs scripts]# vim a.sh
#!/bin/bash
export RSYNC_PASSWORD=123456
IP=$(ifconfig eth1|awk 'NR==2{print $2}')
#打包
tar zcfh /backup/$IP/$(date +%F_week%w).tar.gz /server/scripts /var/html/www /app/logs /var/spool/cron/root /etc/rc.local &&\
#删除
find /backup/ -type f -name "*.tar.gz" -mtime +7|xargs rm -f &&\
#采集指纹
find /backup/$IP -type f -name "*.tar.gz"|xargs md5sum >/backup/$IP/$IP_$(date +%F).flag &&\
#t推送
rsync -az /backup/ rsync_backup@172.16.1.41::backup
backup服务端脚本:
[root@backup /etc]# vim /server/scripts/a.sh
#!/bin/bash
#验证指纹
find /backup/ -type f -name "*.flag"|xargs md5sum -c >/backup/mail.log &&\
#删除
find /backup/ -type f -name "*.tar.gz" -mtime +180|xargs rm -f &&\
find /backup/ -type f ! -name "*_week1.tar.gz" -mtime +7|xargs rm -f &&\
find /backup/ -type f -name "*.flag" -mtime +7|xargs rm -f &&\
#发邮件
mail -s "oldboy" 邮件地址 </backup/mail.log
[root@backup /server/scripts]# vim /etc/mail.rc 《=====在最后一行添加如下内容 看不懂的上面有解释

配置完成后执行一下 使它生效 然后执行脚本
操作过程如下
[root@backup /server/scripts]# . /etc/mail.rc
[root@backup /server/scripts]# sh a.sh
[root@backup /server/scripts]# 《=====什么都不提示就是对的

#######
vim /etc/mail.rc
set from=QQ号@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=QQ号@qq.com
set smtp-auth-password=授权码
set smtp-auth=login
systemctl restart postfix.service
echo "邮件发送测试" | mail -s "邮件测试" QQ号@qq.com


ok,也可以把mail写到脚本里,看自己吧
当脚本执行正确后再放入定时任务中
定时任务:
[root@web01 /server/scripts]# crontab -e
添加
######back.....
00 00 * * * /bin/sh /server/scripts/bak.sh >/dev/null 2>&1
网友评论