1.Rsync服务

第一章 rsync介绍

作⽤:

Rsync是⼀款开源的传输⼯具,可以⽤于不同主机之间同步传输数据,可以实现全量备份与增量备份

运⾏端⼝:

rsync默认运⾏端⼝:873

⼯作模式:

rsync有三种⼯作模式:
1.本地模式:类似于cp命令,不常⽤
2.远程模式:常⽤,在不同的主机之间传输数据
3.后台服务模式:常⽤,⽤于实时同步数据,安全性较好

第二章 备份⽅式介绍

1.备份的⽅式

从备份的⽅式来说,共有两种备份:
1.全量备份:将客户端所有的数据内容全部备份至服务端(效率低下,占用空间)
2.增量备份:将客户端的增量备份至服务端(提高备份效率,节省空间,适合异地备份)

2.备份的架构

rsync-备份架构-0423.png

第三章 rsync本地模式和远程模式

1.命令说明 (1V4)

安装命令:

yum install rsync -y

命令格式:

Usage:
#本地模式
rsync [OPTION]... SRC [SRC]... DEST
1)本地备份:
src: 要备份的数据信息
dest:备份到什么路径中

#远程服务模式,推送的⽅式,将⾃⼰的数据发送到远程服务器
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST

#远程服务模式,拉取的⽅式,从远程服务器拉取数据
rsync [OPTION]... [USER@]HOST:SRC [DEST]
rsync [OPTION]... [USER@]HOST::SRC [DEST]

2.本地模式

a. 本地备份数据(cp)

[root@nf01 backup]# cp /etc/host /tmp
[root@nf01 backup]# ll /tmp/host
-rw-r--r-- 1 root root 371 May 6 16:11 /tmp/hosts
[root@nf01 backup]# rsync /etc/host /tmp/host_rsync
[root@nf01 backup]# ll /tmp/host_rsync
-rw-r--r-- 1 root root 371 May 6 16:12 /tmp/host_rsync

b. 远程备份数据

说明:scp命令它是全量模式备份
01.命令语法格式说明:

