Rsync

作者: 1220 | 来源:发表于2019-04-17 01:35 被阅读0次

rsync 复制软件应用与实现

1、rsync是什么?

英文全称Remote synchronization 

开源,高速的,数据复制(拷贝)工具

2、rsync的作用?

工作中需要定时、实时数据备份,本地服务器目录,可能是不同的机器、机房之间的数据备份,用rsync完成。

3、rsync功能特性? 七个特性

image

4、全量和增量的区别

全量:全部备份

增量:差异化备份,最近增加的内容进行备份=====》效率高

5、rsync复制原理:

image.png

6、rsync三种工作模式

第一种模式:命令

rsync语法:


image

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 ~]#
image
删除目录
[root@backup ~]# mkdir /null
[root@backup ~]# rsync -r --delete /null/ /opt/

[root@backup ~]# ls /opt/
[root@backup ~]#
image
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 全网备份主机信息表
服务器说明


image.png

 备份要求

每天晚上 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 服务器备份信息汇总表


image.png

2.1.4项目逻辑架构

image.png

解决:
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 《=====在最后一行添加如下内容 看不懂的上面有解释


image.png

配置完成后执行一下 使它生效 然后执行脚本

操作过程如下

[root@backup /server/scripts]# . /etc/mail.rc 
[root@backup /server/scripts]# sh a.sh 
[root@backup /server/scripts]#               《=====什么都不提示就是对的

image.png

#######

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
image.png image.png

ok,也可以把mail写到脚本里,看自己吧

当脚本执行正确后再放入定时任务中
定时任务:

[root@web01 /server/scripts]# crontab -e
添加
######back.....
00 00 * * * /bin/sh /server/scripts/bak.sh >/dev/null 2>&1

相关文章

网友评论

      本文标题:Rsync

      本文链接:https://www.haomeiwen.com/subject/uosiwqtx.html