一,RSYNC
1)RSYNC本地模式
--类似cp命令
[root@web01 ~]# touch 121.txt
[root@web01 ~]# rsync 121.txt /opt/
[root@web01 ~]# ll /opt/
-rw-r--r-- 1 root root 0 2020-08-23 14:08 121.txt
二)RSYNC远程模式
--类似于scp命令
[root@web01 ~]# rsync 121.txt [email protected]:/backup/
[email protected]'s password:
[root@backup ~]# ll /backup/
-rw-r--r-- 1 root root 0 2020-08-24 15:49 121.txt
(需要知道对方的用户及密码,不安全)
三)RSYNC守护进程模式 -(注意模块是双冒号)
服务端:
[root@backup ~]# yum install -y rsync(客户端,服务端都需要安装)
##修改配置文件(每一个服务下载好的第一件事就是配置文件修改)
[root@backup ~]# vim /etc/rsyncd.conf
uid = rsync 启动用户uid
gid = rsync 启动用户gid
port = 873 端口
fake super = yes 可以不使用超级用户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 虚拟用户密码文件
log file = /var/log/rsyncd.log
#####################################
[backup] 模块
comment = welcome to zx's backup! 备注
path = /backup 真实文件目录
(下面三行复制过去记得把注释去掉)
配置文件完善配置信息
1,##新建用户rsync
[root@backup ~]# useradd rsync -s /sbin/nologin -M
2,## 虚拟用户设置密码
[root@backup ~]# echo "rsync_backup:123456" > /etc/rsyncd.passwd
##设置权限
[root@backup ~]# chmod 600 /etc/rsyncd.passwd
3,##建backup目录,设置属主,属组
[root@backup ~]# mkdir /backup
[root@backup ~]# chown -R rsync.rsync /backup/
4,## 启动服务
[root@backup ~]# systemctl start rsyncd
## 查看服务是否运行(运维的好习惯要养成)
[root@backup ~]# ps -ef|grep rsyncd
root 7554 7124 0 13:53 pts/0 00:00:00 grep --color=auto rsyncd
5,## 查看端口
[root@backup ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 7548/rsync
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 5398/rpcbind
tcp6 0 0 :::873 :::* LISTEN 7548/rsync
tcp6 0 0 :::111 :::* LISTEN 5398/rpcbind
客户端
[root@web01 ~]# yum install -y rsync
[root@web01 ~]# echo "123456" > /etc/rsync.passwd
[root@web01 ~]# chmod 600 /etc/rsync.passwd
第一种,输入密码
拉:
[root@web01 ~]# rsync -avz [email protected]::backup /opt
Password:
receiving incremental file list
./
aaa/
第二种,--passwd-file=/etc/rsync.passwd
推:
[root@web01 ~]# rsync -avz 11.txt [email protected]::backup --password-file=/etc/rsyncd.passwd
第三种,配置环境变量
export RSYNC_PASSWORD=123456 (临时生效)
[root@web01 ~]# export RSYNC_PASSWORD=123456
[root@web01 ~]# rsync -avz [email protected]::backup /opt
receiving incremental file list
sent 25 bytes received 115 bytes 31.11 bytes/sec
total size is 0 speedup is 0.00
限速参数:-avzP --bwlimit
生成大文件-->
dd if=/dev/zero of=./1.txt bs=1M count=500
dd if=/dev/zero生出源源不断的字符
of=./1.txt bs=1M 到哪个文件里,多大的速率传输
count=500 生成的文件是500兆
限速 --为什么不限速
[root@web01 ~]# rsync -avzP --bwlimit 1 ./1.txt [email protected]::backup
sending incremental file list
1.txt
256,000 100% 212.89MB/s 0:00:00 (xfr#1, to-chk=0/1)
sent 355 bytes received 43 bytes 796.00 bytes/sec
total size is 256,000 speedup is 643.22
数据一致参数:--delete
## 服务端backup下创建文件
[root@backup ~]# touch /backup/{1..5}.txt
[root@backup ~]# ll /backup/
总用量 0
-rw-r--r-- 1 root root 0 2020-08-19 16:02 1.txt
-rw-r--r-- 1 root root 0 2020-08-19 16:02 2.txt
-rw-r--r-- 1 root root 0 2020-08-19 16:02 3.txt
-rw-r--r-- 1 root root 0 2020-08-19 16:02 4.txt
-rw-r--r-- 1 root root 0 2020-08-19 16:02 5.txt
## 客户端创建文件
[root@web01 ~]# touch {a..d}.txt
[root@web01 ~]# ll
总用量 0
-rw-r--r-- 1 root root 0 2020-08-19 16:03 a.txt
-rw-r--r-- 1 root root 0 2020-08-19 16:03 b.txt
-rw-r--r-- 1 root root 0 2020-08-19 16:03 c.txt
-rw-r--r-- 1 root root 0 2020-08-19 16:03 d.txt
客户端推:
[root@web01 ~]# rsync -avz --delete ./ [email protected]::backup
a.txt
b.txt
c.txt
d.txt
## 查看服务端backup目录下的文件
[root@backup ~]# ll /backup/
-rw-r--r-- 1 rsync rsync 0 2020-08-19 16:03 a.txt
-rw-r--r-- 1 rsync rsync 0 2020-08-19 16:03 b.txt
-rw-r--r-- 1 rsync rsync 0 2020-08-19 16:03 c.txt
-rw-r--r-- 1 rsync rsync 0 2020-08-19 16:03 d.txt
(与客户端同步,并删除了本身目录下的文件)
客户端需求:
客户端需求
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天的数据, 避免浪费磁盘空间
脚本准备
[root@web01 ~]# hostname -I|awk '{print $1}'
172.16.1.7
[root@web01 ~]# date +%F
2020-08-19
[root@web01 ~]# echo `hostname`_`hostname -I|awk '{print $1}'`_`date +%F`
web01_172.16.1.7_2020-08-19
##打包备份到目录
[root@web01 ~]# cd /backup/
[root@web01 backup]# cd `hostname`_`hostname -I|awk '{print $1}'`_`date +%F`
[root@web01 web01_172.16.1.7_2020-08-19]# tar -zcf date.tar.gz /var/log/messages
[root@web01 web01_172.16.1.7_2020-08-19]# ll
总用量 108
-rw-r--r-- 1 root root 109347 2020-08-19 16:26 date.tar.gz
## 推送文件
[root@web01 ~]# rsync -avz /backup/`hostname`_`hostname -I|awk '{print $1}'`_`date +%F` [email protected]::backup
sending incremental file list
web01_172.16.1.7_2020-08-19/
web01_172.16.1.7_2020-08-19/date.tar.gz
sent 104,150 bytes received 47 bytes 10,968.11 bytes/sec
total size is 109,347 speedup is 1.05
写脚本:
[root@web01 ~]# mkdir /scripts
[root@web01 ~]# vim /scripts/client.sh
#!bin/bash
#1,创建备份目录
mkdir -p /backup/`hostname`_`hostname -I|awk '{print $1}'`_`date +%F`
#2,打包备份文件
cd /backup/`hostname`_`hostname -I|awk '{print $1}'`_`date +%F`
tar -zcf date.tar.gz /var/log/messages
#3,推送文件
rsync -avz /backup/`hostname`_`hostname -I|awk '{print $1}'`_`date +%F` [email protected]::backup
~
[root@web01 ~]# sh /scripts/client.sh
tar: 从成员名中删除开头的“/”
sending incremental file list
web01_172.16.1.7_2020-08-19/date.tar.gz
sent 99,536 bytes received 986 bytes 201,044.00 bytes/sec
total size is 109,361 speedup is 1.09
##可以执行,但是脚本太low,以下设置变量##
优化后的脚本如下:
[root@web01 ~]# vim /scripts/client.sh
#!bin/bash
DIR=/backup
HOST=`hostname`
IP=`hostname`_`hostname -I|awk '{print $1}'`
DATE=`date +%F`
SRC=${DIR}/${HOST}_${IP}_${DATE}
#1,创建备份目录
mkdir -p $SRC
#2,打包备份文件
cd $SRC
tar -zcf date.tar.gz /var/log/messages
#3,推送文件
rsync -avz $SRC [email protected]::backup
##生出30天的数据
[root@web01 ~]# for i in {1..30};do date -s 2020/08/$i;sh /scripts/client.sh ;done
##改时间,为了验证数据
[root@web01 ~]# date -s 2020/9/1
2020年 09月 01日 星期二 00:00:00 CST
## 删除7天前数据
[root@web01 ~]# find /backup/ -type d -mtime +7|xargs rm -rf
[root@web01 ~]# ll /backup/
drwxr-xr-x 2 root root 25 2020-08-25 00:00 web01_172.16.1.7_2020-08-25
drwxr-xr-x 2 root root 25 2020-08-26 00:00 web01_172.16.1.7_2020-08-26
drwxr-xr-x 2 root root 25 2020-08-27 00:00 web01_172.16.1.7_2020-08-27
drwxr-xr-x 2 root root 25 2020-08-28 00:00 web01_172.16.1.7_2020-08-28
drwxr-xr-x 2 root root 25 2020-08-29 00:00 web01_172.16.1.7_2020-08-29
drwxr-xr-x 2 root root 25 2020-08-30 00:00 web01_172.16.1.7_2020-08-30
最终脚本:
[root@web01 ~]# vim /scripts/client.sh
#!bin/bash
DIR=/backup
HOST=`hostname`
IP=`hostname -I|awk '{print $1}'`
DATE=`date +%F`
SRC=${DIR}/${HOST}_${IP}_${DATE}
#1,创建备份目录
mkdir -p $SRC
#2,打包备份文件
cd $SRC
tar -zcf date.tar.gz /var/log/messages
#3, 添加校验文件
md5sum ${DIR}/${HOST}_${IP}_${DATE}/date.tar.gz > $SRC/check.txt#4,推送文件
rsync -avz $SRC [email protected]::backup
#5, 保留7天数据
find /backup/ -type d -mtime +7|xargs rm -rf
~
服务端:
服务端需求
1.服务端部署rsync,用于接收客户端推送过来的备份数据
2.服务端需要每天校验客户端推送过来的数据是否完整
3.服务端需要每天校验的结果通知给管理员
4.服务端仅保留6个月的备份数据,其余的全部删除[root@backup ~]# mkdir /scripts/
[root@backup ~]# vim /scripts/severs.sh
#!bin/bash
DIR=/backup
HOST=`hostname`
IP=`hostname -I|awk '{print $1}'`
DATE=`date +%F`
SRC=${DIR}/${HOST}_${IP}_${DATE}
#1,校验文件完整性
md5sum -c ${DIR}/*_${DATE}/check.txt
[root@backup ~]# sh /scripts/severs.sh
/backup/web01_172.16.1.7_2020-08-20/date.tar.gz: 确定
上一步前可能会有报错,如:
[root@backup ~]# sh /scripts/severs.sh
md5sum: /backup/*_2020-08-20/check.txt: 没有那个文件或目录
解决办法:
检查web端是否执行新的脚本;
删除/backup目录下的所有文件,重新生成30天数据;
也可单独执行查找哪里出错
[root@backup ~]# md5sum -c /backup/web01_172.16.1.7_2020-08-30/check.txt
/backup/web01_172.16.1.7_2020-08-30/date.tar.gz: 确定
[root@web01 ~]# crontab -e
#每天凌晨1点备份数据
00 01 * * * /bin/bash /scripts/cilent.sh &>/dev/null
##服务端下载邮箱
[root@backup ~]# yum install -y mailx
## 配置文件修改
[root@backup ~]# vim /etc/mail.rc
set smtp=smtps://smtp.qq.com:465
set smtp-auth-password=***
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
~
最终脚本更新为
[root@backup ~]# vim /scripts/severs.sh
#!bin/bash
DIR=/backup
HOST=`hostname`
IP=`hostname -I|awk '{print $1}'`
DATE=`date +%F`
SRC=${DIR}/${HOST}_${IP}_${DATE}
#1,校验文件完整性
md5sum -c ${DIR}/*_${DATE}/check.txt > ${DIR}/result.txt
#2,将验证结果发送给管理员邮箱
mail -s "数据校验结果" @qq.com < ${DIR}/result.txt
#3,删除180天数据
find /backup/ -type -d -mtime +180 | xgars rm -rf
[root@backup ~]# sh /scripts/severs.sh
就能收到邮箱的校验结果
二,rsync结合inotify,实时监控
安装在客户端(需要备份的服务器上)
[root@web01 ~]# yum install -y inotify-tools
[root@web01 ~]# vim rsyn-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 ./* [email protected]::backup --password-file=/etc/rsync.passwd >/dev/null 2>&1
done &
~
### 写入脚本里
[root@web01 ~]# vim /scripts/inotify.sh
#!/bin/bash
export RSYNC_PASSWORD=123456
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 ./* [email protected]::backup >/dev/null 2>&1
done &
## 执行
[root@web01 ~]# sh /scripts/inotify.sh
## 实验
在web的backup里创建
到backup服务器到backup目录下查看
[root@web01 ~]# cd /backup/
[root@web01 backup]# touch 33.txt
[root@backup backup]# ll
-rw-r--r-- 1 rsync rsync 0 2020-08-24 15:20 33.txt
三,NFS 实战
服务端:
1,##防火墙,selinux关闭
[root@nfs ~]# systemctl stop firewalld
[root@nfs ~]# systemctl disable firewalld
[root@nfs ~]# vim /etc/selinux/config
SELINUX=enforcing 改为 SELINUX=disable 或
sed -i 's#SELINUX=enforcing#SELINUX=disable#' /etc/selinux/config
setenforce 0临时关闭
2,## 安装
[root@nfs ~]# yum install -y nfs-utils rpcbind
3,##设置配置
[root@nfs ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)
3,## 主,组设置
[root@nfs ~]# chown -R nfsnobody.nfsnobody /date
[root@nfs ~]# id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) 组=65534(nfsnobody)
##启动服务
[root@nfs ~]# systemctl start rpcbind nfs-server
## 检查是否运行
[root@nfs ~]# ps -ef|grep nfs
##验证
[root@nfs ~]# cat /var/lib/nfs/etab
/data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,all_squash)
(如果配置设置错了,cat不出任何内容)
客户端:
##关闭防火墙和selinux
[root@web01 ~]# systemctl stop firewalld
[root@web01 ~]# systemctl diasble firewalld
[root@web01 ~]# vim /etc/selinux/config
[root@web01 ~]# setenforce
usage: setenforce [ Enforcing | Permissive | 1 | 0 ]
##下载(下载nfs只为了showmount)
[root@web01 ~]# yum install -y nfs-utils rpcbind
## 查看挂载点
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/date 172.16.1.0/24
##启动服务并挂载
[root@web01 ~]# systemctl start rpcbind
[root@web01 ~]# mount -t nfs 172.16.1.31:/date /backup/
[root@web01 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 19G 1.2G 18G 7% /
devtmpfs 476M 0 476M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.7M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 497M 120M 378M 25% /boot
tmpfs 98M 0 98M 0% /run/user/0
172.16.1.31:/date 19G 1.2G 18G 7% /backup
测试
客户端:
[root@web01 ~]# cd /backup/
[root@web01 backup]# ll
总用量 0
[root@web01 backup]# touch 1.txt
服务端:
[root@nfs ~]# ll /date/
总用量 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 2020-08-24 13:03 1.txt