Linux架构02 rsync服务, 三种传输方式, 常见错误, rsync参数, Rsync备份案例, md5sum校验文件, inotify监控

Rsync服务

一、备份

复制代码
1.什么是备份?
备份就是把重要的数据或文件再次复制一份保存起来(给源文件增加一个副本)
2.为什么要备份?
数据很重要!!!
出现故障之后,需要恢复数据(软件服务出现问题几率很小,80%都是人为故障)
3.能不能不做备份
对于不重要的数据,可以不做备份
对于不必要的数据可以选择定时清理
4.备份常用工具
本地复制   cp
远程传输   scp   rsync
复制代码

二、rsync服务概念

复制代码
1.rsync简介
rsync英文成为remote synchronization,从软件的名称就可以看出来,rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像、
远程备份的功能,这个功能类似ssh带的scp命令,但是又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷贝。当然,rsync
还可以在本地主机的不同分区或目录之间全量及增量的复制数据,这有类似cp命令。但是同样也优于cp命令,cp每次都是全量靠别,而rsync
可以增量拷贝。
在同步数据的时候,默认情况下,rsync通过其独特的"quick check"算法,它仅同步大小或者最后修改时间发生变化的文件或目录,当然也可根据
权限、属主等属性的变化同步,但是需要指定响应的参数,甚至可以实现只同步一个文件里有变化的内容部分,所以,可以实现快速的同步备份数据

rsync简称远程同步,可以实现不同主机之间的同步,同时支持增量和全量的备份
不同主机:windows --> linux    linux --> linux   mac  --> linux     mac --> windows
rsync监听的端口:873
rsync运行模式:C/S模式    client/server

2.rsync特性
支持拷贝特殊文件,如连接文件、设备等
可以排除指定文件或目录同步的功能,相当于打包命令tar的排除功能
可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变 -p
可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高(tar-N)
可以使用rcp、rsh、ssh等方式来配合传输文件(rsync本身不对数据加密)
可以通过socket(进程方式)传输文件和数据(服务端和客户端)******
支持匿名的活认证(无需系统用户)的进程模式传输,可以实现方便安全的进行数据备份和镜像

3.生产场景备份方案
1.借助cron+rsync把所有客户服务器数据同步到备份服务器
2.针对公司重要数据备份混乱状况和领导提出备份全网数据的解决方案
3.通过本地打包备份,然后rsync结合inotify应用把全网数据统一备份到一个固定存储服务器,然后在存储服务器上通过脚本监查并报警管理员备份结果
4.定期将IDC机房的数据,备份公司的内部服务器,防止机房地震及火灾问题导致数据丢失
5.实时同步,解决存储服务器等的单点问题

4.rsync如何实现备份(备份方式)
1)全备:将数据完全的备份下来
2)增备:全备之后,把发生变化数据再备份一次
复制代码

三、rsync应用场景

1.rsync的传输方式:pull拉  push推
推:
客户端将需要的数据上传到服务端
拉:
客户端将需要的数据下载下来

2.传输存在的问题
推:
如果推送的客户端机器过多,容易造成推送数据缓慢
拉:
如果客户端过多,下载数据会对服务端造成压力过大

3.rsync多server端
例:现在有20台机器,怎么有效快速的缓解推送和拉取的速度和压力问题


4.异地备份场景

 

四、Rsync传输模式*

传输模式:
本地方式
远程方式
守护方式

 

1.本地方式(类似cp,不支持推送和拉取,只是单纯复制)

复制代码
# 本地传输语法
    命令    参数、选项    源文件    目标文件
Local:    rsync    [OPTION...]    SRC...    [DEST]
# 语法实例
[root@web01 ~]# rsync -avz 1.txt /mnt/
# 语法拆分
rsync    # 备份命令
-avz    # 参数、选项
./1.txt    # 源文件
/mnt/    # 目标位置

类似于cp,但是cp是全量复制,每次都显示覆盖,rsync是增量,只要文件没有变化就不会再传输,如果有任意改变就传输
复制代码

