Rsync一款开源的、一款支持快速彻底备份和增量备份的工具,支持本地复制,远程同步等,相似于 scp 命令,rsync 命令在同步文件以前要先登陆目标主机进行用户身份 认证,认证事后才能进行数据同步,身份认证方式取决于所使用的协议类型,rsync 通常使用两种协议进行数据同步:ssh 协议和 rsync 协议。php
rsync官网html
rsync 监听端口: 873
nginx
假设客户端上有 file1 file2 file3 文件,服务端上有 file1 文件,现要将客户端上的数据备份至服务端web
彻底备份方式:把客户端全部的数据file1 file2 file3所有备份至服务器(效率低,占用空间)shell
增量备份方式:把客户端的file2 file3增量备份至服务端(提升效率,节约空间)安全
[root@backup backup ~]# yum -y install rsync
代替复制命令cp
服务器
[root@backup tools]# ls install.txt # 把install.txt复制到/tmp 做用和CP命令同样 [root@backup tools]# rsync install.txt /tmp # 查看是否已经复制过去 [root@backup tools]# ll /tmp/install.txt -rw-r--r-- 1 root root 5556 Jul 4 01:45 /tmp/install.txt
代替删除命令rm
网络
## 假设在/tmp下面有100G的数据,如何将目录中的数据快速删除 # 1. 建立一个空目录 [root@backup ~]# mkdir /null # 2. 使用--delete参数无差别同步 [root@backup ~]# rsync -rp --delete /null/ /tmp # 确认数据是否被删除 [root@backup ~]# ll /tmp/ total 0
代替命令SCP
ssh
上传方式:工具
# 把本地文件install.txt上传到远程服务器192.168.1.7上 [root@backup tools]# rsync install.txt root@192.168.1.7:/root # 上传本地目录 [root@backup tools]# rsync -rp test root@192.168.1.7:/root -r 递归复制传输数据 -p 保持文件属性信息不变 # 备份目录后面有 / test/ : 只将目录下面的内容进行备份传输 # 备份目录后面没有/ test : 会将目录自己以及下面的内容进行传输备份
下载方式:
# 把远程服务器192.168.1.7/root/test 目录下载到当前目录下 [root@backup tools]# rsync -rp root@192.168.1.7:/root/test ./
SYNOPSIS # 概要 # 本地备份数据方式 Local: rsync [OPTION...] SRC... [DEST] 本地备份数据: src: 要备份的数据信息 dest: 备份到什么路径中 # 远程备份数据方式: Access via remote shell: Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] [USER@] --- 以什么用户身份拉取数据(默认以当前用户) hosts --- 指定远程主机IP地址或者主机名称 SRC --- 要拉取的数据信息 dest --- 保存到本地的路径信息 Push: rsync [OPTION...] SRC... [USER@]HOST:DEST SRC --- 本地要进行远程传输备份的数据 [USER@] --- 以什么用户身份推送数据(默认以当前用户) hosts --- 指定远程主机IP地址或者主机名称 dest --- 保存到远程的路径信息 # 守护进程备份数据方式 Access via rsync daemon: 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 # 选项参数 [OPTION...] -a #归档模式传输, 等于-tropgDl -v #详细模式输出, 打印速率, 文件数量等 -z #传输时进行压缩以提升效率 -r #递归传输目录及子目录,即目录下得全部目录都一样传输。 -t #保持文件时间信息 -o #保持文件属主信息 -p #保持文件权限 -g #保持文件属组信息 -l #保留软链接 -P #显示同步的过程及传输时的进度等信息 -D #保持设备文件信息 -L #保留软链接指向的目标文件 -e #使用的信道协议,指定替代 rsh 的 shell 程序 --exclude=PATTERN #指定排除不须要传输的文件 --exclude-from=file #指定排除file中包含的文件名 所在目录的文件 --bwlimit=100 #限速传输 100Mb/8=12.5MB --delete #让目标目录和源目录数据保持一致,实现数据无差别同步 # 例如 [root@backup ~]# rsync -avz /backup root@192.168.1.7::/back
[root@backup ~]# yum -y install rsync
[root@backup ~]# cat /etc/rsyncd.conf uid = www gid = www port = 873 fake super = yes use chroot = no max connections = 200 timeout = 600 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock 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.passwd log file = /var/log/rsync/rsyncd.log [web_backup] comment = "The backup data from web_server" path = /backup [db_backup] path = /db_backup ## 配置文件解释 uid = rsync --- 指定管理备份目录的用户 gid = rsync --- 指定管理备份目录的用户组 port = 873 --- 定义rsync备份服务的网络端口号 fake super = yes --- 将rsync虚拟用户假装成为一个超级管理员用户 use chroot = no --- 和安全相关的配置,禁锢推送的数据至某个目录, 不容许跳出该目录 max connections = 200 --- 最大链接数 同时只能有200个客户端链接到备份服务器 timeout = 300 --- 超时时间(单位秒) pid file = /var/run/rsyncd.pid --- 记录进程号码信息 1.让程序快速中止进程 2. 判断一个服务是否正在运行 lock file = /var/run/rsync.lock --- 锁文件 log file = /var/log/rsync/rsyncd.log --- rsync服务的日志文件 用于排错分析问题 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 --- 指定认证用户密码文件 用户名称:密码信息 [web_backup] ---模块信息 comment = "The backup data from web_server" --- 模块注释信息 path = /backup --- 备份路径 [db_backup] path = /db_backup
[root@backup ~]# useradd -M www -s /sbin/nologin [root@backup ~]# id www uid=1005(www) gid=1005(www) groups=1005(www) [root@backup ~]# mkdir /backup [root@backup ~]# chown -R www.www /backup
[root@backup ~]# echo "rsync_backup:123456" > /etc/rsync.passwd [root@backup ~]# chmod 600 /etc/rsync.passwd
[root@backup ~]# systemctl start rsyncd [root@backup ~]# systemctl enable rsyncd [root@backup ~]# netstat -tunlp |grep 73
[root@web01 ~]# yum -y install rsync
[root@web01 ~]# echo 123456> /etc/rsync.password
# 客户端要备份的数据/backup [root@web01 backup]# tree /backup web01_backup/ ├── a.txt ├── b.txt ├── c.txt ├── install.txt └── test ├── e.txt ├── f.txt ├── g.txt └── h.txt 5 directories, 4 files # --password-file 指定密码认证文件 [root@web01 backup]# rsync -avz /backup/ rsync_backup@172.16.1.41::web_backup --password-file=/etc/rsync.password # 在备份服务器查是否备份成功 [root@backup ~]# cd /web_backup/ [root@backup web_backup]# ll total 0 drwxr-xr-x 3 www www 76 Jul 4 03:26 web01_backup [root@backup web_backup]# tree web01_backup/ web01_backup/ ├── a.txt ├── b.txt ├── c.txt ├── install.txt └── test ├── e.txt ├── f.txt ├── g.txt └── h.txt 5 directories, 4 files # 两边数据同样,备份成功
[root@web01 backup]# rsync -avz rsync_backup@172.16.1.41::web_backup /backup --password-file=/etc/rsync.password # 把Rsync服务端的web_backup模块下的数据下载到本地/backup目录下
# 1. 客户端操做 [root@web01 backup]# cd /backup/web01_backup [root@web01 web01_backup]# ls a.txt b.txt c.txt install.txt test # 2. 把test目录移走 [root@web01 web01_backup]# mv test/ /tmp [root@web01 web01_backup]# ls a.txt b.txt c.txt install.txt # 3. 开始无差别同步 [root@web01 web01_backup]# rsync -avz --delete /backup/ rsync_backup@172.16.1.41::web_backup --password-file=/etc/rsync.password # 4. Rsync服务端查看数据是否存在差别 [root@backup backup]# cd /web_backup/web01_backup/ [root@backup web01_backup]# ls a.txt b.txt c.txt install.txt 说明: #1. 下载远端数据:远端与本地保持一致,远端没有本地有会被删除, 形成客户端数据丢失 #2. 上传数据至远端:本地与远端保持一致, 本地没有远端会被删除, 形成服务器端数据丢失
### 使用--exclude参数实现排除不想同步的文件 [root@backup web01_backup]# ls a.txt b.txt c.txt install.txt # 批量建立1到10,后缀名为.c的文件 [root@web01 web01_backup]# touch {1..5}.c [root@web01 web01_backup]# ls 1.c 2.c 3.c 4.c 5.c a.txt b.txt c.txt install.txt # 删除Rsync服务端之前的备份 [root@backup web01_backup]# rm -rf /web_backup/* # 备份数据时不要备份以1.c 2.c 5.c [root@web01 web01_backup]# [root@web01 web01_backup]# rsync -avz /backup/web01_backup --exclude=1.c --exclude=2.c --exclude=5.c rsync_backup@172.16.1.41::web_backup --password-file=/etc/rsync.password # Rsync服务端查看备份状况,没有备份排除掉的1.c 2.c 5.c [root@backup web_backup]# tree web01_backup/ web01_backup/ ├── 3.c ├── 4.c ├── a.txt ├── b.txt ├── c.txt └── install.txt 0 directories, 6 files # 使用--exclude参数排除文件时,每指定一个排除文件都要使用一个--exclude=xxx file,这样使得命令过长,很容易出错,若是要排除的文件多了,会带来很大的不便 ### 使用--exclude-from参数只须要编写一个排除文件,把要排除的文件名写入其中,就能够达到备份时排除多个文件的目的 # 1.客户端准备数据 [root@web01 backup]# tree web01_backup/ web01_backup/ ├── 1.c ├── 2.c ├── 3.c ├── 4.c ├── 5.c ├── a.txt ├── b.txt ├── c.txt ├── exclude.txt ├── hello ├── install.txt └── test ├── 11.php ├── 12.php ├── 13.php ├── 14.php └── 15.php # 2. 编写排除文件,注意后面不要有空格,备份的时候会把排除文件也备份,须要把排除文件名也加上 [root@web01 web01_backup]# cat /backup/web01_backup/exclude.txt 1.c 5.c c.txt test/14.php hello/ exclude.txt # 3. 开始备份 [root@web01 web01_backup]# rsync -avz /backup/web01_backup --exclude-from=exclude.txt rsync_backup@172.16.1.41::web_backup --password-file=/etc/rsync.password #4. 检查Rsync服务端数据 [root@backup web_backup]# tree web01_backup/ web01_backup/ ├── 2.c ├── 3.c ├── 4.c ├── a.txt ├── b.txt ├── install.txt └── test ├── 11.php ├── 12.php ├── 13.php └── 15.php
[root@web01 backup]# rsync -avz /backup/web01_backup rsync_backup@172.16.1.41::web_backup/172.16.1.7/ --password-file=/etc/rsync.password # 备份数据时会自动在Rsync服务端备份目录下自动建立172.16.1.7目录,不能建立多级目录 [root@backup web_backup]# ls 172.16.1.7 web01_backup
主要是/etc/rsyncd.conf配置文件中的两个参数
hosts allow = 172.16.1.0/24
容许备份的IP
hosts deny = 0.0.0.0/32
拒绝备份数据的IP
企业案例: 某 DBA 使用 rsync 拉取备份数据时,因为文件过大致使内部交换机带宽被沾满,致使用户的请求没法响应 rsync -avz --bwlimit=100 rsync_backup@172.16.1.41::backup /web_backup
备份环境:备份服务器backup、 3台web服务器web01 web02 web03
一、天天凌晨2点服务器本地打包备份
/etc/fstab
、/etc/passwd
、/etc/rc.local
、/etc/sysconfig/iptables
/server/scripts
/html/www
/var/log/messages
、/var/log/secure
、web访问日志目录/var/log/nginx
二、 打包备份的文件必须保存在/backup目录下,以主机名+IP地址+备份日期
命令的目录中,如:web01_172.16.1.7_2020-6-28
三、 本地只保留打包后的最近7天数据,避免磁盘资源浪费
一、 备份目录必须为/backup
二、 须要天天校验客户端推送过来的数据是否完整
三、 将天天校验的结果以163邮件发送给管理员,便于及时发现问题
四、 服务端只保留一年的数据,其余的所有删除
hostname:
主机名称
hostname -i :
IP地址
date +%F :
日期
一、 编写客户端脚本
[root@web01 scripts]# cat /server/scripts/01-rsync_push.sh #!/bin/sh # author: Zachariah # desc: Push local data to Rsync_server export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin backup_dir=/backup/$(hostname)_$(hostname -i)_$(date +%F) passwd_file=/etc/rsync.password # 1. 建立本地备份目录 mkdir -p ${backup_dir} # 2. 压缩数据 cd / if [ $?==0 ];then tar -chf ${backup_dir}/system_file.tar.gz \ etc/fstab etc/passwd etc/rc.local etc/sysconfig/iptables fi if [ $?==0 ];then tar -chf ${backup_dir}/log.tar.gz \ var/log/messages var/log/secure var/log/nginx fi if [ $?==0 ];then tar -chf ${backup_dir}/scripts.tar.gz \ server/scripts fi if [ $?==0 ];then tar -chf ${backup_dir}/site_dir.tar.gz \ html/www fi # 3. 生成md5验证文件 if [ $?==0 ];then md5sum ${backup_dir}/*.tar.gz > ${backup_dir}/md5.txt fi # 4. 推送本地备份好的数据到备份服务器 rsync -az ${backup_dir} rsync_backup@172.16.1.41::web_backup \ --password-file=${passwd_file} # 5. 删除7天之前的压缩文件 if [ $?==0 ];then find ${backup_dir}/ -mtime +7 |xargs rm -rf fi
二、 编写定时任务,天天2:00自动打包上传
[root@web01 scripts]# crontab -e # push local achive date to rsync_server 00 02 * * * /bin/sh /server/scripts/01-rsync_push.sh > /dev/null 2>&1
1.服务端部署 rsync,用于接收客户端推送过来的备份数据,备份目录/web_backup
2.服务端须要天天校验客户端推送过来的数据是否完整
3.服务端须要天天校验的结果通知给管理员
4.服务端仅保留 6 个月的备份数据,其他的所有删除
1.编写邮件配置
[root@backup scripts]# yum -y install postfix [root@backup scripts]# cat /etc/mail.rc set from=zachariah9426@163.com set smtp=smtp.163.com set smtp-auth-user=zachariah9426@163.com set smtp-auth-password=xxxxxx set smtp-auth=login
重启邮件服务: systemctl restart postfix.service
2.编写服务端脚本
#!/bin/sh # check rsync data by client backup path=/backup mail_addr=zachariah9426@163.com # 1. creat rsync check file find ${path}/*_$(date +%F)/ -type f -name "md5.txt" |xargs \ md5sum -c > ${path}/$(date +%F)_checkResult.txt # 2. send mail to admin if [ $?==0 ];then mail -s "$(date +%F)_RsyncCheckResult" ${mail_addr} < \ ${path}/$(date +%F)_checkResult.txt fi # find data from 6 months ago and delete it # find data from 7 day ago and delete it find ${path}/ -type f -mtime +7 |xargs rm -rf find ${path}/ -type d -mtime +180 |xargs rm -rf