Rsync(Remote synchronization)工具可实现全量及增量的本地或远程数据同步备份
(1) 一个rsync相当于scp,cp,rm,但是优于每一个命令(rsync可以完整拷贝和增量拷贝)
(2) 默认情况下,Rsync在同步备份数据时,通过其独特的“quick check”算法,快速的同步备份数据:
它仅同步大小或者最后修改时间发生变化的文件或目录;
也可根据权限,属主等属性的变化同步,但需要指定相应的参数;
甚至可以实现只同步一个文件里有变化的内容部分。
CentOS5,rsync2.x比对方法,把所有的文件比对一遍,然后进行同步。
CentOS6,rsync3.x比对方法,一边比对差异,一边对差异的部分进行同步。
-a --archive,相当于-rlptgoD,归档模式,采取递归方式来同步,且尽可能的保持各个方面的一致性 -a无法同步硬链接,要加上-H选项
选项 | 含义 |
---|---|
-r | --recursive,递归模式 |
-l | --links 保留软链接 |
-p | --perms 保持文件权限 |
-t | --times 保持文件时间信息 |
-g | --group 保持文件属组信息 |
-o | –owner 保持文件属主信息 |
-D | --devices 保持设备文件信息 |
-v --verbose,详细模式输出,传输时的进度等信息
-z --compress,对备份的文件在传输时进行压缩处理
-P --progress 显示同步的过程及传输时的进度等信息
- - delete 让源目录SRC和目标目录数据DST一致(如果源端没有此文件,那么目的端也别想拥有)--delete选项不能单独使用(可以搭配-r)
- - exclude=filename 指定排除不需要传输的文件名称
- - bwlimit=KBPS 限制 I/O 带宽,KBytes per second
某DBA做数据同步,带宽占满,导致用户无法访问网站。
rsync -avz dbfile 10.0.0.41:/backup #没有给带宽做限制
rsync -avz --bwlimit=100 dbfile 172.16.1.41:/backup #限定了带宽
生产环境常用参数:-avz 或 -vzrtopg 前者较后者多了Dl功能
-avzP相当于-vzrtopgDIP(放入脚本中可以把-v和-P去掉)
当本地的不同目录之间需要数据传输,特别是经常需要增量传输时,rsync命令可以替代cp等命令,提升拷贝的效率
(1) 第一次运行命令会由于需要扫描并同步所有文件及目录,因此时间会长一些,如果再次备份就会进行快速对比,忽略通过的文件,速度更快。
(2) 在传输数据时,rsync命令也需要有对同步的目录拥有权限如此才可以实现正常传输数据。
rsync [OPTION...] SRC... [DEST]
命令 【参数】 源 【目的分区,文件或目录】
1.把根下的opt目录同步到mnt目录(直接本地同步,与cp命令相似)
rsync -avz /opt /mnt
必须是/opt
2.删除功能,相当于rm命令
[root@localhost ~]# mkdir /space
[root@localhost ~]# rsync -avz --delete /space/ /tmp ;必须是/space/
注意有/和无/的区别
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
1.将当前主机/etc目录通过SSH推送到远程主机的/tmp目录
rsync -avzP [-e 'ssh -p 22'] /etc [email protected]:/tmp
2.将远程主机/opt目录拉取到当前主机(包含目录本身)
rsync -avzP [-e 'ssh -p 22'] [email protected]:/opt /tmp/
通过映射好的主机名:(/etc/hosts)
[root@localhost ~]# tail -1 /etc/hosts
192.168.213.125 zhao
rsync -avzP [-e 'ssh -p 22'] root@zhao:/opt /tmp/
将命令的结果反馈回来 ssh root@IP command
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
1.部署环境
操作系统
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
内核版本
[root@localhost ~]# uname -r
3.10.0-1062.el7.x86_64
主机网络参数设置
主机名 | 网卡ens33 | 用途 | 代号 |
---|---|---|---|
A | 192.168.213.129 | rsync服务端 | A-Server |
B | 192.168.213.125 | rsync客户端 | B-Cilent |
2.开始部署rsync服务端
rpm -qa rsync #首先确认软件是否安装
cp -p /etc/rsyncd.conf{,.bak} #配置文件/etc/rsyncd.conf(配置前先备份)
vim /etc/rsyncd.conf
【
uid = root #用户
gid = root #组
use chroot = no #程序安全设置
max connections = 200 #客户端连接数
timeout = 300 #超时时间
pid file = /var/run/rsyncd.pid #进程号文件位置
lock file = /var/run/rsync.lock #进程锁
log file = /var/log/rsyncd.log #日志文件位置
# rsync主目录设置
[backup]
path = /backup/ #使用目录
ignore errors #有错误时忽略
read only = false #可读可写(true或false)
list=false #阻止远程列表(不让通过远程方式看服务端有啥)
hosts allow = 192.168.197.0/24 #允许IP
hosts deny = 0.0.0.0/32 #禁止IP
auth users = rsync_backup #虚拟用户
secrets file = /etc/rsync.password #存放用户和密码的文件
】
useradd -M -s /sbin/nologin rsync #添加rsync程序用户
mkdir /backup #创建共享目录
rsync --dameon #启动服务
chown -R rsync:rsync /backup/ #将共享文件夹更改属主rsync
chmod -R 755 /backup/ #将共享文件夹更改权限
echo "rsync_backup:123456" > /etc/rsync.password #创建rsync虚拟账户名和密码
chmod 600 /etc/rsync.password #将账户密码文件的权限设置为600(必须否则失败)
echo "rsync --daemon" >> /etc/rc.local #加入开机自启动
systemctl stop firewalld
setenforce 0
systemctl disable firewalld #禁止开机启动
【重启rsync服务】
①pkill rsync ;关闭rsync服务
②rsync --daemon ;启动rsync服务
3.开始部署rsync客户端
rpm -qa rsync
echo "123456" > /etc/rsync.password ;创建密码文件
chmod 600 /etc/rsync.password ;将账户密码文件的权限设置为600(必须否则失败)
rsync服务器配置文件里的模块名
1.推送 将客户端任意目录推送到服务器端rsync指定目录/backup下
rsync -avzP /etc [email protected]::backup --password-file=/etc/rsync.password
ssh [email protected] ls /backup;查看同步结果
2.拉取 将rsync服务器端全部内容同步到客户端/backup
rsync -avzP [email protected]::backup /backup/ --password-file=/etc/rsync.password
3.拉取 将rsync服务器端指定目录下的指定内容同步到客户端
rsync -avzP [email protected]::backup/opt.tar.gz /backup/ --password-file=/etc/rsync.password
4.拉取时排除 将rsync服务器端指定目录下的全部内容排除某目录或文件后,同步到客户端
通过命令行实现排除
rsync -avzP --exclude=hosts --exclude=test/test1.txt [email protected]::backup /backup/ --password-file=/etc/rsync.password
通过列表文件实现排除
rsync -avzP --exclude-from=/root/exclude.txt [email protected]::backup /backup/ --password-file=/etc/rsync.password
#cat/root/exclude.txt
test/test1.txt
hosts
4.同步拉取 让rsync客户端指定目录内容始终和rsync服务器共享目录内容保持一致
(1)和rsync服务器目录内容始终保持一致
rsync -avz --delete [email protected]::backup /backup/ --password-file=/etc/rsync.password
始终保持一致的意思是说,当Rsync服务器共享目录增加文件,那么客户端指定目录也增加,服务器端共享目录删除文件,那么客户端指定目录也删除文件
(2) 排除某文件后,再和服务器进行同步
rsync -avz --delete --exclude=file [email protected]::backup /backup/ --password-file=/etc/rsync.password
与同步拉取相比,同步推送只是客户端目录放在了服务端的前边
vim Rsync ;编写脚本
【
# Source function library
. /etc/rc.d/init.d/functions
start(){
rsync --daemon
if [ $? -eq 0 -a `ps -ef|grep -v grep|grep rsync|wc -l` -gt 0 ]
then
action "Starting Rsync:" /bin/true
sleep 1
else
action "Starting Rsync:" /bin/false
sleep 1
fi
}
stop(){
pkill rsync;sleep 1;pkill rsync
if [ `ps -ef|grep -v grep|grep "rsync --daemon"|wc -l` -lt 1 ]
then
action "Stopping Rsync: " /bin/true
sleep 1
else
action "Stopping Rsync:" /bin/true
sleep 1
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
;;
*)
echo $"Usage: `basename $0` {start|stop|restart|reload}"
esac
】
chmod +x Rsync ;增加可执行权限
mv Rsync /usr/local/bin/
#【使用方法】
Rsync
Usage: Rsync {start|stop|restart|reload}
cat /var/log/rsyncd.log
ps -ef|grep rsync
netstat -antup |grep 873
telnet 192.168.197.129 873
备份全网服务器数据生产架构方案案例模型(必做)
【企业案例】
某公司里有一台Web服务器,里面的数据很重要,但是如果硬盘坏了,数据就会丢失,现在领导要求你把数据在其他机器上做一个周期性定时备份。要求如下:
每天晚上00点整在Web服务器A上打包备份网站程序目录并通过rsync命令推送到服务器B上备份保存(备份思路可以是先在本地按日期打包,然后再利用rsync推送到备份服务器上)。
具体要求如下:
1)rsync服务的socket方式传递,(客户端,服务端(web))
2)web服务器站点目录为(/var/www/html)
3)归档压缩web目录内容为日期格式,(例如:/backup/www.20190915.tar.gz),web服务器本地仅保留7天内的备份
4)备份服务器上检查备份结果是否正常(对比大小(服务文件—客户端文件对比)md5sum 生成校验码,使用校验码对比),并将每天的备份结果发给管理员信箱(自学 postfix)。
5)备份保留180天。
前提:rsync1备份服务器已搭建好rsync服务器环境,rsync2已搭建好rsync客户端环境。
[root@rsync2 ~]# crontab -l
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
#每天0点打包备份网站程序目录,rsync推送到服务器上备份
0 0 * * * source ./etc/profile;/bin/sh rsync2.sh
[root@rsync2 ~]# cat rsync2.sh
dir=/backup
date=`date +"%Y%m%d"`
backfile=$dir/www.$date.tar.gz
md5file=$dir/md5-$date.txt
#检查备份保存目录是否存在
checkdir(){
if [ ! -d $dir ]
then
mkdir /backup
fi
}
#打包备份网站程序目录
checkdir
tar -czf $backfile /var/www/html &>/dev/null
#生成md5校验码
md5sum $backfile >$md5file
#推送到服务器B上
rsync -avz $backfile $md5file [email protected]::backup --password-file=/etc/rsync.password &>/dev/null
#本地保留7天内的备份
find $dir -mtime +7 -exec rm -rf {} \; &>/dev/null
[root@rsync01 ~]# crontab -l
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
#每天0点5分检查网站程序目录备份是否异常
5 0 * * * source ./etc/profile;/bin/sh rsync1.sh
[root@rsync01 ~]# cat rsync1.sh
dir=/backup
date=`date +"%Y%m%d"`
backfile=$dir/www.$date.tar.gz
md5file=$dir/mymd5.txt
#生成md5校验码,检查备份结果是否正常
md5sum $backfile >$md5file
diff $md5file $dir/md5-$date.txt &>/dev/null
if [ $? -eq 0 ]
then
echo "经md5校验,$backfile备份正常 success"|mail -v -s "rsync备份报告$date" [email protected] &>/dev/null
else
echo "经md5校验,$backfile备份异常 fail"|mail -v -s "rsync备份报告$date" [email protected] &>/dev/null
fi
#清除临时文件
rm -rf $md5file
rm -rf $dir/md5-$date.txt
#备份保留180天
find $dir -mtime +180 -exec rm -rf {} \; &>/dev/null