2)远程备份数据:(#最好是以root身份进行远程传输,因为有关权限要求)
Access via remote shell:
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
[USER@]     --- 以什么用户身份拉取数据(默认以当前用户)
HOST        --- 指定远程主机ip地址或者主机名称
SRC         --- 要拉取的数据信息
dest        --- 保存到本地的路径信息 

Push: rsync [OPTION...] SRC:... [USER@]HOST:DEST
SRC         --- 本地要进行远程传输备份的数据
[USER@]     --- 以什么用户身份推送数据(默认以当前用户)
HOST        --- 指定远程主机ip地址或者主机名称
dest        --- 保存到远程的路径信息 

实例演示如下:
1.从存储服务器主机上的/etc/hosts文件拉取到本地的/backup目录下(默认为root用户)

[root@nf01 ~]# rsync -rp /etc/hosts 10.0.0.41:/backup/hosts_rsync
root@10.0.0.41's password:

2.如以oldboy的身份从存储服务器主机上的/etc/hosts文件拉取到本地的/backup目录下

[root@backup ~]# rsync -rp oldboy@nfs01:/etc/hosts /backup
oldboy@nf101's password:
[root@backup ~]# ll /backup/
-rw-r--r-- 1 root root 434 Jan 25 00:01 hosts
#若以olddog的身份从存储服务器主机上的/etc/hosts文件拉取到本地的/backup目录下,会报错
[root@backup ~]# rsync -rp olddog@10.0.0.31:/etc/hosts /backup
###
#说明:首先备份服务器上要有olddog用户,存储服务器上也要相应的olddog用户,其次还得要有权限(属主属组)
[root@backup ~]# ll /backup/
-rw-r--r-- 1 olddog olddog 434 Jan 25 00:01 hosts

3.需求把存储服务器里的/etc/hosts文件备份到备份服务器指定的目录下

[root@nf01 ~]# scp -rp /etc/hosts root@10.0.0.41:/backup
root@10.0.0.41's password:
hosts       100%    371  42.8KB/s 00:00
-r  --- 递归复制传输数据
-p  --- 保持文件属性信息不变
[root@nf01 ~]# rsync -rp /etc/hosts root@10.0.0.41:/backup/hosts_rsync
root@10.0.0.41's password:
##说明以上备份的都是文件

02.rsync远程备份目录--(rsync命令它是增量模式备份:如果执行命令多次,它会进行比较看是否已有)

[root@nf01 ~]# rsync -rp /oldboy root@10.0.0.41:/backup (备份的目录后面没有'/')
root@10.0.0.41's password:
[root@backup ~]# ll /backup
total 0
drwxr-xr-x 2 root root 48 May 6 16:22 oldboy
[root@backup ~]# tree /backup/
/backup/
|--oldboy
   |-- oldboy01.txt
   |-- oldboy02.txt
   |-- oldboy03.txt

[root@nf01 ~]# rsync -rp /oldboy/ root@10.0.0.41:/backup  (备份的目录后面有'/')
root@10.0.0.41's password:
[root@backup ~]# ll /backup
total 0
-rw-r--r-- 1 root root   0 Dec 18 17:17 oldboy01.txt
-rw-r--r-- 1 root root   0 Dec 18 17:17 oldboy02.txt
-rw-r--r-- 1 root root   0 Dec 18 17:17 oldboy03.txt

03.总结:在使用rsync备份目录时

备份目录后面有 / -- /oldboy/:只将目录下的内容进行备份传输
备份目录后面没有/ -- /oldboy: 会将目录本身及下面的内容进行传输备份

c.替代删除命令(rm)

[root@nf01 ~]# mkdir /unll
[root@nf01 ~]# ll /null/
total 0
[root@nf01 ~]#  rsync -rp --delete /null 10.0.0.41:/backup
root@10.0.0.41's password:
--delete  实现无差异同步数据
#说明: 
无差异指的是我这个'null'目录没有数据,那么你/backup/目录下也就没有,用--delete就实现这个目的,
也会把你/backup/目录中跟我不一样的文件也会一并删除,这就叫无差异同步
面试题目:有一个存储数据信息的目录,目录中数据存储了50G数据,如何将目录中的数据快速删除: rm /目录/* -rf 
使用rm命令删除小文件可以,但删除大文件效率极低,因为它要从磁盘读取数据;故删除大文件时则用rsync命令效率高

d.替代查看文件命令(ls)

[root@backup ~]# ls /etc/hosts
/etc/hosts
[root@backup ~]# rsync /etc/hosts
-rw-r--r--           371 2019/08/08  12:12:12 hosts

3.远程模式

#PUSH 推送模式
rsync -avz bakup41.txt 10.0.0.7:/root/
#PULL 拉取模式
rsync -avz 10.0.0.7:/root/web.txt /opt/web-41.txt
#传输目录注意
rsync -avz dir1 10.0.0.7:/root/     #传输整个目录,包含目录本身
rsync -avz dir1/ 10.0.0.7:/root/    #只传输目录下的文件,不包含目录本身
#不同主机之间同步数据
rsync -avz /root/html/ 10.0.0.41:/backup/web-7/
rsync -avz --delete /root/html/ 10.0.0.41:/backup/web-7/

#坑:如果/和一个空目录进行完全同步,那么效果和删根一样
rsync -avz --delete 10.0.0.41:/backup/web-7/ /
#坑:传输过程不限速导致带宽被占满
dd if=/dev/zero of=/root/5G.txt bs=100M count=50
rsync -avzP --bwlimit=50 5G.txt 10.0.0.7:/opt/

第四章 rsync服务模式-服务端配置

1.为什么需要服务模式

Rsync借助SSH 协议同步数据存在的缺陷:
1.使用系统用户(不安全)
2.使用普通用户(会导致权限不足情况)
3.守护进程传输方式:rsync自身非常重要的功能(不使用系统用户,更加安全)

2.rsync服务端部署

1) 安装rsync

yum install rsync -y

2) 修改配置文件

cat > /etc/rsyncd.conf << 'EOF'
uid = www 
gid = www 
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]
path = /data
EOF

3) 配置文件解释

uid = www                   # 运行进程的用户
gid = www                   # 运行进程的用户组
port = 873                  # 监听端口
fake super = yes            # 无需让 rsync 以 root 身份运行,允许接收文件的完整属性
use chroot = no             # 禁锢推送的数据至某个目录, 不允许跳出该目录
max connections = 200       # 最大连接数
timeout = 600               # 超时时间
ignore errors               # 忽略错误信息
read only = false           # 对备份数据可读写
list = false                # 不允许查看模块信息
auth users = rsync_backup          # 定义虚拟用户,作为连接认证用户
secrets file = /etc/rsync.passwd   # 定义 rsync 服务用户连接认证密码文件路径

[backup]                    # 定义模块信息
comment = commit            # 模块注释信息
path = /backup              # 定义接收备份数据目录

4) 创建用户以及数据目录

[root@backup-41 ~]# useradd -u 1000 -M -s /sbin/nologin www
[root@backup-41 ~]# id www
uid=1000(www) gid=1000(www) groups=1000(www)
[root@backup-41 ~]# mkdir /data
[root@backup-41 ~]# mkdir /backup
[root@backup-41 ~]# chown -R www:www /data/
[root@backup-41 ~]# chown -R www:www /backup/

5) 创建虚拟用户密码文件并授权

[root@backup-41 ~]# cat /etc/rsync.passwd
rsync_backup:oldboy
[root@backup-41 ~]# chmod 600 /etc/rsync.passwd 
[root@backup-41 ~]# ll /etc/rsync.passwd 
-rw------- 1 root root 20 Apr 20 10:54 /etc/rsync.passwd

5) 加入开机自启动

[root@backup-41 ~]# systemctl start rsyncd

6) 检查服务是否运行

[root@backup-41 ~]# ps -ef|grep [r]sync
root      12312      1  0 10:58 ?        00:00:00 /usr/bin/rsync --daemon --no-detach
[root@backup-41 ~]# netstat -lntup|grep 873
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      12312/rsync         
tcp6       0      0 :::873                  :::*                    LISTEN      12312/rsync 

第五章 rsync服务模式-客户端配置

1) 安装rsync

[root@web-7 ~]# yum install rsync -y

2) 配置密码文件及授权

方法1:将密码写入文件

[root@web-7 ~]# echo "oldboy" > /etc/rsync.pass
[root@web-7 ~]# chmod 600 /etc/rsync.pass
[root@web-7 ~]# cat /etc/rsync.pass 
oldboy
[root@web-7 ~]# ll /etc/rsync.pass 
-rw------- 1 root root 7 Apr 20 11:16 /etc/rsync.pass
[root@web-7 ~]# rsync -avz --password-file=/etc/rsync.pass /root/web-7.txt rsync_backup@10.0.0.41::backup
[root@web-7 ~]# rsync -avz --password-file=/etc/rsync.pass /root/web-7.txt rsync_backup@10.0.0.41::data

方法2:使用环境变量-推荐

[root@web-7 ~]# export RSYNC_PASSWORD=oldboy
[root@web-7 ~]# rsync -avz /root/web-7.txt rsync_backup@10.0.0.41::backup
[root@web-7 ~]# rsync -avz /root/web-7.txt rsync_backup@10.0.0.41::data

疑问??

问题1:配置文件运行用户是www,为什么进程里是root

[root@backup-41 ~]# ps -ef|grep [r]sync
root      12312      1  0 10:58 ?        00:00:00 /usr/bin/rsync --daemon --no-detach
原因:
因为www进程是工作进程,只有出现任务的时候才会被创建启动

问题2:发送主机的文件是root用户的,为什么接收过来显示是www用户

原因:
配置文件里控制,无论客户端的文件是什么用户,接收文件时都强制转换成www用户

第六章 rsync排错指南

1.报错1

[root@backup-41 ~]# rsync -avz bakup41.txt 10.0.0.7:/root/
root@10.0.0.7's password: 
bash: rsync: command not found
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: remote command not found (code 127) at io.c(226) [sender=3.1.2]
原因:
使用rsync传输,需要两边机器都安装有rsync软件
yum install rsync -y

2.报错2

[root@web-7 ~] # rsync -avz /root/111.txt rsync_backup@10.0.0.41::backup
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]
原因:
密码文件里的虚拟用户名写错了

3.报错3

[root@web-7 ~]# rsync -avz /root/web-7.txt rsync_backup@10.0.0.41::backup
rsync: failed to connect to 10.0.0.41 (10.0.0.41): Connection refused (111)
rsync error: error in socket IO (code 10) at clientserver.c(125) [sender=3.1.2]
原因:
服务端启动命令出错,少加了d
systemctl start rsyncd

4.报错4

[root@web-7 ~]#rsync -avz /root/web-7.txt rsync_backup@10.0.0.41::backup
@ERROR: Unknown module 'backup'
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]
原因:
[root@backup-41 ~]#cat /etc/rsyncd.conf 
cat > /etc/rsyncd.conf << 'EOF'
uid = www 
gid = www 
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
#省略部分信息


复制粘贴没有看清楚,直接一把梭了

5.报错5

[root@web-7 ~]# rsync -avz /root/a/123.txt rsync_backup@10.0.0.41::backup
Password: 
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]
原因:
客户端没有配置密码
客户端密码出错

6.报错6

[root@web-7 ~]# export RSYNC_PASSWORD=oldboy
[root@web-7 ~]# rsync -avz /root/456.txt  rsync_backup@10.0.0.41::backup
@ERROR: Unknown module 'backup'
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]
原因:
#####################################
##[backup]
##comment = welcome to oldboyedu backup!
##path = /backup
##
##[data]
##path = /data
#
[root@backup-41 ~]# cat /etc/rsync.passwd
cat: /etc/rsync.passwd: No such file or directory

1.配置文件注释有问题
2.没有创建密码文件

7.报错7

[root@ceisi tmp]# rsync -avzP /tmp/wordpress rsync_backup@10.0.0.7::backup
rsync: failed to connect to 10.0.0.7 (10.0.0.7): No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(125) [sender=3.1.2]
原因:
#防火墙没有关闭
[root@backup ~]# iptables -nL
[root@backup ~]# systemctl stop firewalld.service

第七章 rsync服务模式实战

1.客户端推送 /backup⽬录下所有内容⾄rsync服务端

export RSYNC_PASSWORD=oldboy
rsync -avz /backup/ rsync_backup@172.16.1.41::backup

2.客户端拉取rsync服务端backup模块数据⾄本地客户端的/backup⽬录

export RSYNC_PASSWORD=oldboy123
rsync -avz rsync_backup@172.16.1.41::backup /backup/

3.rsync 实现数据⽆差异同步

#拉取远端数据:远端与本地保持⼀致,远端没有本地有会被删除, 造成客户端数据丢失
export RSYNC_PASSWORD=oldboy
rsync -avz --delete rsync_backup@172.16.1.41::backup /data/

#推送数据⾄远端:本地与远端保持⼀致, 本地没有远端会被删除, 造成服务器端数据丢失
export RSYNC_PASSWORD=oldboy
rsync -avz --delete /data/ rsync_backup@172.16.1.41::backup

4.rsync的 Limit 限速

#企业案例: 某 DBA 使⽤ rsync 拉取备份数据时,由于⽂件过⼤导致内部交换机带宽被沾满,导致⽤户的请求⽆法响应

export RSYNC_PASSWORD=oldboy
rsync -avz --bwlimit=1 rsync_backup@172.16.1.41::backup /data/

第八章 全网备份项目

<<每日备份任务需求>>

客户端需求:

1.客户端每天凌晨1点在服务器本地打包备份(/etc目录和/var/log目录) ;
2.客户端备份的数据必须存放至以 "主机名_ip地址_当前时间" 命名的目录中;
3.客户端最后通过rsync推送本地已经打包好的备份文件至backup服务器 ;
4.客户端服务器本地保留最近7天的数据,避免浪费磁盘空间.

服务端需求:

1.服务端部署rsync,用于接收客户端推送过来的备份数据 ;
2.服务端需要每天校验客户端推送过来的数据是否完整; 
3.服务端需要每天校验的结果通知给管理员 ;
4.服务端仅保留6个月的备份数据,其余的全部删除 ;
注意:所有服务器的备份目录必须都为/backup;

<< 解决方案思路如下:将多个任务需求进行拆分 >>

A:客户端需求拆解

1.打包备份

客户端每天凌晨1点在服务器本地打包备份(/etc目录和/var/log目录)

cd /
tar zcvf etc.tar.gz etc 
tar zcvf log.tar.gz var/log 
2.目录命名

客户端备份的数据必须存放至以 "主机名ip地址当前时间" 命名的目录中,期望的结果:

web-7_172.16.1.7_2021-04-21
命令拆解:
主机名: hostname
ip地址: ifconfig eth1|awk 'NR==2{print $2}'
当前时间: date +%F
命令拼接:
mkdir -p /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F)

3.文件传输

rsync -avz /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F) rsync_backup@172.16.1.41::backup

4.删除过期文件

find /backup -mtime +7 |xargs rm -rf

5.最终脚本

现在shell里面运行:

mkdir -p /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F)
cd /
tar zcvf /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F)/etc.tar.gz etc 
tar zcvf /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F)/log.tar.gz var/log 
rsync -avz /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F) rsync_backup@172.16.1.41::backup
find /backup -mtime +7 |xargs rm -rf

然后再写入脚本,注意,要添加注释:

6.最终客户端备份脚本

[root@ceisi scripts]# vim back_cm.sh 
#!/bin/bash

#time:2021-04-21  name: date_backup  by:tan
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
export RSYNC_PASSWORD=oldboy123

#1.创建备份目录
mkdir /backup/ -p

#2.本地打包备份
cd /
tar -cf backup/$(hostname)_$(ifconfig eth0|awk 'NR==2{print $2}')_$(date +%F).etc.tar.gz etc
tar -cf backup/$(hostname)_$(ifconfig eth0|awk 'NR==2{print $2}')_$(date +%F).log.tar.gz var/log

#3.将打包文件生成指纹件
md5sum /backup/*.tar.gz >/backup/$(hostname)_$(ifconfig eth0|awk 'NR==2{print $2}')_$(date +%F).finger.txt

#4.将本地备份文件推送到备份服务器 
rsync -az /backup/$(hostname)_$(ifconfig eth0|awk 'NR==2{print $2}')_$(date +%F).finger.txt rsync_backup@10.0.0.200::backup
rsync -az /backup/*.tar.gz rsync_backup@10.0.0.200::backup

#5.保留最近7天的数据
find /backup/ -time +7|xargs rm -rf

7.客户端定时任务

[root@ceisi scripts]# crontab -l
#time sync by oldboy at 2021-01-24
* * * * * /usr/sbin/ntpdate time1.aliyun.com >/dev/null 2>&1

#数据备份
#time=2021-04-21  by=tan
00 01 * * * /bin/bash /server/scripts/back_cm.sh 2>&1

B.服务端需求拆解

1.服务部署

服务端部署rsync,用于接收客户端推送过来的备份数据

#!/bin/bash
yum install rsync -y
cat > /etc/rsyncd.conf << 'EOF'
uid = www 
gid = www 
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
EOF
useradd -u 1000 -M -s /sbin/nologin www
mkdir -p /{backup,data}
chown -R www:www /{backup,data}
echo "rsync_backup:oldboy" > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
systemctl start rsyncd

2.校验数据完整性

服务端需要每天校验客户端推送过来的数据是否完整

3.邮件通知

#1.安装配置mailx:
yum install mailx -y

#2.邮箱配置文件
cat > /etc/mail.rc << 'EOF' 
set from=526195417@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=526195417@qq.com
set smtp-auth-password=xxxxxxxx
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
EOF

#3.服务端生成校验结果文件:
md5sum -c /backup/md5.txt > /backup/check.txt

#4.校验发送命令
mail -s "check-rsync-$(date +%F)" 526195417@qq.com < /backup/check.txt

4.删除过期文件

find /backup -mtime +180 |xargs rm -rf

5.最终服务端检查备份脚本

#!/bin/bash

#time:2021-04-21   name:check_backup    by:tan
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

#1.部署rsync服务
#bash /server/scripts/rsync_sv.sh

#2.校验客户端推送过来的数据是否完整 
md5sum -c /backup/ceisi_10.0.0.100_$(date +%F).finger.txt >/backup/check.txt

#3.每天校验的结果邮件通知
mail -s "$(date +%F)_log" 1987623828@qq.com </backup/check.txt

#4.仅保留6个月的备份数据,其余的全部删除 
find /backup/ -mtime +180|xargs rm -rf 

6.服务端检查备份定时任务

[root@oldboy scripts]# crontab  -l
#time sync by oldboy at 2021-01-24
* * * * * /usr/sbin/ntpdate time1.aliyun.com >/dev/null 2>&1

#检查备份数据是否完整 
#time:2012-04-21   by:tan
00 01 * * * /bin/bash /server/scripts/check_backup.sh 2>&1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容