2.远程传输方式(类似scp)

复制代码
# pull拉取数据命令语法
Pull:    rsync    [OPTION...]    [USER@]HOST:SRC...    [DEST]
# pull拉取数据命令语法实例
web02到web01拉取文件
rsync -avz root@172.16.1.7:/root/1.txt ./    # 从172.16.1.7上拉取1.txt到当前目录下
# pull拉取数据命令语法拆分
rsync    # 命令
-avz    # 参数
root    # 远端服务器用户
@    # 分隔符
172.16.1.7:    # 远端服务器主机IP
/root/1.txt    # 源地址文件
./        # 目标地址

注意:
[root@web02 ~]# rsync -avz root@172.16.1.7:/var/log/ ./    # 拉取远程目录下的文件
[root@web02 ~]# rsync -avz root@172.16.1.7:/var/log ./    # 拉取远程目录下的文件及目录

# push推送数据命令语法
Push: rsync    [OPTION...]    SRC...    [USER@]HOST:DEST
# push推送数据命令语法示例
web02推送文件至web01
[root@web02 ~]# rsync -avz ./log/ root@172.16.1.7:/mnt/    # 推送目录下的文件到远端位置
[root@web02 ~]# rsync -avz ./log root@172.16.1.7:/mnt/    # 推送目录及目录下的文件到远端
# push推送数据命令语法拆分
rsync    # 命令
-avz    # 参数
./log    # 本地文件或目录
root    # 远端服务器用户
172.16.1.7:    # 远端主机ip
/mnt/    # 远端服务器位置
复制代码

3.守护进程传输模式

复制代码
1)为什么要用守护进程模式
1.rsync传输时,使用系统用户和系统密码(极其不安全)
2.使用普通用户的时候,会出现权限不足的情况
2)守护进程传输模式语法
# pull拉取数据命令
Pull:    rsync    [OPTION...]    [USER@]HOST::SRC...    [DEST]    # USER可以不加,SRC模块名(如果是一个:SRC就是目录,USER就是真实用户),DEST目标地址
# pull拉取数据命令示例
# 客户端web01拉取backup服务器的数据
[root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::backup ./
[root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::backup/ ./    # backup/相当于在模块的路径结尾加上/
rsync    # 命令
-avz    # 参数
rsync_backup    # 虚拟用户
@    # 分隔符
172.16.1.41    # 远端主机
::backup    # 模块名
./    # 当前位置

注意:
拉取服务器模块名对应的目录下的文件,拉取的文件可以使任意属主属组

# push推送数据命令语法
Push:    rsync    [OPTION...]    SRC...    [USER@]HOST::DEST
# 客户端web01推送数据
[root@web01 ~]# rsync -avz backup/ rsync_backup@172.16.1.41::backup
rsync    # 命令
-avz    # 参数
backup/    # 本地文件
rsync_backup    # 虚拟用户
@    # 分隔符
172.16.1.41    # 远端主机
::backup    # 模块名

注意:
推送时,远端模块对应的目录权限一定是rsyncd服务配置的用户
复制代码

4.守护进程模式实践

复制代码
1)环境准备
主机角色        外网ip        内网ip        主机名
Rsync服务端    10.0.0.41        172.16.1.41    backup
Rsync客户端    10.0.0.7        172.16.1.7    web01
2)安装rsync(客户端和服务端都要操作)
yum install -y rsync

以下都在backup服务器上操作
3)配置rsync(服务端)*
rpm -qc rsync    # 查看配置文件路径
# 修改配置文件
vim /etc/rsyncd.conf
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
############################
[backup]
comment = welcome to oldboyedu backup!
path = /backup

# 如果有多个就在下面继续配置如[data],用户名密码不同,就卸载[..]模块内
# 配置文件注释 # 运行进程的用户 uid = rsync # 运行进程的用户组 gid = rsync # 服务的监听端口 port = 873 # 无需让rsync以root身份运行,保证文件属性的安全机制 fake super = yes # 操作那个目录就不允许跳出该目录 use chroot = no # 最大连接数 max connections = 200 # 超时时间(单位秒) timeout = 600 # 忽略错误信息 ignore errors # 只读,配置成false,文件可读写(针对配置的path) read only = false # 查看模块信息 list = false # 定义虚拟用户(rsync传输时使用的用户)(不是真实存在,不需要创建) auth users = rsync_backup # 定义虚拟用户的密码文件 secrets file = /etc/rsync.passwd # 日志文件 log file = /var/log/rsyncd.log ############################ # 定义模块的名字 [backup] # 注释,备注(没什么用,可以删) comment = welcome to oldboyedu backup! # 定义真实文件目录 path = /backup 4)创建系统用户 # 根据配置文件中运行进程的用户创建 useradd rsync -s /sbin/nologin -M # 不需要登录,不需要家目录(可以直接useradd rsync, 但这样更好) 5)创建虚拟用户的密码文件并授权 echo "rsync_backup:123456" > /etc/rsync.passwd # 用户名为设定的虚拟用户,密码为123456 # 建议echo写入,vim写入可能多写空格,也被识别 chmod 600 /etc/rsync.passwd # 只要和密码相关设置为600 6)创建文件目录 mkdir /backup chown -R rsync.rsync /backup/ # 文件目录授权(如不改,可以拉,但不能推,因为rsync无法对root权限文件夹操作) 7)启动服务 systemctl start rsyncd # 查看服务有没有起来(看873端口) netstat -lntp tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 15057/rsync 服务端设置完成! 8)客户端验证 方式一:输入密码的方式 [root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::backup ./ [root@web01 ~]# rsync -avz backup/ rsync_backup@172.16.1.41::backup 方式二:指定密码文件的方式 客户端添加密码文件 echo "123456" > /etc/rsync.passwd # 密码文件的名字随便定 chmod 600 /etc/rsync.passwd rsync -avz rsync_backup@172.16.1.41::backup ./ --password-file=/etc/rsync.passwd rsync -avz backup/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd 方式三:配置环境变量的方式 客户端添加 export RSYNC_PASSWORD=123456 (这样设置是临时的,服务器重启就没了) rsync -avz rsync_backup@172.16.1.41::backup ./ rsync -avz backup/ rsync_backup@172.16.1.41::backup
复制代码
9)rsync常见报错
# 1.报错内容:# 原因:模块名配置错误

1

# 2.报错内容:# 原因:
1.服务端密码文件不存在(名字写错了/没有创建/配置文件错了)
2.密码文件权限不是600(属主可以6或7,其他用户不能有权限)
3.服务端密码文件用户或密码错误
4.客户端密码输入错误或密码文件内容与服务端不一致

2

# 3.报错内容:# 原因:服务端防火墙开启

3

# 4.报错内容:
rsync -avz rsync_backup@172.16.1.41::/backup ./backup
# 原因:“::”守护进程模式双冒号后面为模块名,不能使用目录

4

# 5.报错内容:
rsync -avz ./backup rsync_backup@172.16.1.41::/backup
如图
# 原因:服务端推送文件的目录权限不足

5

# 6.报错内容:
如图
# 原因:服务端rsyncd服务没有启动

6

# 7.报错内容:
如图
# 原因:服务端模块对应的目录不存在

7

# 8.报错内容:
如图
# 原因:selinux没有关闭

8

 

5.rsync命令选项/参数

复制代码
-a    # 归档模式传输,等于-tropgDl        -t -r -o -p -g -D -l
-v    # 详细模式输出,打印速率,文件数量等(写脚本一般不加)
-z    # 传输时进行压缩以提高效率
-r    # 归档传输目录及子目录,即目录下的所有目录都同样传输
-t    # 保持文件时间信息
-o    # 保持文件属主信息
-p    # 保持文件权限
-g    # 保持文件属主信息
-l    # 保留软链接
-P    # 显示同步的过程及传输时的进度等信息
-D    # 保持设备文件信息
-L    # 保留软链接指向的目标文件
-e    # 使用的信道协议,指定替代rsh的shell程序
--exclude=PATTERN    # 指定排除不需要传输的文件模式
--exclude-from=file        # 文件名所在的目录文件
--bwlimit=100        # 限速传输
--partial            # 断点续传(不如使用xftp,一般不用rsync做断点续传)
--delete            # 让目标目录和源目录数据保持一致
--passwrod-file=xxx    # 使用密码文件
复制代码
复制代码
1)排除参数 --exclude --exclude-from
#  推送当前目录下除了dir10以外的所有文件
rsync -avz ./* rsync_backup@172.16.1.41::back --exclude=dir10

# 排除文件里指定的文件
rsync -avz ./* rsync_backup@172.16.1.41::back --exclude-from 1.txt
# 文件内容
[root@web01 ~]# cat 1.txt
dir 10
dir 6

2) 限速参数 --bwlimit=100(默认单位为KB)    # 测试下该参数无法限制(一般网络工程师限制网速,这个不用自己限制)
# 创建一个500M文件
[root@web01 ~]# dd if=/dev/zero of=./1.txt bs=1M count=500

# 指定速度每秒1M
rsync -avzP ./1.txt rsync_backup@172.16.1.41::back --bwlimit=1024    # 注意如果bwlimit如果写1,会按照1M的速度,其他数字都按kb计算
sending incremental file list
1.txt
    123,812,60    24%    1.01MB/s        0:06:25

3) 数据一致--delete(无差异同步)
拉:数据与服务端一致,以服务端的数据为准
推:数据与客户端一致,以客户端的数据为准

数据始终与数据来源的一端保持一致
mkdir file{1..6}    # 创建file1-6
推:rsync -avz ./ rsync_backup@172.16.1.41::backup --delete

拉:rsync -avz rsync_backup@172.16.1.41::backup ./ --delete
复制代码

 

五、Rsync备份案例

1.准备服务器

主机名  | 外网IP      | 内网IP
web01  | 10.0.0.7    | 172.16.1.7
backup |  10.0.0.41 | 172.16.1.41

复制代码
需求:
客户端:
1.客户端提前准备存放的备份的目录,目录规则如下:/backup/nfs_172.16.1.31_2018-09-02
2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至/backup/nfs_172.16.1.31_2018-09-02
3.客户端最后将备份的数据进行推送至备份服务器
4.客户端每天凌晨1点定时执行该脚本
5.客户端服务器本地保存最近7天的数据,避免浪费磁盘空间

服务端需求:
1.服务端部署rsync,用于接收客户端推送过来的备份数据
2.服务端需要每天校验客户端推送过来的数据是否完整
3.服务端需要每天校验的结果通知管理员
4.服务端仅保留6个月的备份数据,其余的全部删除
复制代码

2.客户端

复制代码
1)创建备份目录
mkdir /backup/`hostname`_`hostname -I | awk '{print $2}'`_`date +%F` -p

2)打包文件并放到指定目录下
tar zcf /backup/`hostname`_`hostname -I | awk '{print $2}'`_`date +%F`/file.tar.gz /etc/passwd

3)推送文件
rsync -avz /backup/web01_172.16.1.17_2020-02-13 rsync_backup@172.16.1.41::backup

4) 写成脚本并优化
mkdir /scripts    # 把脚本统一放在一个文件夹下
vim /scripts/client.sh    
---------------------------------
#!/bin/bash
#1.定义变量
SRC=/backup
HOST=`hostname`
IP=$(hostname -I | awk '{print $2}')
DATE=$(date +%F)
DEST=${HOST}_${IP}_${DATE}

#2.创建目录
mkdir $SRC/$DEST -p

#3.备份文件
cd / && tar zcf $SRC/$DEST/file.tar.gz /etc/passwd    # 先cd在打包,不会出现删根的报错

#4.推送文件
export RSYNC_PASSWORD=123456    # 配环境变量,就不用输入密码。也可以rsync命令指定密码文件
rsync -az $SRC/$DEST rsync_backup@172.16.1.41::backup

---------------------------------

添加定时任务
00 01 * * * /bin/bash /scripts/client.sh

5)保留7天的数据
# 模拟创建一个月的数据
for i in {1..30};do date -s 2020/12/$i;sh /scripts/client.sh;done

# 删除七天前的数据
find /backup/ -type d -mtime +7 | xargs rm -rf

6) 客户端脚本完善
---------------------------------------------
#!/bin/bash
#1.定义变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
SRC=/backup HOST=`hostname` IP=$(hostname -I | awk '{print $2}') DATE=$(date +%F) DEST=${HOST}_${IP}_${DATE} #2.创建目录 mkdir $SRC/$DEST -p #3.备份文件 cd / && tar zcf $SRC/$DEST/file.tar.gz /etc/passwd #4.给文件添加验证信息 md5sum $SRC/$DEST/file.tar.gz > $SRC/$DEST/flag_$DATE #5.推送文件 export RSYNC_PASSWORD=123456 rsync -az $SRC/$DEST rsync_backup@172.16.1.41::backup #6.只保留七天的数据 find $SRC -type d -mtime +7 | xargs rm -rf ---------------------------------------------
复制代码

 

md5sum命令

只能对文件进行验证,不能对文件夹使用
# 对1.txt生成验证码
md5sum 1.txt
# 对1.txt进行验证,校验用md5sum -c
md5sum 1.txt > 2.txt
md5sum -c 2.txt

 

3.服务端

复制代码
1) 服务端需要每天校验客户端推送过来的数据是否完整
[root@backup web01_172.16.1.7_2020-02-01]# md5sum -c /backup/web01_172.16.1.1_2020-02-01/flag.txt
2) 服务端需要每天校验的结果通知管理员
yum install -y mailx    # 安装邮件服务
配置邮件服务

3) 服务端脚本
mkdir /scripts/
vim /scripts/server.sh
-------------------------------------
#!/bin/bash
#1.定义变量
SRC=/backup
DATE=$(date +%F)

#2.验证文件的完整性
md5sum -c $SRC/*_$DATE/flag_$DATE > $SRC/result_$DATE
# find /backup/ -type f -name "flag.txt" | xargs md5sum -c > $SRC/result_$DATE      # 这种写法也行

#3.将验证结果发送给管理员
mail -s "数据验证结果" 1240206455@qq.com < $SRC/result_$DATE

# 2和3可以合并成下面一句命令
# md5sum -c $SRC/*_$DATE/flag_$DATE | mail -s "$DATE的备份结果" 1240206455@qq.com
#4.只保留180天的数据 find $SRC -type d -mtime +180 | xargs rm -rf -------------------------------------
复制代码

 

六、Rsync结合inotify实现实时同步

复制代码
1.安装inotify
yum install -y inotify-tools

2.命令测试
                          事件 目录 文件    创建   属性      删除   属性              修改文件的内容
inotifywait -mrq --format '%Xe %w %f' -e create,modify,delete,attrib,close_write /backup/
# 在/backup/下创建,修改,删除都会被监控到

3. 参数详解
-m    持续监控
-r    递归
-q    静默,仅打印时间信息
--timefmt    指定输出时间格式
--format    指定事件输出格式
    %Xe  事件
    %w   目录
    %f    文件
-e    指定监控的事件
    access  访问
    modify 内容修改
    attrib    属性修改
    close_write  修改正式文件内容
    open    打开
    create   创建
    delete   删除
    umount  卸载

4. 实时监控同步数据的脚本
1) 粗糙版
vim rsync-inotify.sh
------------------------------------
#!/bin/bash
dir=/backup
/usr/bin/inotifywait -mrq --format '%w %f' -e create,delete,attrib,close_write $dir | while read line;do
cd $dir && rsync -az -R --delete . rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password >/dev/null 2>&1
done &    # &表示后台运行

------------------------------------
复制代码

 

posted @   战斗小人  阅读(1002)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示